From d8ca580acb3cd5005eb3aa2c55074638a932c29f Mon Sep 17 00:00:00 2001 From: bigtux Date: Mon, 9 Feb 2026 14:53:01 -0300 Subject: [PATCH] =?UTF-8?q?HEFESTO=20v1.0=20-=20Sistema=20de=20Controle=20?= =?UTF-8?q?Or=C3=A7ament=C3=A1rio=20para=20Facilities?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Backend NestJS com 12 módulos - Frontend React com dashboard e gestão - Manuais técnico e de negócios (MD + PDF) - Workflow de aprovação com alçadas - RBAC com 6 perfis de acesso --- .gitignore | 7 + backend/.prettierrc | 4 + backend/README.md | 98 + backend/eslint.config.mjs | 35 + backend/nest-cli.json | 8 + backend/package-lock.json | 11057 ++++++++++++++++ backend/package.json | 86 + backend/src/app.module.ts | 61 + .../src/common/decorators/roles.decorator.ts | 3 + backend/src/common/guards/jwt-auth.guard.ts | 19 + backend/src/common/guards/roles.guard.ts | 19 + backend/src/database/seeds/seed.service.ts | 249 + backend/src/main.ts | 18 + backend/src/modules/auth/auth.controller.ts | 20 + backend/src/modules/auth/auth.module.ts | 24 + backend/src/modules/auth/auth.service.ts | 63 + backend/src/modules/auth/jwt.strategy.ts | 24 + .../categorias/categorias.controller.ts | 13 + .../modules/categorias/categorias.module.ts | 13 + .../modules/categorias/categorias.service.ts | 14 + .../categorias/entities/categoria.entity.ts | 31 + .../centros-custo/centros-custo.controller.ts | 13 + .../centros-custo/centros-custo.module.ts | 13 + .../centros-custo/centros-custo.service.ts | 14 + .../entities/centro-custo.entity.ts | 25 + .../modules/dashboard/dashboard.controller.ts | 13 + .../src/modules/dashboard/dashboard.module.ts | 19 + .../modules/dashboard/dashboard.service.ts | 73 + .../dashboard/entities/alerta.entity.ts | 31 + .../dashboard/entities/audit-log.entity.ts | 34 + .../modules/demandas/demandas.controller.ts | 27 + .../src/modules/demandas/demandas.module.ts | 14 + .../src/modules/demandas/demandas.service.ts | 35 + .../demandas/entities/demanda.entity.ts | 53 + .../demandas/entities/item-linha.entity.ts | 36 + .../fornecedores/entities/certidao.entity.ts | 36 + .../entities/fornecedor.entity.ts | 50 + .../fornecedores/fornecedores.controller.ts | 18 + .../fornecedores/fornecedores.module.ts | 14 + .../fornecedores/fornecedores.service.ts | 22 + .../modules/locais/entities/local.entity.ts | 28 + .../src/modules/locais/locais.controller.ts | 13 + backend/src/modules/locais/locais.module.ts | 13 + backend/src/modules/locais/locais.service.ts | 14 + .../entities/orcamento-planejado.entity.ts | 34 + .../modules/orcamento/orcamento.controller.ts | 13 + .../src/modules/orcamento/orcamento.module.ts | 13 + .../modules/orcamento/orcamento.service.ts | 33 + .../entities/avaliacao.entity.ts | 25 + .../entities/ordem-servico.entity.ts | 40 + .../ordens-servico.controller.ts | 17 + .../ordens-servico/ordens-servico.module.ts | 14 + .../ordens-servico/ordens-servico.service.ts | 23 + .../propostas/entities/proposta.entity.ts | 52 + .../modules/propostas/propostas.controller.ts | 18 + .../src/modules/propostas/propostas.module.ts | 13 + .../modules/propostas/propostas.service.ts | 23 + .../modules/users/entities/perfil.entity.ts | 26 + .../modules/users/entities/usuario.entity.ts | 36 + backend/src/modules/users/users.controller.ts | 25 + backend/src/modules/users/users.module.ts | 14 + backend/src/modules/users/users.service.ts | 20 + .../entities/workflow-aprovacao.entity.ts | 37 + .../modules/workflow/workflow.controller.ts | 14 + .../src/modules/workflow/workflow.module.ts | 13 + .../src/modules/workflow/workflow.service.ts | 51 + backend/test/app.e2e-spec.ts | 25 + backend/test/jest-e2e.json | 9 + backend/tsconfig.build.json | 4 + backend/tsconfig.json | 25 + docs/ARQUITETURA-TECNICA.md | 1104 ++ docs/ESPECIFICACAO-FUNCIONAL.pdf | Bin 0 -> 87409 bytes docs/MANUAL-NEGOCIOS.md | 304 + docs/MANUAL-NEGOCIOS.pdf | Bin 0 -> 77287 bytes docs/MANUAL-TECNICO.md | 508 + docs/MANUAL-TECNICO.pdf | Bin 0 -> 104621 bytes docs/PESQUISA-MERCADO.md | 105 + frontend/.gitignore | 24 + frontend/README.md | 16 + frontend/eslint.config.js | 29 + frontend/index.html | 17 + frontend/package-lock.json | 4210 ++++++ frontend/package.json | 35 + frontend/public/favicon.svg | 10 + frontend/public/vite.svg | 1 + frontend/src/App.tsx | 39 + frontend/src/assets/react.svg | 1 + frontend/src/components/Layout.tsx | 255 + frontend/src/index.css | 282 + frontend/src/main.tsx | 13 + frontend/src/pages/Dashboard.tsx | 297 + frontend/src/pages/Demandas.tsx | 310 + frontend/src/pages/Fornecedores.tsx | 306 + frontend/src/pages/Landing.tsx | 253 + frontend/src/pages/Login.tsx | 172 + frontend/src/pages/Orcamentos.tsx | 254 + frontend/src/pages/OrdensServico.tsx | 216 + frontend/src/pages/Relatorios.tsx | 279 + frontend/src/pages/Usuarios.tsx | 357 + frontend/src/services/api.ts | 27 + frontend/src/types/index.ts | 82 + frontend/src/vite-env.d.ts | 1 + frontend/tsconfig.json | 27 + frontend/tsconfig.node.json | 10 + frontend/vite.config.ts | 16 + start-backend.sh | 3 + start-frontend.sh | 3 + 107 files changed, 22657 insertions(+) create mode 100644 .gitignore create mode 100644 backend/.prettierrc create mode 100644 backend/README.md create mode 100644 backend/eslint.config.mjs create mode 100644 backend/nest-cli.json create mode 100644 backend/package-lock.json create mode 100644 backend/package.json create mode 100644 backend/src/app.module.ts create mode 100644 backend/src/common/decorators/roles.decorator.ts create mode 100644 backend/src/common/guards/jwt-auth.guard.ts create mode 100644 backend/src/common/guards/roles.guard.ts create mode 100644 backend/src/database/seeds/seed.service.ts create mode 100644 backend/src/main.ts create mode 100644 backend/src/modules/auth/auth.controller.ts create mode 100644 backend/src/modules/auth/auth.module.ts create mode 100644 backend/src/modules/auth/auth.service.ts create mode 100644 backend/src/modules/auth/jwt.strategy.ts create mode 100644 backend/src/modules/categorias/categorias.controller.ts create mode 100644 backend/src/modules/categorias/categorias.module.ts create mode 100644 backend/src/modules/categorias/categorias.service.ts create mode 100644 backend/src/modules/categorias/entities/categoria.entity.ts create mode 100644 backend/src/modules/centros-custo/centros-custo.controller.ts create mode 100644 backend/src/modules/centros-custo/centros-custo.module.ts create mode 100644 backend/src/modules/centros-custo/centros-custo.service.ts create mode 100644 backend/src/modules/centros-custo/entities/centro-custo.entity.ts create mode 100644 backend/src/modules/dashboard/dashboard.controller.ts create mode 100644 backend/src/modules/dashboard/dashboard.module.ts create mode 100644 backend/src/modules/dashboard/dashboard.service.ts create mode 100644 backend/src/modules/dashboard/entities/alerta.entity.ts create mode 100644 backend/src/modules/dashboard/entities/audit-log.entity.ts create mode 100644 backend/src/modules/demandas/demandas.controller.ts create mode 100644 backend/src/modules/demandas/demandas.module.ts create mode 100644 backend/src/modules/demandas/demandas.service.ts create mode 100644 backend/src/modules/demandas/entities/demanda.entity.ts create mode 100644 backend/src/modules/demandas/entities/item-linha.entity.ts create mode 100644 backend/src/modules/fornecedores/entities/certidao.entity.ts create mode 100644 backend/src/modules/fornecedores/entities/fornecedor.entity.ts create mode 100644 backend/src/modules/fornecedores/fornecedores.controller.ts create mode 100644 backend/src/modules/fornecedores/fornecedores.module.ts create mode 100644 backend/src/modules/fornecedores/fornecedores.service.ts create mode 100644 backend/src/modules/locais/entities/local.entity.ts create mode 100644 backend/src/modules/locais/locais.controller.ts create mode 100644 backend/src/modules/locais/locais.module.ts create mode 100644 backend/src/modules/locais/locais.service.ts create mode 100644 backend/src/modules/orcamento/entities/orcamento-planejado.entity.ts create mode 100644 backend/src/modules/orcamento/orcamento.controller.ts create mode 100644 backend/src/modules/orcamento/orcamento.module.ts create mode 100644 backend/src/modules/orcamento/orcamento.service.ts create mode 100644 backend/src/modules/ordens-servico/entities/avaliacao.entity.ts create mode 100644 backend/src/modules/ordens-servico/entities/ordem-servico.entity.ts create mode 100644 backend/src/modules/ordens-servico/ordens-servico.controller.ts create mode 100644 backend/src/modules/ordens-servico/ordens-servico.module.ts create mode 100644 backend/src/modules/ordens-servico/ordens-servico.service.ts create mode 100644 backend/src/modules/propostas/entities/proposta.entity.ts create mode 100644 backend/src/modules/propostas/propostas.controller.ts create mode 100644 backend/src/modules/propostas/propostas.module.ts create mode 100644 backend/src/modules/propostas/propostas.service.ts create mode 100644 backend/src/modules/users/entities/perfil.entity.ts create mode 100644 backend/src/modules/users/entities/usuario.entity.ts create mode 100644 backend/src/modules/users/users.controller.ts create mode 100644 backend/src/modules/users/users.module.ts create mode 100644 backend/src/modules/users/users.service.ts create mode 100644 backend/src/modules/workflow/entities/workflow-aprovacao.entity.ts create mode 100644 backend/src/modules/workflow/workflow.controller.ts create mode 100644 backend/src/modules/workflow/workflow.module.ts create mode 100644 backend/src/modules/workflow/workflow.service.ts create mode 100644 backend/test/app.e2e-spec.ts create mode 100644 backend/test/jest-e2e.json create mode 100644 backend/tsconfig.build.json create mode 100644 backend/tsconfig.json create mode 100644 docs/ARQUITETURA-TECNICA.md create mode 100644 docs/ESPECIFICACAO-FUNCIONAL.pdf create mode 100644 docs/MANUAL-NEGOCIOS.md create mode 100644 docs/MANUAL-NEGOCIOS.pdf create mode 100644 docs/MANUAL-TECNICO.md create mode 100644 docs/MANUAL-TECNICO.pdf create mode 100644 docs/PESQUISA-MERCADO.md create mode 100644 frontend/.gitignore create mode 100644 frontend/README.md create mode 100644 frontend/eslint.config.js create mode 100644 frontend/index.html create mode 100644 frontend/package-lock.json create mode 100644 frontend/package.json create mode 100644 frontend/public/favicon.svg create mode 100644 frontend/public/vite.svg create mode 100644 frontend/src/App.tsx create mode 100644 frontend/src/assets/react.svg create mode 100644 frontend/src/components/Layout.tsx create mode 100644 frontend/src/index.css create mode 100644 frontend/src/main.tsx create mode 100644 frontend/src/pages/Dashboard.tsx create mode 100644 frontend/src/pages/Demandas.tsx create mode 100644 frontend/src/pages/Fornecedores.tsx create mode 100644 frontend/src/pages/Landing.tsx create mode 100644 frontend/src/pages/Login.tsx create mode 100644 frontend/src/pages/Orcamentos.tsx create mode 100644 frontend/src/pages/OrdensServico.tsx create mode 100644 frontend/src/pages/Relatorios.tsx create mode 100644 frontend/src/pages/Usuarios.tsx create mode 100644 frontend/src/services/api.ts create mode 100644 frontend/src/types/index.ts create mode 100644 frontend/src/vite-env.d.ts create mode 100644 frontend/tsconfig.json create mode 100644 frontend/tsconfig.node.json create mode 100644 frontend/vite.config.ts create mode 100755 start-backend.sh create mode 100755 start-frontend.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d993932 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +node_modules/ +dist/ +.next/ +database.sqlite +*.sqlite +.env +*.db diff --git a/backend/.prettierrc b/backend/.prettierrc new file mode 100644 index 0000000..a20502b --- /dev/null +++ b/backend/.prettierrc @@ -0,0 +1,4 @@ +{ + "singleQuote": true, + "trailingComma": "all" +} diff --git a/backend/README.md b/backend/README.md new file mode 100644 index 0000000..8f0f65f --- /dev/null +++ b/backend/README.md @@ -0,0 +1,98 @@ +

+ Nest Logo +

+ +[circleci-image]: https://img.shields.io/circleci/build/github/nestjs/nest/master?token=abc123def456 +[circleci-url]: https://circleci.com/gh/nestjs/nest + +

A progressive Node.js framework for building efficient and scalable server-side applications.

+

+NPM Version +Package License +NPM Downloads +CircleCI +Discord +Backers on Open Collective +Sponsors on Open Collective + Donate us + Support us + Follow us on Twitter +

+ + +## Description + +[Nest](https://github.com/nestjs/nest) framework TypeScript starter repository. + +## Project setup + +```bash +$ npm install +``` + +## Compile and run the project + +```bash +# development +$ npm run start + +# watch mode +$ npm run start:dev + +# production mode +$ npm run start:prod +``` + +## Run tests + +```bash +# unit tests +$ npm run test + +# e2e tests +$ npm run test:e2e + +# test coverage +$ npm run test:cov +``` + +## Deployment + +When you're ready to deploy your NestJS application to production, there are some key steps you can take to ensure it runs as efficiently as possible. Check out the [deployment documentation](https://docs.nestjs.com/deployment) for more information. + +If you are looking for a cloud-based platform to deploy your NestJS application, check out [Mau](https://mau.nestjs.com), our official platform for deploying NestJS applications on AWS. Mau makes deployment straightforward and fast, requiring just a few simple steps: + +```bash +$ npm install -g @nestjs/mau +$ mau deploy +``` + +With Mau, you can deploy your application in just a few clicks, allowing you to focus on building features rather than managing infrastructure. + +## Resources + +Check out a few resources that may come in handy when working with NestJS: + +- Visit the [NestJS Documentation](https://docs.nestjs.com) to learn more about the framework. +- For questions and support, please visit our [Discord channel](https://discord.gg/G7Qnnhy). +- To dive deeper and get more hands-on experience, check out our official video [courses](https://courses.nestjs.com/). +- Deploy your application to AWS with the help of [NestJS Mau](https://mau.nestjs.com) in just a few clicks. +- Visualize your application graph and interact with the NestJS application in real-time using [NestJS Devtools](https://devtools.nestjs.com). +- Need help with your project (part-time to full-time)? Check out our official [enterprise support](https://enterprise.nestjs.com). +- To stay in the loop and get updates, follow us on [X](https://x.com/nestframework) and [LinkedIn](https://linkedin.com/company/nestjs). +- Looking for a job, or have a job to offer? Check out our official [Jobs board](https://jobs.nestjs.com). + +## Support + +Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support by the amazing backers. If you'd like to join them, please [read more here](https://docs.nestjs.com/support). + +## Stay in touch + +- Author - [Kamil Myśliwiec](https://twitter.com/kammysliwiec) +- Website - [https://nestjs.com](https://nestjs.com/) +- Twitter - [@nestframework](https://twitter.com/nestframework) + +## License + +Nest is [MIT licensed](https://github.com/nestjs/nest/blob/master/LICENSE). diff --git a/backend/eslint.config.mjs b/backend/eslint.config.mjs new file mode 100644 index 0000000..4e9f827 --- /dev/null +++ b/backend/eslint.config.mjs @@ -0,0 +1,35 @@ +// @ts-check +import eslint from '@eslint/js'; +import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended'; +import globals from 'globals'; +import tseslint from 'typescript-eslint'; + +export default tseslint.config( + { + ignores: ['eslint.config.mjs'], + }, + eslint.configs.recommended, + ...tseslint.configs.recommendedTypeChecked, + eslintPluginPrettierRecommended, + { + languageOptions: { + globals: { + ...globals.node, + ...globals.jest, + }, + sourceType: 'commonjs', + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, + }, + { + rules: { + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-floating-promises': 'warn', + '@typescript-eslint/no-unsafe-argument': 'warn', + "prettier/prettier": ["error", { endOfLine: "auto" }], + }, + }, +); diff --git a/backend/nest-cli.json b/backend/nest-cli.json new file mode 100644 index 0000000..f9aa683 --- /dev/null +++ b/backend/nest-cli.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://json.schemastore.org/nest-cli", + "collection": "@nestjs/schematics", + "sourceRoot": "src", + "compilerOptions": { + "deleteOutDir": true + } +} diff --git a/backend/package-lock.json b/backend/package-lock.json new file mode 100644 index 0000000..ef545db --- /dev/null +++ b/backend/package-lock.json @@ -0,0 +1,11057 @@ +{ + "name": "backend", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "backend", + "version": "0.0.1", + "license": "UNLICENSED", + "dependencies": { + "@nestjs/common": "^11.0.1", + "@nestjs/core": "^11.0.1", + "@nestjs/jwt": "^11.0.2", + "@nestjs/passport": "^11.0.5", + "@nestjs/platform-express": "^11.0.1", + "@nestjs/typeorm": "^11.0.0", + "bcryptjs": "^3.0.3", + "better-sqlite3": "^12.6.2", + "class-transformer": "^0.5.1", + "class-validator": "^0.14.3", + "passport": "^0.7.0", + "passport-jwt": "^4.0.1", + "reflect-metadata": "^0.2.2", + "rxjs": "^7.8.1", + "typeorm": "^0.3.28", + "uuid": "^13.0.0" + }, + "devDependencies": { + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "^9.18.0", + "@nestjs/cli": "^11.0.0", + "@nestjs/schematics": "^11.0.0", + "@nestjs/testing": "^11.0.1", + "@types/bcryptjs": "^2.4.6", + "@types/better-sqlite3": "^7.6.13", + "@types/express": "^5.0.0", + "@types/jest": "^30.0.0", + "@types/node": "^22.10.7", + "@types/passport-jwt": "^4.0.1", + "@types/supertest": "^6.0.2", + "@types/uuid": "^10.0.0", + "eslint": "^9.18.0", + "eslint-config-prettier": "^10.0.1", + "eslint-plugin-prettier": "^5.2.2", + "globals": "^16.0.0", + "jest": "^30.0.0", + "prettier": "^3.4.2", + "source-map-support": "^0.5.21", + "supertest": "^7.0.0", + "ts-jest": "^29.2.5", + "ts-loader": "^9.5.2", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.7.3", + "typescript-eslint": "^8.20.0" + } + }, + "node_modules/@angular-devkit/core": { + "version": "19.2.19", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.19.tgz", + "integrity": "sha512-JbLL+4IMLMBgjLZlnPG4lYDfz4zGrJ/s6Aoon321NJKuw1Kb1k5KpFu9dUY0BqLIe8xPQ2UJBpI+xXdK5MXMHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.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": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/core/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@angular-devkit/core/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, + "license": "MIT" + }, + "node_modules/@angular-devkit/core/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==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@angular-devkit/schematics": { + "version": "19.2.19", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.19.tgz", + "integrity": "sha512-J4Jarr0SohdrHcb40gTL4wGPCQ952IMWF1G/MSAQfBAPvA9ZKApYhpxcY7PmehVePve+ujpus1dGsJ7dPxz8Kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "19.2.19", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", + "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-devkit/schematics-cli": { + "version": "19.2.19", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-19.2.19.tgz", + "integrity": "sha512-7q9UY6HK6sccL9F3cqGRUwKhM7b/XfD2YcVaZ2WD7VMaRlRm85v6mRjSrfKIAwxcQU0UK27kMc79NIIqaHjzxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "19.2.19", + "@angular-devkit/schematics": "19.2.19", + "@inquirer/prompts": "7.3.2", + "ansi-colors": "4.1.3", + "symbol-observable": "4.0.0", + "yargs-parser": "21.1.1" + }, + "bin": { + "schematics": "bin/schematics.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-devkit/schematics-cli/node_modules/@inquirer/prompts": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.3.2.tgz", + "integrity": "sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^4.1.2", + "@inquirer/confirm": "^5.1.6", + "@inquirer/editor": "^4.2.7", + "@inquirer/expand": "^4.0.9", + "@inquirer/input": "^4.1.6", + "@inquirer/number": "^3.0.9", + "@inquirer/password": "^4.0.9", + "@inquirer/rawlist": "^4.0.9", + "@inquirer/search": "^3.0.9", + "@inquirer/select": "^4.0.9" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/schematics/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==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.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/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "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, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.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, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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-import-attributes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@borewit/text-codec": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.2.1.tgz", + "integrity": "sha512-k7vvKPbf7J2fZ5klGRD9AeKfUvojuZIQ3BT5u7Jfv+puwXkUBUT5PVyMDfJZpy30CBDXGMgw7fguK/lpOMBvgw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "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==", + "devOptional": true, + "license": "MIT", + "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==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@emnapi/core": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", + "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/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, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "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, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@inquirer/ansi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", + "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.21", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", + "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/editor": { + "version": "4.2.23", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", + "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/external-editor": "^1.0.3", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/expand": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", + "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^2.1.1", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", + "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/number": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", + "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/password": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", + "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/prompts": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz", + "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^4.3.2", + "@inquirer/confirm": "^5.1.21", + "@inquirer/editor": "^4.2.23", + "@inquirer/expand": "^4.0.23", + "@inquirer/input": "^4.3.1", + "@inquirer/number": "^3.0.23", + "@inquirer/password": "^4.0.23", + "@inquirer/rawlist": "^4.1.11", + "@inquirer/search": "^3.2.2", + "@inquirer/select": "^4.4.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/rawlist": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", + "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/search": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", + "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/select": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", + "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.1.tgz", + "integrity": "sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, + "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==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@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, + "license": "ISC", + "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/load-nyc-config/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, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/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, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/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, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/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, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/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, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/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, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.2.0.tgz", + "integrity": "sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/core": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.2.0.tgz", + "integrity": "sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.2.0", + "@jest/pattern": "30.0.1", + "@jest/reporters": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-changed-files": "30.2.0", + "jest-config": "30.2.0", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-resolve-dependencies": "30.2.0", + "jest-runner": "30.2.0", + "jest-runtime": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "jest-watcher": "30.2.0", + "micromatch": "^4.0.8", + "pretty-format": "30.2.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/diff-sequences": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", + "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.2.0.tgz", + "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-mock": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "30.2.0", + "jest-snapshot": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.2.0.tgz", + "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.2.0.tgz", + "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@sinonjs/fake-timers": "^13.0.0", + "@types/node": "*", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/get-type": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", + "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.2.0.tgz", + "integrity": "sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/types": "30.2.0", + "jest-mock": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/pattern": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", + "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.2.0.tgz", + "integrity": "sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@jridgewell/trace-mapping": "^0.3.25", + "@types/node": "*", + "chalk": "^4.1.2", + "collect-v8-coverage": "^1.0.2", + "exit-x": "^0.2.2", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^5.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", + "slash": "^3.0.0", + "string-length": "^4.0.2", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jest/reporters/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@jest/reporters/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jest/reporters/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jest/schemas": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/snapshot-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.2.0.tgz", + "integrity": "sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "natural-compare": "^1.4.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz", + "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "callsites": "^3.1.0", + "graceful-fs": "^4.2.11" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.2.0.tgz", + "integrity": "sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.2.0", + "@jest/types": "30.2.0", + "@types/istanbul-lib-coverage": "^2.0.6", + "collect-v8-coverage": "^1.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.2.0.tgz", + "integrity": "sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "30.2.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.2.0.tgz", + "integrity": "sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/types": "30.2.0", + "@jridgewell/trace-mapping": "^0.3.25", + "babel-plugin-istanbul": "^7.0.1", + "chalk": "^4.1.2", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "micromatch": "^4.0.8", + "pirates": "^4.0.7", + "slash": "^3.0.0", + "write-file-atomic": "^5.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/types": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", + "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "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==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@lukeed/csprng": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", + "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@nestjs/cli": { + "version": "11.0.16", + "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-11.0.16.tgz", + "integrity": "sha512-P0H+Vcjki6P5160E5QnMt3Q0X5FTg4PZkP99Ig4lm/4JWqfw32j3EXv3YBTJ2DmxLwOQ/IS9F7dzKpMAgzKTGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "19.2.19", + "@angular-devkit/schematics": "19.2.19", + "@angular-devkit/schematics-cli": "19.2.19", + "@inquirer/prompts": "7.10.1", + "@nestjs/schematics": "^11.0.1", + "ansis": "4.2.0", + "chokidar": "4.0.3", + "cli-table3": "0.6.5", + "commander": "4.1.1", + "fork-ts-checker-webpack-plugin": "9.1.0", + "glob": "13.0.0", + "node-emoji": "1.11.0", + "ora": "5.4.1", + "tsconfig-paths": "4.2.0", + "tsconfig-paths-webpack-plugin": "4.2.0", + "typescript": "5.9.3", + "webpack": "5.104.1", + "webpack-node-externals": "3.0.0" + }, + "bin": { + "nest": "bin/nest.js" + }, + "engines": { + "node": ">= 20.11" + }, + "peerDependencies": { + "@swc/cli": "^0.1.62 || ^0.3.0 || ^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0", + "@swc/core": "^1.3.62" + }, + "peerDependenciesMeta": { + "@swc/cli": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/@nestjs/cli/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@nestjs/cli/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, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@nestjs/cli/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, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/@nestjs/cli/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, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@nestjs/cli/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@nestjs/cli/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, + "license": "MIT" + }, + "node_modules/@nestjs/cli/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nestjs/cli/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nestjs/cli/node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@nestjs/cli/node_modules/webpack": { + "version": "5.104.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.104.1.tgz", + "integrity": "sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.4", + "es-module-lexer": "^2.0.0", + "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.3.1", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.16", + "watchpack": "^2.4.4", + "webpack-sources": "^3.3.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/@nestjs/common": { + "version": "11.1.13", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.13.tgz", + "integrity": "sha512-ieqWtipT+VlyDWLz5Rvz0f3E5rXcVAnaAi+D53DEHLjc1kmFxCgZ62qVfTX2vwkywwqNkTNXvBgGR72hYqV//Q==", + "license": "MIT", + "dependencies": { + "file-type": "21.3.0", + "iterare": "1.2.1", + "load-esm": "1.0.3", + "tslib": "2.8.1", + "uid": "2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "class-transformer": ">=0.4.1", + "class-validator": ">=0.13.2", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, + "node_modules/@nestjs/core": { + "version": "11.1.13", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.13.tgz", + "integrity": "sha512-Tq9EIKiC30EBL8hLK93tNqaToy0hzbuVGYt29V8NhkVJUsDzlmiVf6c3hSPtzx2krIUVbTgQ2KFeaxr72rEyzQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@nuxt/opencollective": "0.4.1", + "fast-safe-stringify": "2.1.1", + "iterare": "1.2.1", + "path-to-regexp": "8.3.0", + "tslib": "2.8.1", + "uid": "2.0.2" + }, + "engines": { + "node": ">= 20" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^11.0.0", + "@nestjs/microservices": "^11.0.0", + "@nestjs/platform-express": "^11.0.0", + "@nestjs/websockets": "^11.0.0", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "@nestjs/microservices": { + "optional": true + }, + "@nestjs/platform-express": { + "optional": true + }, + "@nestjs/websockets": { + "optional": true + } + } + }, + "node_modules/@nestjs/jwt": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-11.0.2.tgz", + "integrity": "sha512-rK8aE/3/Ma45gAWfCksAXUNbOoSOUudU0Kn3rT39htPF7wsYXtKfjALKeKKJbFrIWbLjsbqfXX5bIJNvgBugGA==", + "license": "MIT", + "dependencies": { + "@types/jsonwebtoken": "9.0.10", + "jsonwebtoken": "9.0.3" + }, + "peerDependencies": { + "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0" + } + }, + "node_modules/@nestjs/passport": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-11.0.5.tgz", + "integrity": "sha512-ulQX6mbjlws92PIM15Naes4F4p2JoxGnIJuUsdXQPT+Oo2sqQmENEZXM7eYuimocfHnKlcfZOuyzbA33LwUlOQ==", + "license": "MIT", + "peerDependencies": { + "@nestjs/common": "^10.0.0 || ^11.0.0", + "passport": "^0.5.0 || ^0.6.0 || ^0.7.0" + } + }, + "node_modules/@nestjs/platform-express": { + "version": "11.1.13", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.1.13.tgz", + "integrity": "sha512-LYmi43BrAs1n74kLCUfXcHag7s1CmGETcFbf9IVyA/KWXAuAH95G3wEaZZiyabOLFNwq4ifnRGnIwUwW7cz3+w==", + "license": "MIT", + "dependencies": { + "cors": "2.8.6", + "express": "5.2.1", + "multer": "2.0.2", + "path-to-regexp": "8.3.0", + "tslib": "2.8.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0" + } + }, + "node_modules/@nestjs/schematics": { + "version": "11.0.9", + "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-11.0.9.tgz", + "integrity": "sha512-0NfPbPlEaGwIT8/TCThxLzrlz3yzDNkfRNpbL7FiplKq3w4qXpJg0JYwqgMEJnLQZm3L/L/5XjoyfJHUO3qX9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "19.2.17", + "@angular-devkit/schematics": "19.2.17", + "comment-json": "4.4.1", + "jsonc-parser": "3.3.1", + "pluralize": "8.0.0" + }, + "peerDependencies": { + "typescript": ">=4.8.2" + } + }, + "node_modules/@nestjs/schematics/node_modules/@angular-devkit/core": { + "version": "19.2.17", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.17.tgz", + "integrity": "sha512-Ah008x2RJkd0F+NLKqIpA34/vUGwjlprRCkvddjDopAWRzYn6xCkz1Tqwuhn0nR1Dy47wTLKYD999TYl5ONOAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.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": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@nestjs/schematics/node_modules/@angular-devkit/schematics": { + "version": "19.2.17", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.17.tgz", + "integrity": "sha512-ADfbaBsrG8mBF6Mfs+crKA/2ykB8AJI50Cv9tKmZfwcUcyAdmTr+vVvhsBCfvUAEokigSsgqgpYxfkJVxhJYeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "19.2.17", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", + "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/@nestjs/schematics/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@nestjs/schematics/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, + "license": "MIT" + }, + "node_modules/@nestjs/schematics/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==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@nestjs/testing": { + "version": "11.1.13", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-11.1.13.tgz", + "integrity": "sha512-bOWP8nLEZAOEEX8jAZGBCc1yU0+nv4g2ipc+QEzkVUe3eEEUKHKaeGafJ3GtDuGavlZKfkXEqflZuICdavu5dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "2.8.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0", + "@nestjs/microservices": "^11.0.0", + "@nestjs/platform-express": "^11.0.0" + }, + "peerDependenciesMeta": { + "@nestjs/microservices": { + "optional": true + }, + "@nestjs/platform-express": { + "optional": true + } + } + }, + "node_modules/@nestjs/typeorm": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-11.0.0.tgz", + "integrity": "sha512-SOeUQl70Lb2OfhGkvnh4KXWlsd+zA08RuuQgT7kKbzivngxzSo1Oc7Usu5VxCxACQC9wc2l9esOHILSJeK7rJA==", + "license": "MIT", + "peerDependencies": { + "@nestjs/common": "^10.0.0 || ^11.0.0", + "@nestjs/core": "^10.0.0 || ^11.0.0", + "reflect-metadata": "^0.1.13 || ^0.2.0", + "rxjs": "^7.2.0", + "typeorm": "^0.3.0" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nuxt/opencollective": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@nuxt/opencollective/-/opencollective-0.4.1.tgz", + "integrity": "sha512-GXD3wy50qYbxCJ652bDrDzgMr3NFEkIS374+IgFQKkCvk9yiYcLvX2XDYr7UyQxf4wK0e+yqDYRubZ0DtOxnmQ==", + "license": "MIT", + "dependencies": { + "consola": "^3.2.3" + }, + "bin": { + "opencollective": "bin/opencollective.js" + }, + "engines": { + "node": "^14.18.0 || >=16.10.0", + "npm": ">=5.10.0" + } + }, + "node_modules/@paralleldrive/cuid2": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz", + "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.1.5" + } + }, + "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==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.34.48", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", + "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", + "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/@sqltools/formatter": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.5.tgz", + "integrity": "sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==", + "license": "MIT" + }, + "node_modules/@tokenizer/inflate": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz", + "integrity": "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "token-types": "^6.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "license": "MIT" + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", + "devOptional": true, + "license": "MIT" + }, + "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==", + "devOptional": true, + "license": "MIT" + }, + "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==", + "devOptional": true, + "license": "MIT" + }, + "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==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/bcryptjs": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.6.tgz", + "integrity": "sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/better-sqlite3": { + "version": "7.6.13", + "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.13.tgz", + "integrity": "sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "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, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cookiejar": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", + "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", + "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "^2" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz", + "integrity": "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "30.0.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz", + "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^30.0.0", + "pretty-format": "^30.0.0" + } + }, + "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, + "license": "MIT" + }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.10", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz", + "integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==", + "license": "MIT", + "dependencies": { + "@types/ms": "*", + "@types/node": "*" + } + }, + "node_modules/@types/methods": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", + "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.19.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.10.tgz", + "integrity": "sha512-tF5VOugLS/EuDlTBijk0MqABfP8UxgYazTLo3uIn3b4yJgg26QRbVYJYsDtHrjdDUIRfP70+VfhTTc+CE1yskw==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/passport": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.17.tgz", + "integrity": "sha512-aciLyx+wDwT2t2/kJGJR2AEeBz0nJU4WuRX04Wu9Dqc5lSUtwu0WERPHYsLhF9PtseiAMPBGNUOtFjxZ56prsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/passport-jwt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/passport-jwt/-/passport-jwt-4.0.1.tgz", + "integrity": "sha512-Y0Ykz6nWP4jpxgEUYq8NoVZeCQPo1ZndJLfapI249g1jHChvRfZRO/LS3tqu26YgAS/laI1qx98sYGz0IalRXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/jsonwebtoken": "*", + "@types/passport-strategy": "*" + } + }, + "node_modules/@types/passport-strategy": { + "version": "0.2.38", + "resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.38.tgz", + "integrity": "sha512-GC6eMqqojOooq993Tmnmp7AUTbbQSgilyvpCYQjT+H6JfG/g6RGc7nXEniZlp0zyKJ0WUdOiZWLBZft9Yug1uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*", + "@types/passport": "*" + } + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/superagent": { + "version": "8.1.9", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.9.tgz", + "integrity": "sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/cookiejar": "^2.1.5", + "@types/methods": "^1.1.4", + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/supertest": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.3.tgz", + "integrity": "sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/methods": "^1.1.4", + "@types/superagent": "^8.1.0" + } + }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/validator": { + "version": "13.15.10", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.10.tgz", + "integrity": "sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==", + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.54.0.tgz", + "integrity": "sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.54.0", + "@typescript-eslint/type-utils": "8.54.0", + "@typescript-eslint/utils": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.54.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.54.0.tgz", + "integrity": "sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.54.0", + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/typescript-estree": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.54.0.tgz", + "integrity": "sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.54.0", + "@typescript-eslint/types": "^8.54.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.54.0.tgz", + "integrity": "sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.54.0.tgz", + "integrity": "sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.54.0.tgz", + "integrity": "sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/typescript-estree": "8.54.0", + "@typescript-eslint/utils": "8.54.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.54.0.tgz", + "integrity": "sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.54.0.tgz", + "integrity": "sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.54.0", + "@typescript-eslint/tsconfig-utils": "8.54.0", + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/visitor-keys": "8.54.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.54.0.tgz", + "integrity": "sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.54.0", + "@typescript-eslint/types": "8.54.0", + "@typescript-eslint/typescript-estree": "8.54.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.54.0.tgz", + "integrity": "sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.54.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "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, + "license": "BSD-3-Clause" + }, + "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, + "license": "Apache-2.0" + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "devOptional": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "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, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-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, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/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, + "license": "MIT" + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.2.0.tgz", + "integrity": "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==", + "license": "ISC", + "engines": { + "node": ">=14" + } + }, + "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, + "license": "ISC", + "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, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/app-root-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz", + "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==", + "license": "MIT" + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-timsort": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", + "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/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==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/babel-jest": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.2.0.tgz", + "integrity": "sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "30.2.0", + "@types/babel__core": "^7.20.5", + "babel-plugin-istanbul": "^7.0.1", + "babel-preset-jest": "30.2.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0 || ^8.0.0-0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz", + "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==", + "dev": true, + "license": "BSD-3-Clause", + "workspaces": [ + "test/babel-8" + ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-instrument": "^6.0.2", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.2.0.tgz", + "integrity": "sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/babel__core": "^7.20.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-jest": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.2.0.tgz", + "integrity": "sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0 || ^8.0.0-beta.1" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/bcryptjs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-3.0.3.tgz", + "integrity": "sha512-GlF5wPWnSa/X5LKM1o0wz0suXIINz1iHRLvTS+sLyi7XPbe5ycmYI3DlZqVGZZtDgl4DmasFg7gOB3JYbphV5g==", + "license": "BSD-3-Clause", + "bin": { + "bcrypt": "bin/bcrypt" + } + }, + "node_modules/better-sqlite3": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-12.6.2.tgz", + "integrity": "sha512-8VYKM3MjCa9WcaSAI3hzwhmyHVlH8tiGFwf0RlTsZPWJ1I5MkzjiudCo4KC4DxOaL/53A5B1sI/IbldNFDbsKA==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "bindings": "^1.5.0", + "prebuild-install": "^7.1.1" + }, + "engines": { + "node": "20.x || 22.x || 23.x || 24.x || 25.x" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "license": "MIT", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.1", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/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, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, + "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==", + "license": "MIT" + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001769", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz", + "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==", + "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" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/chardet": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", + "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/class-transformer": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", + "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==", + "license": "MIT" + }, + "node_modules/class-validator": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.3.tgz", + "integrity": "sha512-rXXekcjofVN1LTOSw+u4u9WXVEUvNBVjORW154q/IdmYWy1nMbOU9aNtZB0t8m+FJQ9q91jlr2f9CwwUFdFMRA==", + "license": "MIT", + "dependencies": { + "@types/validator": "^13.15.3", + "libphonenumber-js": "^1.11.1", + "validator": "^13.15.20" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "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, + "license": "ISC", + "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==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", + "dev": true, + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/comment-json": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.4.1.tgz", + "integrity": "sha512-r1To31BQD5060QdkC+Iheai7gHwoSZobzunqkf2/kQ6xIAfJyrKNAFUwdKvkK7Qgu7pVTKQEa7ok7Ed3ycAJgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-timsort": "^1.0.3", + "core-util-is": "^1.0.3", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "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==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/dayjs": { + "version": "1.11.19", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", + "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dedent": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", + "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==", + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "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, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "MIT", + "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/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", + "devOptional": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.286", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", + "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", + "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "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==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.2", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.5.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.5.tgz", + "integrity": "sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.1", + "synckit": "^0.11.12" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.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, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "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, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "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, + "license": "BSD-2-Clause", + "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, + "license": "BSD-2-Clause", + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "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/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, + "license": "ISC" + }, + "node_modules/exit-x": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz", + "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "license": "(MIT OR WTFPL)", + "engines": { + "node": ">=6" + } + }, + "node_modules/expect": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/file-type": { + "version": "21.3.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.3.0.tgz", + "integrity": "sha512-8kPJMIGz1Yt/aPEwOsrR97ZyZaD1Iqm8PClb1nYFclUCkBi0Ma5IsYNQzvSFS9ib51lWyIw5mIT9rWzI/xjpzA==", + "license": "MIT", + "dependencies": { + "@tokenizer/inflate": "^0.4.1", + "strtok3": "^10.3.4", + "token-types": "^6.1.1", + "uint8array-extras": "^1.4.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "license": "MIT" + }, + "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, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-9.1.0.tgz", + "integrity": "sha512-mpafl89VFPJmhnJ1ssH+8wmM2b50n+Rew5x42NeI2U78aRWgtkEtGmctp7iT16UjquJTjorEmIfESj3DxdW84Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.16.7", + "chalk": "^4.1.2", + "chokidar": "^4.0.1", + "cosmiconfig": "^8.2.0", + "deepmerge": "^4.2.2", + "fs-extra": "^10.0.0", + "memfs": "^3.4.1", + "minimatch": "^3.0.4", + "node-abort-controller": "^3.0.1", + "schema-utils": "^3.1.1", + "semver": "^7.3.5", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "typescript": ">3.6.0", + "webpack": "^5.11.0" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/formidable": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", + "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@paralleldrive/cuid2": "^2.2.2", + "dezalgo": "^1.0.4", + "once": "^1.4.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-monkey": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.1.0.tgz", + "integrity": "sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==", + "dev": true, + "license": "Unlicense" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/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, + "license": "MIT", + "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==", + "license": "MIT", + "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, + "license": "MIT", + "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==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-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, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "license": "MIT" + }, + "node_modules/glob": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", + "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "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, + "license": "BSD-2-Clause" + }, + "node_modules/glob/node_modules/minimatch": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.2.tgz", + "integrity": "sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/handlebars/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "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, + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "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, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterare": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", + "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==", + "license": "ISC", + "engines": { + "node": ">=6" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-30.2.0.tgz", + "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "30.2.0", + "@jest/types": "30.2.0", + "import-local": "^3.2.0", + "jest-cli": "30.2.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.2.0.tgz", + "integrity": "sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.1.1", + "jest-util": "30.2.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-circus": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.2.0.tgz", + "integrity": "sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "co": "^4.6.0", + "dedent": "^1.6.0", + "is-generator-fn": "^2.1.0", + "jest-each": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-runtime": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "p-limit": "^3.1.0", + "pretty-format": "30.2.0", + "pure-rand": "^7.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-cli": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.2.0.tgz", + "integrity": "sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "exit-x": "^0.2.2", + "import-local": "^3.2.0", + "jest-config": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "yargs": "^17.7.2" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.2.0.tgz", + "integrity": "sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/get-type": "30.1.0", + "@jest/pattern": "30.0.1", + "@jest/test-sequencer": "30.2.0", + "@jest/types": "30.2.0", + "babel-jest": "30.2.0", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "deepmerge": "^4.3.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "jest-circus": "30.2.0", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-runner": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "micromatch": "^4.0.8", + "parse-json": "^5.2.0", + "pretty-format": "30.2.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "esbuild-register": ">=3.4.0", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "esbuild-register": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/jest-config/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-config/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/jest-config/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-config/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-diff": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", + "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/diff-sequences": "30.0.1", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.2.0.tgz", + "integrity": "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-each": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.2.0.tgz", + "integrity": "sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "jest-util": "30.2.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.2.0.tgz", + "integrity": "sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-mock": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.2.0.tgz", + "integrity": "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "anymatch": "^3.1.3", + "fb-watchman": "^2.0.2", + "graceful-fs": "^4.2.11", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", + "micromatch": "^4.0.8", + "walker": "^1.0.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.3" + } + }, + "node_modules/jest-leak-detector": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.2.0.tgz", + "integrity": "sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz", + "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.2.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.2.0.tgz", + "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.2.0", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.2.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-mock": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.2.0.tgz", + "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", + "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.2.0.tgz", + "integrity": "sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-pnp-resolver": "^1.2.3", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "slash": "^3.0.0", + "unrs-resolver": "^1.7.11" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.2.0.tgz", + "integrity": "sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "30.0.1", + "jest-snapshot": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-runner": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.2.0.tgz", + "integrity": "sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.2.0", + "@jest/environment": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.2.0", + "jest-haste-map": "30.2.0", + "jest-leak-detector": "30.2.0", + "jest-message-util": "30.2.0", + "jest-resolve": "30.2.0", + "jest-runtime": "30.2.0", + "jest-util": "30.2.0", + "jest-watcher": "30.2.0", + "jest-worker": "30.2.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-runner/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-runner/node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/jest-runtime": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.2.0.tgz", + "integrity": "sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/globals": "30.2.0", + "@jest/source-map": "30.0.1", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "cjs-module-lexer": "^2.1.0", + "collect-v8-coverage": "^1.0.2", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-runtime/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/jest-runtime/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-runtime/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/jest-runtime/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-runtime/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-snapshot": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.2.0.tgz", + "integrity": "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@babel/generator": "^7.27.5", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1", + "@babel/types": "^7.27.3", + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "@jest/snapshot-utils": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0", + "chalk": "^4.1.2", + "expect": "30.2.0", + "graceful-fs": "^4.2.11", + "jest-diff": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "pretty-format": "30.2.0", + "semver": "^7.7.2", + "synckit": "^0.11.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-util": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.2.0.tgz", + "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-validate": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.2.0.tgz", + "integrity": "sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", + "camelcase": "^6.3.0", + "chalk": "^4.1.2", + "leven": "^3.1.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.2.0.tgz", + "integrity": "sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "jest-util": "30.2.0", + "string-length": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-worker": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.2.0.tgz", + "integrity": "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.2.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "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, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "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, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-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, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-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, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", + "license": "MIT", + "dependencies": { + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/libphonenumber-js": { + "version": "1.12.36", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.36.tgz", + "integrity": "sha512-woWhKMAVx1fzzUnMCyOzglgSgf6/AFHLASdOBcchYCyvWSGWt12imw3iu2hdI5d4dGZRsNWAmWiz37sDKUPaRQ==", + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/load-esm": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/load-esm/-/load-esm-1.0.3.tgz", + "integrity": "sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + }, + { + "type": "buymeacoffee", + "url": "https://buymeacoffee.com/borewit" + } + ], + "license": "MIT", + "engines": { + "node": ">=13.2.0" + } + }, + "node_modules/loader-runner": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "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, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" + }, + "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, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "devOptional": true, + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, + "license": "Unlicense", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "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==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/multer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz", + "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==", + "license": "MIT", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.6.0", + "concat-stream": "^2.0.0", + "mkdirp": "^0.5.6", + "object-assign": "^4.1.1", + "type-is": "^1.6.18", + "xtend": "^4.0.2" + }, + "engines": { + "node": ">= 10.16.0" + } + }, + "node_modules/multer/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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/multer/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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/multer/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==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/multer/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==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "license": "MIT" + }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "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, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "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, + "license": "MIT" + }, + "node_modules/node-abi": { + "version": "3.87.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.87.0.tgz", + "integrity": "sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "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==", + "license": "ISC", + "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, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "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/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, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-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, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT", + "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/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/passport": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.7.0.tgz", + "integrity": "sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==", + "license": "MIT", + "dependencies": { + "passport-strategy": "1.x.x", + "pause": "0.0.1", + "utils-merge": "^1.0.1" + }, + "engines": { + "node": ">= 0.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jaredhanson" + } + }, + "node_modules/passport-jwt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.1.tgz", + "integrity": "sha512-UCKMDYhNuGOBE9/9Ycuoyh7vP6jpeTp/+sfMJl7nLff/t6dps+iaeE0hhNkKN8/HZHcJ7lCdOyDxHdDoxoSvdQ==", + "license": "MIT", + "dependencies": { + "jsonwebtoken": "^9.0.0", + "passport-strategy": "^1.0.0" + } + }, + "node_modules/passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.2.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.5.tgz", + "integrity": "sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/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, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/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, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/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, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/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, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz", + "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-format": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", + "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", + "integrity": "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "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==", + "license": "Apache-2.0" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor/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, + "license": "ISC" + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "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, + "license": "MIT", + "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/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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==", + "license": "MIT", + "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/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/sha.js": { + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", + "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", + "license": "(MIT AND BSD-3-Clause)", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.0" + }, + "bin": { + "sha.js": "bin.js" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/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, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "BSD-3-Clause" + }, + "node_modules/sql-highlight": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sql-highlight/-/sql-highlight-6.1.0.tgz", + "integrity": "sha512-ed7OK4e9ywpE7pgRMkMQmZDPKSVdm0oX5IEtZiKnFucSF0zu6c80GZBe38UqHuVhTWJ9xsKgSMjCG2bml86KvA==", + "funding": [ + "https://github.com/scriptcoded/sql-highlight?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/scriptcoded" + } + ], + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strtok3": { + "version": "10.3.4", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.4.tgz", + "integrity": "sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==", + "license": "MIT", + "dependencies": { + "@tokenizer/token": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/superagent": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.3.0.tgz", + "integrity": "sha512-B+4Ik7ROgVKrQsXTV0Jwp2u+PXYLSlqtDAhYnkkD+zn3yg8s/zjA2MeGayPoY/KICrbitwneDHrjSotxKL+0XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "component-emitter": "^1.3.1", + "cookiejar": "^2.1.4", + "debug": "^4.3.7", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.5", + "formidable": "^3.5.4", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.14.1" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/supertest": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.2.2.tgz", + "integrity": "sha512-oK8WG9diS3DlhdUkcFn4tkNIiIbBx9lI2ClF8K+b2/m8Eyv47LSawxUzZQSNKUrVb2KsqeTDCcjAAVPYaSLVTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cookie-signature": "^1.2.2", + "methods": "^1.1.2", + "superagent": "^10.3.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/synckit": { + "version": "0.11.12", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", + "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.9" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar-fs": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "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==", + "license": "MIT", + "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/terser": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", + "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "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.16", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", + "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "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": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/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, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/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, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/terser-webpack-plugin/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, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/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, + "license": "MIT" + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/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, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "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, + "license": "MIT" + }, + "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, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-buffer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", + "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", + "license": "MIT", + "dependencies": { + "isarray": "^2.0.5", + "safe-buffer": "^5.2.1", + "typed-array-buffer": "^1.0.3" + }, + "engines": { + "node": ">= 0.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, + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/token-types": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.2.tgz", + "integrity": "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==", + "license": "MIT", + "dependencies": { + "@borewit/text-codec": "^0.2.1", + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-jest": { + "version": "29.4.6", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz", + "integrity": "sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "fast-json-stable-stringify": "^2.1.0", + "handlebars": "^4.7.8", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.7.3", + "type-fest": "^4.41.0", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0 || ^30.0.0", + "@jest/types": "^29.0.0 || ^30.0.0", + "babel-jest": "^29.0.0 || ^30.0.0", + "jest": "^29.0.0 || ^30.0.0", + "jest-util": "^29.0.0 || ^30.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jest-util": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ts-loader": { + "version": "9.5.4", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.4.tgz", + "integrity": "sha512-nCz0rEwunlTZiy6rXFByQU1kVVpCIgUpc/psFiKVrUwrizdnIbRFu8w7bxhUF0X613DYwT4XzrZHpVyMe758hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4", + "source-map": "^0.7.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.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==", + "devOptional": true, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tsconfig-paths-webpack-plugin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.2.0.tgz", + "integrity": "sha512-zbem3rfRS8BgeNK50Zz5SIQgXzLafiHjOwUAvk/38/o1jHn/V5QAgVUcz884or7WYcPaH3N2CIfUc2u0ul7UcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.7.0", + "tapable": "^2.2.1", + "tsconfig-paths": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tsconfig-paths/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, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "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, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "license": "MIT" + }, + "node_modules/typeorm": { + "version": "0.3.28", + "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.28.tgz", + "integrity": "sha512-6GH7wXhtfq2D33ZuRXYwIsl/qM5685WZcODZb7noOOcRMteM9KF2x2ap3H0EBjnSV0VO4gNAfJT5Ukp0PkOlvg==", + "license": "MIT", + "dependencies": { + "@sqltools/formatter": "^1.2.5", + "ansis": "^4.2.0", + "app-root-path": "^3.1.0", + "buffer": "^6.0.3", + "dayjs": "^1.11.19", + "debug": "^4.4.3", + "dedent": "^1.7.0", + "dotenv": "^16.6.1", + "glob": "^10.5.0", + "reflect-metadata": "^0.2.2", + "sha.js": "^2.4.12", + "sql-highlight": "^6.1.0", + "tslib": "^2.8.1", + "uuid": "^11.1.0", + "yargs": "^17.7.2" + }, + "bin": { + "typeorm": "cli.js", + "typeorm-ts-node-commonjs": "cli-ts-node-commonjs.js", + "typeorm-ts-node-esm": "cli-ts-node-esm.js" + }, + "engines": { + "node": ">=16.13.0" + }, + "funding": { + "url": "https://opencollective.com/typeorm" + }, + "peerDependencies": { + "@google-cloud/spanner": "^5.18.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@sap/hana-client": "^2.14.22", + "better-sqlite3": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0", + "ioredis": "^5.0.4", + "mongodb": "^5.8.0 || ^6.0.0", + "mssql": "^9.1.1 || ^10.0.0 || ^11.0.0 || ^12.0.0", + "mysql2": "^2.2.5 || ^3.0.1", + "oracledb": "^6.3.0", + "pg": "^8.5.1", + "pg-native": "^3.0.0", + "pg-query-stream": "^4.0.0", + "redis": "^3.1.1 || ^4.0.0 || ^5.0.14", + "sql.js": "^1.4.0", + "sqlite3": "^5.0.3", + "ts-node": "^10.7.0", + "typeorm-aurora-data-api-driver": "^2.0.0 || ^3.0.0" + }, + "peerDependenciesMeta": { + "@google-cloud/spanner": { + "optional": true + }, + "@sap/hana-client": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "mongodb": { + "optional": true + }, + "mssql": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "oracledb": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-native": { + "optional": true + }, + "pg-query-stream": { + "optional": true + }, + "redis": { + "optional": true + }, + "sql.js": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "ts-node": { + "optional": true + }, + "typeorm-aurora-data-api-driver": { + "optional": true + } + } + }, + "node_modules/typeorm/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/typeorm/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/typeorm/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typeorm/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/typeorm/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typeorm/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==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typeorm/node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.54.0.tgz", + "integrity": "sha512-CKsJ+g53QpsNPqbzUsfKVgd3Lny4yKZ1pP4qN3jdMOg/sisIDLGyDMezycquXLE5JsEU0wp3dGNdzig0/fmSVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.54.0", + "@typescript-eslint/parser": "8.54.0", + "@typescript-eslint/typescript-estree": "8.54.0", + "@typescript-eslint/utils": "8.54.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uid": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.2.tgz", + "integrity": "sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==", + "license": "MIT", + "dependencies": { + "@lukeed/csprng": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/uint8array-extras": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz", + "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.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, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", + "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/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==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/validator": { + "version": "13.15.26", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.26.tgz", + "integrity": "sha512-spH26xU080ydGggxRyR1Yhcbgx+j3y5jbNXk/8L+iRvdIEQ4uTRH2Sgf2dokud6Q4oAtsbNvJ1Ft+9xmm6IZcA==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.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, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webpack": { + "version": "5.105.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.0.tgz", + "integrity": "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.19.0", + "es-module-lexer": "^2.0.0", + "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.3.1", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.16", + "watchpack": "^2.5.1", + "webpack-sources": "^3.3.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-node-externals": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", + "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-sources": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/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, + "license": "MIT", + "peer": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/webpack/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, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack/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, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/webpack/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, + "license": "MIT", + "peer": true + }, + "node_modules/webpack/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.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==", + "license": "MIT", + "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==", + "license": "ISC", + "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, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/backend/package.json b/backend/package.json new file mode 100644 index 0000000..7478b00 --- /dev/null +++ b/backend/package.json @@ -0,0 +1,86 @@ +{ + "name": "backend", + "version": "0.0.1", + "description": "", + "author": "", + "private": true, + "license": "UNLICENSED", + "scripts": { + "build": "nest build", + "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", + "start": "nest start", + "start:dev": "nest start --watch", + "start:debug": "nest start --debug --watch", + "start:prod": "node dist/main", + "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", + "test": "jest", + "test:watch": "jest --watch", + "test:cov": "jest --coverage", + "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", + "test:e2e": "jest --config ./test/jest-e2e.json" + }, + "dependencies": { + "@nestjs/common": "^11.0.1", + "@nestjs/core": "^11.0.1", + "@nestjs/jwt": "^11.0.2", + "@nestjs/passport": "^11.0.5", + "@nestjs/platform-express": "^11.0.1", + "@nestjs/typeorm": "^11.0.0", + "bcryptjs": "^3.0.3", + "better-sqlite3": "^12.6.2", + "class-transformer": "^0.5.1", + "class-validator": "^0.14.3", + "passport": "^0.7.0", + "passport-jwt": "^4.0.1", + "reflect-metadata": "^0.2.2", + "rxjs": "^7.8.1", + "typeorm": "^0.3.28", + "uuid": "^13.0.0" + }, + "devDependencies": { + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "^9.18.0", + "@nestjs/cli": "^11.0.0", + "@nestjs/schematics": "^11.0.0", + "@nestjs/testing": "^11.0.1", + "@types/bcryptjs": "^2.4.6", + "@types/better-sqlite3": "^7.6.13", + "@types/express": "^5.0.0", + "@types/jest": "^30.0.0", + "@types/node": "^22.10.7", + "@types/passport-jwt": "^4.0.1", + "@types/supertest": "^6.0.2", + "@types/uuid": "^10.0.0", + "eslint": "^9.18.0", + "eslint-config-prettier": "^10.0.1", + "eslint-plugin-prettier": "^5.2.2", + "globals": "^16.0.0", + "jest": "^30.0.0", + "prettier": "^3.4.2", + "source-map-support": "^0.5.21", + "supertest": "^7.0.0", + "ts-jest": "^29.2.5", + "ts-loader": "^9.5.2", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.7.3", + "typescript-eslint": "^8.20.0" + }, + "jest": { + "moduleFileExtensions": [ + "js", + "json", + "ts" + ], + "rootDir": "src", + "testRegex": ".*\\.spec\\.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + }, + "collectCoverageFrom": [ + "**/*.(t|j)s" + ], + "coverageDirectory": "../coverage", + "testEnvironment": "node" + } +} diff --git a/backend/src/app.module.ts b/backend/src/app.module.ts new file mode 100644 index 0000000..29950a1 --- /dev/null +++ b/backend/src/app.module.ts @@ -0,0 +1,61 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { AuthModule } from './modules/auth/auth.module'; +import { UsersModule } from './modules/users/users.module'; +import { LocaisModule } from './modules/locais/locais.module'; +import { CentrosCustoModule } from './modules/centros-custo/centros-custo.module'; +import { CategoriasModule } from './modules/categorias/categorias.module'; +import { FornecedoresModule } from './modules/fornecedores/fornecedores.module'; +import { DemandasModule } from './modules/demandas/demandas.module'; +import { PropostasModule } from './modules/propostas/propostas.module'; +import { OrcamentoModule } from './modules/orcamento/orcamento.module'; +import { WorkflowModule } from './modules/workflow/workflow.module'; +import { DashboardModule } from './modules/dashboard/dashboard.module'; +import { OrdensServicoModule } from './modules/ordens-servico/ordens-servico.module'; +import { SeedService } from './database/seeds/seed.service'; +import { Perfil } from './modules/users/entities/perfil.entity'; +import { Usuario } from './modules/users/entities/usuario.entity'; +import { Local } from './modules/locais/entities/local.entity'; +import { CentroCusto } from './modules/centros-custo/entities/centro-custo.entity'; +import { Categoria } from './modules/categorias/entities/categoria.entity'; +import { Fornecedor } from './modules/fornecedores/entities/fornecedor.entity'; +import { Certidao } from './modules/fornecedores/entities/certidao.entity'; +import { Demanda } from './modules/demandas/entities/demanda.entity'; +import { ItemLinha } from './modules/demandas/entities/item-linha.entity'; +import { Proposta } from './modules/propostas/entities/proposta.entity'; +import { OrcamentoPlanejado } from './modules/orcamento/entities/orcamento-planejado.entity'; +import { WorkflowAprovacao } from './modules/workflow/entities/workflow-aprovacao.entity'; +import { OrdemServico } from './modules/ordens-servico/entities/ordem-servico.entity'; +import { Avaliacao } from './modules/ordens-servico/entities/avaliacao.entity'; +import { Alerta } from './modules/dashboard/entities/alerta.entity'; +import { AuditLog } from './modules/dashboard/entities/audit-log.entity'; + +@Module({ + imports: [ + TypeOrmModule.forRoot({ + type: 'better-sqlite3', + database: 'hefesto.db', + autoLoadEntities: true, + synchronize: true, + }), + TypeOrmModule.forFeature([ + Perfil, Usuario, Local, CentroCusto, Categoria, Fornecedor, Certidao, + Demanda, ItemLinha, Proposta, OrcamentoPlanejado, WorkflowAprovacao, + OrdemServico, Avaliacao, Alerta, AuditLog, + ]), + AuthModule, + UsersModule, + LocaisModule, + CentrosCustoModule, + CategoriasModule, + FornecedoresModule, + DemandasModule, + PropostasModule, + OrcamentoModule, + WorkflowModule, + DashboardModule, + OrdensServicoModule, + ], + providers: [SeedService], +}) +export class AppModule {} diff --git a/backend/src/common/decorators/roles.decorator.ts b/backend/src/common/decorators/roles.decorator.ts new file mode 100644 index 0000000..3e3861f --- /dev/null +++ b/backend/src/common/decorators/roles.decorator.ts @@ -0,0 +1,3 @@ +import { SetMetadata } from '@nestjs/common'; +export const ROLES_KEY = 'roles'; +export const Roles = (...roles: string[]) => SetMetadata(ROLES_KEY, roles); diff --git a/backend/src/common/guards/jwt-auth.guard.ts b/backend/src/common/guards/jwt-auth.guard.ts new file mode 100644 index 0000000..490cf06 --- /dev/null +++ b/backend/src/common/guards/jwt-auth.guard.ts @@ -0,0 +1,19 @@ +import { Injectable, ExecutionContext } from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import { Reflector } from '@nestjs/core'; + +@Injectable() +export class JwtAuthGuard extends AuthGuard('jwt') { + constructor(private reflector: Reflector) { + super(); + } + + canActivate(context: ExecutionContext) { + const isPublic = this.reflector.getAllAndOverride('isPublic', [ + context.getHandler(), + context.getClass(), + ]); + if (isPublic) return true; + return super.canActivate(context); + } +} diff --git a/backend/src/common/guards/roles.guard.ts b/backend/src/common/guards/roles.guard.ts new file mode 100644 index 0000000..89a08c7 --- /dev/null +++ b/backend/src/common/guards/roles.guard.ts @@ -0,0 +1,19 @@ +import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common'; +import { Reflector } from '@nestjs/core'; +import { ROLES_KEY } from '../decorators/roles.decorator'; + +@Injectable() +export class RolesGuard implements CanActivate { + constructor(private reflector: Reflector) {} + + canActivate(context: ExecutionContext): boolean { + const requiredRoles = this.reflector.getAllAndOverride(ROLES_KEY, [ + context.getHandler(), + context.getClass(), + ]); + if (!requiredRoles) return true; + const { user } = context.switchToHttp().getRequest(); + if (!user) return false; + return requiredRoles.includes(user.perfil_nome); + } +} diff --git a/backend/src/database/seeds/seed.service.ts b/backend/src/database/seeds/seed.service.ts new file mode 100644 index 0000000..c120cd6 --- /dev/null +++ b/backend/src/database/seeds/seed.service.ts @@ -0,0 +1,249 @@ +import { Injectable, OnModuleInit } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository, DataSource } from 'typeorm'; +import * as bcrypt from 'bcryptjs'; +import { v4 as uuid } from 'uuid'; +import { Perfil } from '../../modules/users/entities/perfil.entity'; +import { Usuario } from '../../modules/users/entities/usuario.entity'; +import { Local } from '../../modules/locais/entities/local.entity'; +import { CentroCusto } from '../../modules/centros-custo/entities/centro-custo.entity'; +import { Categoria } from '../../modules/categorias/entities/categoria.entity'; +import { Fornecedor } from '../../modules/fornecedores/entities/fornecedor.entity'; +import { Certidao } from '../../modules/fornecedores/entities/certidao.entity'; +import { Demanda } from '../../modules/demandas/entities/demanda.entity'; +import { ItemLinha } from '../../modules/demandas/entities/item-linha.entity'; +import { Proposta } from '../../modules/propostas/entities/proposta.entity'; +import { OrcamentoPlanejado } from '../../modules/orcamento/entities/orcamento-planejado.entity'; +import { WorkflowAprovacao } from '../../modules/workflow/entities/workflow-aprovacao.entity'; +import { OrdemServico } from '../../modules/ordens-servico/entities/ordem-servico.entity'; +import { Alerta } from '../../modules/dashboard/entities/alerta.entity'; + +@Injectable() +export class SeedService { + constructor( + @InjectRepository(Perfil) private perfilRepo: Repository, + @InjectRepository(Usuario) private userRepo: Repository, + @InjectRepository(Local) private localRepo: Repository, + @InjectRepository(CentroCusto) private ccRepo: Repository, + @InjectRepository(Categoria) private catRepo: Repository, + @InjectRepository(Fornecedor) private fornRepo: Repository, + @InjectRepository(Certidao) private certRepo: Repository, + @InjectRepository(Demanda) private demandaRepo: Repository, + @InjectRepository(ItemLinha) private itemRepo: Repository, + @InjectRepository(Proposta) private propRepo: Repository, + @InjectRepository(OrcamentoPlanejado) private orcRepo: Repository, + @InjectRepository(WorkflowAprovacao) private wfRepo: Repository, + @InjectRepository(OrdemServico) private osRepo: Repository, + @InjectRepository(Alerta) private alertaRepo: Repository, + ) {} + + async seed() { + const existingPerfis = await this.perfilRepo.count(); + if (existingPerfis > 0) return; + + console.log('🌱 Seeding database...'); + const hash = await bcrypt.hash('123456', 10); + + // Perfis + const perfis = [ + { id: uuid(), nome: 'solicitante', descricao: 'Solicitante de demandas', permissoes: {} }, + { id: uuid(), nome: 'gestor_facilities', descricao: 'Gestor de Facilities', permissoes: {} }, + { id: uuid(), nome: 'aprovador_financeiro', descricao: 'Aprovador Financeiro', permissoes: {} }, + { id: uuid(), nome: 'diretoria', descricao: 'Diretoria', permissoes: {} }, + { id: uuid(), nome: 'fornecedor', descricao: 'Fornecedor', permissoes: {} }, + { id: uuid(), nome: 'administrador', descricao: 'Administrador do Sistema', permissoes: {} }, + ]; + await this.perfilRepo.save(perfis); + + // Centros de Custo + const ccs = [ + { id: uuid(), codigo: 'CC-001', nome: 'Sede Corporativa SP' }, + { id: uuid(), codigo: 'CC-002', nome: 'Filial Rio de Janeiro' }, + { id: uuid(), codigo: 'CC-003', nome: 'Centro de Distribuição MG' }, + { id: uuid(), codigo: 'CC-004', nome: 'Escritório Curitiba' }, + { id: uuid(), codigo: 'CC-005', nome: 'Fábrica Campinas' }, + ]; + await this.ccRepo.save(ccs); + + // Usuários + const users = [ + { id: uuid(), nome: 'Admin Sistema', email: 'admin@hefesto.com', senha_hash: hash, perfil_id: perfis[5].id }, + { id: uuid(), nome: 'Maria Silva', email: 'maria.silva@hefesto.com', senha_hash: hash, perfil_id: perfis[0].id }, + { id: uuid(), nome: 'João Santos', email: 'joao.santos@hefesto.com', senha_hash: hash, perfil_id: perfis[1].id }, + { id: uuid(), nome: 'Ana Oliveira', email: 'ana.oliveira@hefesto.com', senha_hash: hash, perfil_id: perfis[2].id }, + { id: uuid(), nome: 'Carlos Mendes', email: 'carlos.mendes@hefesto.com', senha_hash: hash, perfil_id: perfis[3].id }, + { id: uuid(), nome: 'Roberto Lima', email: 'roberto.lima@hefesto.com', senha_hash: hash, perfil_id: perfis[0].id }, + { id: uuid(), nome: 'Fernanda Costa', email: 'fernanda.costa@hefesto.com', senha_hash: hash, perfil_id: perfis[1].id }, + { id: uuid(), nome: 'Paulo Rodrigues', email: 'paulo.rodrigues@hefesto.com', senha_hash: hash, perfil_id: perfis[4].id }, + { id: uuid(), nome: 'Luciana Ferreira', email: 'luciana.ferreira@hefesto.com', senha_hash: hash, perfil_id: perfis[4].id }, + { id: uuid(), nome: 'Ricardo Almeida', email: 'ricardo.almeida@hefesto.com', senha_hash: hash, perfil_id: perfis[4].id }, + ]; + await this.userRepo.save(users); + + // Locais + const locais = [ + { id: uuid(), nome: 'Torre Norte - SP', endereco: 'Av. Paulista, 1000, São Paulo - SP', centro_custo_id: ccs[0].id, responsavel_id: users[2].id }, + { id: uuid(), nome: 'Torre Sul - SP', endereco: 'Av. Paulista, 1002, São Paulo - SP', centro_custo_id: ccs[0].id, responsavel_id: users[2].id }, + { id: uuid(), nome: 'Escritório RJ', endereco: 'Rua do Ouvidor, 50, Rio de Janeiro - RJ', centro_custo_id: ccs[1].id, responsavel_id: users[6].id }, + { id: uuid(), nome: 'CD Betim', endereco: 'Rod. Fernão Dias, km 492, Betim - MG', centro_custo_id: ccs[2].id, responsavel_id: users[2].id }, + { id: uuid(), nome: 'Fábrica Campinas', endereco: 'Distrito Industrial, Campinas - SP', centro_custo_id: ccs[4].id, responsavel_id: users[6].id }, + ]; + await this.localRepo.save(locais); + + // Categorias + const cats = [ + { id: uuid(), nome: 'Manutenção Predial', criticidade_padrao: 'media', sla_dias: 15 }, + { id: uuid(), nome: 'Climatização e HVAC', criticidade_padrao: 'alta', sla_dias: 7 }, + { id: uuid(), nome: 'Limpeza e Conservação', criticidade_padrao: 'baixa', sla_dias: 30 }, + { id: uuid(), nome: 'Segurança Patrimonial', criticidade_padrao: 'critica', sla_dias: 3 }, + { id: uuid(), nome: 'Elétrica e Iluminação', criticidade_padrao: 'alta', sla_dias: 10 }, + { id: uuid(), nome: 'Paisagismo', criticidade_padrao: 'baixa', sla_dias: 45 }, + { id: uuid(), nome: 'Dedetização e Controle de Pragas', criticidade_padrao: 'media', sla_dias: 15 }, + { id: uuid(), nome: 'Reforma e Adequação', criticidade_padrao: 'media', sla_dias: 60 }, + ]; + await this.catRepo.save(cats); + + // Fornecedores + const forns = [ + { id: uuid(), tipo_pessoa: 'PJ', cpf_cnpj: '12.345.678/0001-90', razao_social: 'TechClima Engenharia Ltda', nome_fantasia: 'TechClima', email: 'contato@techclima.com.br', telefone: '(11) 3456-7890', rating: 4.5, usuario_id: users[7].id, categorias_atendidas: [cats[1].id] }, + { id: uuid(), tipo_pessoa: 'PJ', cpf_cnpj: '23.456.789/0001-01', razao_social: 'ServiLimp Serviços de Limpeza S/A', nome_fantasia: 'ServiLimp', email: 'comercial@servilimp.com.br', telefone: '(11) 2345-6789', rating: 3.8, usuario_id: users[8].id, categorias_atendidas: [cats[2].id] }, + { id: uuid(), tipo_pessoa: 'PJ', cpf_cnpj: '34.567.890/0001-12', razao_social: 'Forte Segurança Empresarial Ltda', nome_fantasia: 'Forte Seg', email: 'propostas@forteseg.com.br', telefone: '(21) 3456-7890', rating: 4.2, usuario_id: users[9].id, categorias_atendidas: [cats[3].id] }, + { id: uuid(), tipo_pessoa: 'PJ', cpf_cnpj: '45.678.901/0001-23', razao_social: 'EletroForce Instalações Elétricas', nome_fantasia: 'EletroForce', email: 'orcamento@eletroforce.com.br', telefone: '(11) 4567-8901', rating: 4.0, categorias_atendidas: [cats[4].id] }, + { id: uuid(), tipo_pessoa: 'PJ', cpf_cnpj: '56.789.012/0001-34', razao_social: 'Predial Master Engenharia', nome_fantasia: 'Predial Master', email: 'contato@predialmaster.com.br', telefone: '(11) 5678-9012', rating: 4.7, categorias_atendidas: [cats[0].id, cats[7].id] }, + ]; + await this.fornRepo.save(forns); + + // Certidões + const certs = [ + { id: uuid(), fornecedor_id: forns[0].id, tipo: 'CND Federal', numero: 'CND-2026-001', data_emissao: '2026-01-10', data_validade: '2026-07-10', status: 'vigente' }, + { id: uuid(), fornecedor_id: forns[0].id, tipo: 'CND Estadual', numero: 'CND-2026-002', data_emissao: '2026-01-15', data_validade: '2026-07-15', status: 'vigente' }, + { id: uuid(), fornecedor_id: forns[1].id, tipo: 'CND Federal', numero: 'CND-2025-100', data_emissao: '2025-06-01', data_validade: '2025-12-01', status: 'vencida' }, + { id: uuid(), fornecedor_id: forns[2].id, tipo: 'CND Federal', numero: 'CND-2026-050', data_emissao: '2026-01-20', data_validade: '2026-07-20', status: 'vigente' }, + { id: uuid(), fornecedor_id: forns[2].id, tipo: 'FGTS', numero: 'CRF-2026-003', data_emissao: '2026-01-05', data_validade: '2026-02-05', status: 'vigente' }, + { id: uuid(), fornecedor_id: forns[3].id, tipo: 'CND Municipal', numero: 'CND-2026-080', data_emissao: '2025-12-15', data_validade: '2026-06-15', status: 'vigente' }, + { id: uuid(), fornecedor_id: forns[4].id, tipo: 'CND Federal', numero: 'CND-2026-200', data_emissao: '2026-02-01', data_validade: '2026-08-01', status: 'vigente' }, + { id: uuid(), fornecedor_id: forns[4].id, tipo: 'CND Trabalhista', numero: 'CNDT-2026-010', data_emissao: '2026-01-25', data_validade: '2026-07-25', status: 'vigente' }, + ]; + await this.certRepo.save(certs); + + // Demandas + const demandas = [ + { id: uuid(), numero: 1, titulo: 'Manutenção preventiva ar-condicionado Torre Norte', descricao: 'Revisão semestral de todos os 48 splits e 6 centrais de ar', local_id: locais[0].id, centro_custo_id: ccs[0].id, categoria_id: cats[1].id, criticidade: 'alta', status: 'em_cotacao', solicitante_id: users[1].id, gestor_id: users[2].id, data_desejada: '2026-03-15' }, + { id: uuid(), numero: 2, titulo: 'Contratação de serviço de limpeza - Escritório RJ', descricao: 'Limpeza diária do escritório RJ - 2 pavimentos, 800m²', local_id: locais[2].id, centro_custo_id: ccs[1].id, categoria_id: cats[2].id, criticidade: 'media', status: 'propostas_recebidas', solicitante_id: users[5].id, gestor_id: users[6].id }, + { id: uuid(), numero: 3, titulo: 'Instalação de câmeras de segurança - CD Betim', descricao: 'Instalação de 32 câmeras IP + NVR + cabeamento', local_id: locais[3].id, centro_custo_id: ccs[2].id, categoria_id: cats[3].id, criticidade: 'critica', status: 'em_aprovacao', solicitante_id: users[1].id, gestor_id: users[2].id }, + { id: uuid(), numero: 4, titulo: 'Troca de iluminação para LED - Torre Sul', descricao: 'Substituição de 500 lâmpadas fluorescentes por LED', local_id: locais[1].id, centro_custo_id: ccs[0].id, categoria_id: cats[4].id, criticidade: 'media', status: 'aprovada', solicitante_id: users[5].id, gestor_id: users[2].id }, + { id: uuid(), numero: 5, titulo: 'Reforma do refeitório - Fábrica Campinas', descricao: 'Reforma completa: piso, pintura, bancadas, instalações', local_id: locais[4].id, centro_custo_id: ccs[4].id, categoria_id: cats[7].id, criticidade: 'media', status: 'em_execucao', solicitante_id: users[1].id, gestor_id: users[6].id }, + { id: uuid(), numero: 6, titulo: 'Dedetização trimestral - Todas as unidades', descricao: 'Controle de pragas urbanas em todas as 5 unidades', local_id: locais[0].id, centro_custo_id: ccs[0].id, categoria_id: cats[6].id, criticidade: 'baixa', status: 'aberta', solicitante_id: users[5].id }, + { id: uuid(), numero: 7, titulo: 'Reparo no telhado - CD Betim', descricao: 'Vazamento em 3 pontos do galpão principal', local_id: locais[3].id, centro_custo_id: ccs[2].id, categoria_id: cats[0].id, criticidade: 'alta', status: 'em_escopo', solicitante_id: users[1].id, gestor_id: users[2].id }, + { id: uuid(), numero: 8, titulo: 'Manutenção do paisagismo - Sede SP', descricao: 'Poda, jardinagem e manutenção das áreas verdes', local_id: locais[0].id, centro_custo_id: ccs[0].id, categoria_id: cats[5].id, criticidade: 'baixa', status: 'rascunho', solicitante_id: users[5].id }, + { id: uuid(), numero: 9, titulo: 'Instalação de gerador de emergência - Torre Norte', descricao: 'Gerador diesel 500kVA com QTA', local_id: locais[0].id, centro_custo_id: ccs[0].id, categoria_id: cats[4].id, criticidade: 'critica', status: 'concluida', solicitante_id: users[1].id, gestor_id: users[2].id }, + { id: uuid(), numero: 10, titulo: 'Adequação NR-10 - Fábrica Campinas', descricao: 'Adequação de quadros e instalações elétricas à NR-10', local_id: locais[4].id, centro_custo_id: ccs[4].id, categoria_id: cats[4].id, criticidade: 'alta', status: 'cancelada', solicitante_id: users[5].id, gestor_id: users[6].id }, + ]; + await this.demandaRepo.save(demandas); + + // Itens de Linha + const itens = [ + { id: uuid(), demanda_id: demandas[0].id, descricao: 'Revisão splits 9000 BTUs (24 un)', tipo: 'mao_de_obra', quantidade: 24, unidade: 'un', ordem: 1 }, + { id: uuid(), demanda_id: demandas[0].id, descricao: 'Revisão splits 12000 BTUs (18 un)', tipo: 'mao_de_obra', quantidade: 18, unidade: 'un', ordem: 2 }, + { id: uuid(), demanda_id: demandas[0].id, descricao: 'Revisão splits 18000 BTUs (6 un)', tipo: 'mao_de_obra', quantidade: 6, unidade: 'un', ordem: 3 }, + { id: uuid(), demanda_id: demandas[0].id, descricao: 'Revisão centrais de ar (6 un)', tipo: 'mao_de_obra', quantidade: 6, unidade: 'un', ordem: 4 }, + { id: uuid(), demanda_id: demandas[0].id, descricao: 'Filtros de reposição', tipo: 'material', quantidade: 54, unidade: 'un', ordem: 5 }, + { id: uuid(), demanda_id: demandas[2].id, descricao: 'Câmera IP 4MP Hikvision', tipo: 'material', quantidade: 32, unidade: 'un', ordem: 1 }, + { id: uuid(), demanda_id: demandas[2].id, descricao: 'NVR 32 canais', tipo: 'equipamento', quantidade: 1, unidade: 'un', ordem: 2 }, + { id: uuid(), demanda_id: demandas[2].id, descricao: 'Cabo UTP Cat6 (caixa 305m)', tipo: 'material', quantidade: 4, unidade: 'cx', ordem: 3 }, + { id: uuid(), demanda_id: demandas[2].id, descricao: 'Instalação e configuração', tipo: 'mao_de_obra', quantidade: 1, unidade: 'vb', ordem: 4 }, + { id: uuid(), demanda_id: demandas[4].id, descricao: 'Demolição e remoção', tipo: 'mao_de_obra', quantidade: 1, unidade: 'vb', ordem: 1 }, + { id: uuid(), demanda_id: demandas[4].id, descricao: 'Piso porcelanato 60x60', tipo: 'material', quantidade: 120, unidade: 'm²', ordem: 2 }, + { id: uuid(), demanda_id: demandas[4].id, descricao: 'Pintura epóxi paredes', tipo: 'mao_de_obra', quantidade: 280, unidade: 'm²', ordem: 3 }, + ]; + await this.itemRepo.save(itens); + + // Propostas + const propostas = [ + // Demanda 1 - Ar condicionado + { id: uuid(), demanda_id: demandas[0].id, fornecedor_id: forns[0].id, valor_bruto: 48500, valor_liquido: 42350, impostos: { iss: 2425, inss: 2425, pcc: 1300 }, condicao_pagamento: '30/60 dias', prazo_execucao_dias: 15, status: 'recebida', match_escopo_pct: 95 }, + { id: uuid(), demanda_id: demandas[0].id, fornecedor_id: forns[3].id, valor_bruto: 52000, valor_liquido: 45500, impostos: { iss: 2600, inss: 2600, pcc: 1300 }, condicao_pagamento: '30 dias', prazo_execucao_dias: 10, status: 'recebida', match_escopo_pct: 88 }, + // Demanda 2 - Limpeza + { id: uuid(), demanda_id: demandas[1].id, fornecedor_id: forns[1].id, valor_bruto: 18500, valor_liquido: 16200, impostos: { iss: 925, inss: 925, pcc: 450 }, condicao_pagamento: 'Mensal', prazo_execucao_dias: 365, status: 'analisada', match_escopo_pct: 100 }, + { id: uuid(), demanda_id: demandas[1].id, fornecedor_id: forns[4].id, valor_bruto: 21000, valor_liquido: 18400, impostos: { iss: 1050, inss: 1050, pcc: 500 }, condicao_pagamento: 'Mensal', prazo_execucao_dias: 365, status: 'recebida', match_escopo_pct: 92 }, + // Demanda 3 - Câmeras + { id: uuid(), demanda_id: demandas[2].id, fornecedor_id: forns[2].id, valor_bruto: 145000, valor_liquido: 126800, impostos: { iss: 7250, inss: 7250, pcc: 3700 }, condicao_pagamento: '30/60/90 dias', prazo_execucao_dias: 30, status: 'selecionada', selecionada: true, match_escopo_pct: 97 }, + { id: uuid(), demanda_id: demandas[2].id, fornecedor_id: forns[3].id, valor_bruto: 158000, valor_liquido: 138200, impostos: { iss: 7900, inss: 7900, pcc: 4000 }, condicao_pagamento: '50% + 50%', prazo_execucao_dias: 25, status: 'rejeitada', match_escopo_pct: 85 }, + { id: uuid(), demanda_id: demandas[2].id, fornecedor_id: forns[4].id, valor_bruto: 139000, valor_liquido: 121600, impostos: { iss: 6950, inss: 6950, pcc: 3500 }, condicao_pagamento: '30/60/90 dias', prazo_execucao_dias: 35, status: 'rejeitada', match_escopo_pct: 90 }, + // Demanda 4 - LED + { id: uuid(), demanda_id: demandas[3].id, fornecedor_id: forns[3].id, valor_bruto: 75000, valor_liquido: 65600, impostos: { iss: 3750, inss: 3750, pcc: 1900 }, condicao_pagamento: '30/60 dias', prazo_execucao_dias: 20, status: 'selecionada', selecionada: true, match_escopo_pct: 98 }, + { id: uuid(), demanda_id: demandas[3].id, fornecedor_id: forns[0].id, valor_bruto: 82000, valor_liquido: 71800, impostos: { iss: 4100, inss: 4100, pcc: 2000 }, condicao_pagamento: '30 dias', prazo_execucao_dias: 25, status: 'rejeitada', match_escopo_pct: 93 }, + // Demanda 5 - Reforma refeitório + { id: uuid(), demanda_id: demandas[4].id, fornecedor_id: forns[4].id, valor_bruto: 280000, valor_liquido: 245000, impostos: { iss: 14000, inss: 14000, pcc: 7000 }, condicao_pagamento: 'Medição mensal', prazo_execucao_dias: 90, status: 'selecionada', selecionada: true, match_escopo_pct: 100 }, + { id: uuid(), demanda_id: demandas[4].id, fornecedor_id: forns[3].id, valor_bruto: 310000, valor_liquido: 271200, impostos: { iss: 15500, inss: 15500, pcc: 7800 }, condicao_pagamento: '30/60/90 dias', prazo_execucao_dias: 75, status: 'rejeitada', match_escopo_pct: 88 }, + // Demanda 9 - Gerador + { id: uuid(), demanda_id: demandas[8].id, fornecedor_id: forns[3].id, valor_bruto: 320000, valor_liquido: 280000, impostos: { iss: 16000, inss: 16000, pcc: 8000 }, condicao_pagamento: '50% + 50%', prazo_execucao_dias: 45, status: 'selecionada', selecionada: true, match_escopo_pct: 96 }, + { id: uuid(), demanda_id: demandas[8].id, fornecedor_id: forns[4].id, valor_bruto: 295000, valor_liquido: 258100, impostos: { iss: 14750, inss: 14750, pcc: 7400 }, condicao_pagamento: '30/60/90 dias', prazo_execucao_dias: 60, status: 'rejeitada', match_escopo_pct: 91 }, + { id: uuid(), demanda_id: demandas[8].id, fornecedor_id: forns[0].id, valor_bruto: 345000, valor_liquido: 301800, impostos: { iss: 17250, inss: 17250, pcc: 8700 }, condicao_pagamento: '30 dias', prazo_execucao_dias: 40, status: 'rejeitada', match_escopo_pct: 82 }, + ]; + await this.propRepo.save(propostas); + + // Workflow + const workflows = [ + { id: uuid(), demanda_id: demandas[2].id, proposta_id: propostas[4].id, valor_total: 145000, status: 'em_andamento', etapa_atual: 2, etapas: [ + { ordem: 1, perfil: 'gestor_facilities', status: 'aprovado', data_acao: '2026-02-05T10:00:00Z', observacao: 'Projeto necessário para segurança', ressalva: false }, + { ordem: 2, perfil: 'aprovador_financeiro', status: 'pendente', data_acao: null, observacao: null, ressalva: false }, + { ordem: 3, perfil: 'diretoria', status: 'pendente', data_acao: null, observacao: null, ressalva: false }, + ]}, + { id: uuid(), demanda_id: demandas[3].id, proposta_id: propostas[7].id, valor_total: 75000, status: 'aprovado', etapa_atual: 3, etapas: [ + { ordem: 1, perfil: 'gestor_facilities', status: 'aprovado', data_acao: '2026-01-20T09:00:00Z', observacao: 'OK', ressalva: false }, + { ordem: 2, perfil: 'aprovador_financeiro', status: 'aprovado', data_acao: '2026-01-21T14:00:00Z', observacao: 'Dentro do orçamento', ressalva: false }, + { ordem: 3, perfil: 'diretoria', status: 'aprovado', data_acao: '2026-01-22T11:00:00Z', observacao: 'Aprovado', ressalva: false }, + ]}, + { id: uuid(), demanda_id: demandas[4].id, proposta_id: propostas[9].id, valor_total: 280000, status: 'aprovado', etapa_atual: 3, etapas: [ + { ordem: 1, perfil: 'gestor_facilities', status: 'aprovado', data_acao: '2026-01-10T10:00:00Z', observacao: 'Urgente', ressalva: false }, + { ordem: 2, perfil: 'aprovador_financeiro', status: 'aprovado_com_ressalva', data_acao: '2026-01-11T16:00:00Z', observacao: 'Verificar possibilidade de parcelamento maior', ressalva: true }, + { ordem: 3, perfil: 'diretoria', status: 'aprovado', data_acao: '2026-01-12T09:00:00Z', observacao: 'Aprovado', ressalva: false }, + ]}, + ]; + await this.wfRepo.save(workflows); + + // Ordens de Serviço + const oss = [ + { id: uuid(), numero: 1, demanda_id: demandas[3].id, proposta_id: propostas[7].id, fornecedor_id: forns[3].id, valor: 75000, status: 'emitida', data_inicio: null }, + { id: uuid(), numero: 2, demanda_id: demandas[4].id, proposta_id: propostas[9].id, fornecedor_id: forns[4].id, valor: 280000, status: 'em_execucao', data_inicio: '2026-01-20' }, + { id: uuid(), numero: 3, demanda_id: demandas[8].id, proposta_id: propostas[11].id, fornecedor_id: forns[3].id, valor: 320000, status: 'concluida', data_inicio: '2025-11-01', data_conclusao: '2025-12-15' }, + ]; + await this.osRepo.save(oss); + + // Orçamento Planejado 2026 + const orcData = []; + for (let mes = 1; mes <= 12; mes++) { + for (const cc of ccs) { + for (const cat of cats.slice(0, 5)) { + orcData.push({ + id: uuid(), + ano: 2026, + mes, + centro_custo_id: cc.id, + categoria_id: cat.id, + valor_planejado: Math.round((15000 + Math.random() * 85000) * 100) / 100, + valor_comprometido: mes <= 2 ? Math.round(Math.random() * 30000 * 100) / 100 : 0, + valor_realizado: mes <= 1 ? Math.round(Math.random() * 20000 * 100) / 100 : 0, + }); + } + } + } + // Save in batches + for (let i = 0; i < orcData.length; i += 50) { + await this.orcRepo.save(orcData.slice(i, i + 50)); + } + + // Alertas + const alertas = [ + { id: uuid(), usuario_id: users[3].id, tipo: 'aprovacao_pendente', titulo: 'Aprovação pendente: Câmeras CD Betim', mensagem: 'A demanda #3 aguarda sua aprovação financeira. Valor: R$ 145.000,00', entidade: 'workflow', entidade_id: workflows[0].id }, + { id: uuid(), usuario_id: users[2].id, tipo: 'sla_vencendo', titulo: 'SLA próximo: Dedetização', mensagem: 'A demanda #6 está há 10 dias sem andamento', entidade: 'demanda', entidade_id: demandas[5].id }, + { id: uuid(), usuario_id: users[0].id, tipo: 'certidao_vencendo', titulo: 'Certidão vencida: ServiLimp', mensagem: 'A CND Federal da ServiLimp está vencida desde 01/12/2025', entidade: 'fornecedor', entidade_id: forns[1].id }, + { id: uuid(), usuario_id: users[2].id, tipo: 'estouro_orcamento', titulo: 'Alerta de orçamento: CC Sede SP', mensagem: 'O centro de custo CC-001 está com comprometimento acima de 80% para Climatização em Janeiro', entidade: 'orcamento' }, + { id: uuid(), usuario_id: users[6].id, tipo: 'os_atrasada', titulo: 'OS em atraso: Reforma Refeitório', mensagem: 'A OS #2 está em execução há mais de 30 dias', entidade: 'ordem_servico', entidade_id: oss[1].id }, + ]; + await this.alertaRepo.save(alertas); + + console.log('✅ Seed completed!'); + } +} diff --git a/backend/src/main.ts b/backend/src/main.ts new file mode 100644 index 0000000..4b00585 --- /dev/null +++ b/backend/src/main.ts @@ -0,0 +1,18 @@ +import { NestFactory } from '@nestjs/core'; +import { ValidationPipe } from '@nestjs/common'; +import { AppModule } from './app.module'; +import { SeedService } from './database/seeds/seed.service'; + +async function bootstrap() { + const app = await NestFactory.create(AppModule); + app.setGlobalPrefix('api'); + app.enableCors({ origin: '*' }); + app.useGlobalPipes(new ValidationPipe({ transform: true, whitelist: true })); + + const seedService = app.get(SeedService); + await seedService.seed(); + + await app.listen(8080); + console.log('HEFESTO API running on http://localhost:8080'); +} +bootstrap(); diff --git a/backend/src/modules/auth/auth.controller.ts b/backend/src/modules/auth/auth.controller.ts new file mode 100644 index 0000000..a3819f7 --- /dev/null +++ b/backend/src/modules/auth/auth.controller.ts @@ -0,0 +1,20 @@ +import { Controller, Post, Body, Get, UseGuards, Request, SetMetadata } from '@nestjs/common'; +import { AuthService } from './auth.service'; +import { JwtAuthGuard } from '../../common/guards/jwt-auth.guard'; + +@Controller('auth') +export class AuthController { + constructor(private authService: AuthService) {} + + @SetMetadata('isPublic', true) + @Post('login') + async login(@Body() body: { email: string; senha: string }) { + return this.authService.login(body.email, body.senha); + } + + @UseGuards(JwtAuthGuard) + @Get('me') + async me(@Request() req) { + return this.authService.me(req.user.sub); + } +} diff --git a/backend/src/modules/auth/auth.module.ts b/backend/src/modules/auth/auth.module.ts new file mode 100644 index 0000000..ee5532c --- /dev/null +++ b/backend/src/modules/auth/auth.module.ts @@ -0,0 +1,24 @@ +import { Module } from '@nestjs/common'; +import { JwtModule } from '@nestjs/jwt'; +import { PassportModule } from '@nestjs/passport'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { AuthController } from './auth.controller'; +import { AuthService } from './auth.service'; +import { JwtStrategy } from './jwt.strategy'; +import { Usuario } from '../users/entities/usuario.entity'; +import { Perfil } from '../users/entities/perfil.entity'; + +@Module({ + imports: [ + TypeOrmModule.forFeature([Usuario, Perfil]), + PassportModule, + JwtModule.register({ + secret: 'hefesto-jwt-secret-2026', + signOptions: { expiresIn: '24h' }, + }), + ], + controllers: [AuthController], + providers: [AuthService, JwtStrategy], + exports: [AuthService, JwtModule], +}) +export class AuthModule {} diff --git a/backend/src/modules/auth/auth.service.ts b/backend/src/modules/auth/auth.service.ts new file mode 100644 index 0000000..89d24db --- /dev/null +++ b/backend/src/modules/auth/auth.service.ts @@ -0,0 +1,63 @@ +import { Injectable, UnauthorizedException } from '@nestjs/common'; +import { JwtService } from '@nestjs/jwt'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import * as bcrypt from 'bcryptjs'; +import { Usuario } from '../users/entities/usuario.entity'; +import { Perfil } from '../users/entities/perfil.entity'; + +@Injectable() +export class AuthService { + constructor( + @InjectRepository(Usuario) private userRepo: Repository, + @InjectRepository(Perfil) private perfilRepo: Repository, + private jwtService: JwtService, + ) {} + + async login(email: string, senha: string) { + const user = await this.userRepo.findOne({ + where: { email, ativo: true }, + relations: ['perfil'], + }); + if (!user) throw new UnauthorizedException('Credenciais inválidas'); + + const valid = await bcrypt.compare(senha, user.senha_hash); + if (!valid) throw new UnauthorizedException('Credenciais inválidas'); + + user.ultimo_acesso = new Date(); + await this.userRepo.save(user); + + const payload = { + sub: user.id, + email: user.email, + nome: user.nome, + perfil_id: user.perfil_id, + perfil_nome: user.perfil.nome, + }; + + return { + access_token: this.jwtService.sign(payload), + user: { + id: user.id, + nome: user.nome, + email: user.email, + perfil: user.perfil.nome, + perfil_id: user.perfil_id, + }, + }; + } + + async me(userId: string) { + const user = await this.userRepo.findOne({ + where: { id: userId }, + relations: ['perfil'], + }); + return { + id: user.id, + nome: user.nome, + email: user.email, + perfil: user.perfil.nome, + perfil_id: user.perfil_id, + }; + } +} diff --git a/backend/src/modules/auth/jwt.strategy.ts b/backend/src/modules/auth/jwt.strategy.ts new file mode 100644 index 0000000..be70cc6 --- /dev/null +++ b/backend/src/modules/auth/jwt.strategy.ts @@ -0,0 +1,24 @@ +import { Injectable } from '@nestjs/common'; +import { PassportStrategy } from '@nestjs/passport'; +import { ExtractJwt, Strategy } from 'passport-jwt'; + +@Injectable() +export class JwtStrategy extends PassportStrategy(Strategy) { + constructor() { + super({ + jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), + ignoreExpiration: false, + secretOrKey: 'hefesto-jwt-secret-2026', + }); + } + + async validate(payload: any) { + return { + sub: payload.sub, + email: payload.email, + nome: payload.nome, + perfil_id: payload.perfil_id, + perfil_nome: payload.perfil_nome, + }; + } +} diff --git a/backend/src/modules/categorias/categorias.controller.ts b/backend/src/modules/categorias/categorias.controller.ts new file mode 100644 index 0000000..924085b --- /dev/null +++ b/backend/src/modules/categorias/categorias.controller.ts @@ -0,0 +1,13 @@ +import { Controller, Get, Post, Patch, Delete, Body, Param } from '@nestjs/common'; +import { CategoriasService } from './categorias.service'; + +@Controller('categorias') +export class CategoriasController { + constructor(private svc: CategoriasService) {} + + @Get() findAll() { return this.svc.findAll(); } + @Get(':id') findOne(@Param('id') id: string) { return this.svc.findOne(id); } + @Post() create(@Body() body: any) { return this.svc.create(body); } + @Patch(':id') update(@Param('id') id: string, @Body() body: any) { return this.svc.update(id, body); } + @Delete(':id') remove(@Param('id') id: string) { return this.svc.remove(id); } +} diff --git a/backend/src/modules/categorias/categorias.module.ts b/backend/src/modules/categorias/categorias.module.ts new file mode 100644 index 0000000..8a7feb6 --- /dev/null +++ b/backend/src/modules/categorias/categorias.module.ts @@ -0,0 +1,13 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { Categoria } from './entities/categoria.entity'; +import { CategoriasController } from './categorias.controller'; +import { CategoriasService } from './categorias.service'; + +@Module({ + imports: [TypeOrmModule.forFeature([Categoria])], + controllers: [CategoriasController], + providers: [CategoriasService], + exports: [CategoriasService], +}) +export class CategoriasModule {} diff --git a/backend/src/modules/categorias/categorias.service.ts b/backend/src/modules/categorias/categorias.service.ts new file mode 100644 index 0000000..4950f7d --- /dev/null +++ b/backend/src/modules/categorias/categorias.service.ts @@ -0,0 +1,14 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { Categoria } from './entities/categoria.entity'; + +@Injectable() +export class CategoriasService { + constructor(@InjectRepository(Categoria) private repo: Repository) {} + findAll() { return this.repo.find({ where: { ativo: true } }); } + findOne(id: string) { return this.repo.findOne({ where: { id } }); } + create(data: Partial) { return this.repo.save(data); } + async update(id: string, data: Partial) { await this.repo.update(id, data); return this.findOne(id); } + async remove(id: string) { await this.repo.update(id, { ativo: false }); } +} diff --git a/backend/src/modules/categorias/entities/categoria.entity.ts b/backend/src/modules/categorias/entities/categoria.entity.ts new file mode 100644 index 0000000..249f08d --- /dev/null +++ b/backend/src/modules/categorias/entities/categoria.entity.ts @@ -0,0 +1,31 @@ +import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm'; + +@Entity('categorias') +export class Categoria { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column({ length: 200 }) + nome: string; + + @Column({ length: 200, nullable: true }) + subcategoria: string; + + @Column({ length: 20, nullable: true }) + criticidade_padrao: string; + + @Column({ default: 30 }) + sla_dias: number; + + @Column({ nullable: true }) + categoria_pai_id: string; + + @Column({ default: true }) + ativo: boolean; + + @CreateDateColumn() + created_at: Date; + + @UpdateDateColumn() + updated_at: Date; +} diff --git a/backend/src/modules/centros-custo/centros-custo.controller.ts b/backend/src/modules/centros-custo/centros-custo.controller.ts new file mode 100644 index 0000000..7b9f8da --- /dev/null +++ b/backend/src/modules/centros-custo/centros-custo.controller.ts @@ -0,0 +1,13 @@ +import { Controller, Get, Post, Patch, Delete, Body, Param } from '@nestjs/common'; +import { CentrosCustoService } from './centros-custo.service'; + +@Controller('centros-custo') +export class CentrosCustoController { + constructor(private svc: CentrosCustoService) {} + + @Get() findAll() { return this.svc.findAll(); } + @Get(':id') findOne(@Param('id') id: string) { return this.svc.findOne(id); } + @Post() create(@Body() body: any) { return this.svc.create(body); } + @Patch(':id') update(@Param('id') id: string, @Body() body: any) { return this.svc.update(id, body); } + @Delete(':id') remove(@Param('id') id: string) { return this.svc.remove(id); } +} diff --git a/backend/src/modules/centros-custo/centros-custo.module.ts b/backend/src/modules/centros-custo/centros-custo.module.ts new file mode 100644 index 0000000..ba197d6 --- /dev/null +++ b/backend/src/modules/centros-custo/centros-custo.module.ts @@ -0,0 +1,13 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { CentroCusto } from './entities/centro-custo.entity'; +import { CentrosCustoController } from './centros-custo.controller'; +import { CentrosCustoService } from './centros-custo.service'; + +@Module({ + imports: [TypeOrmModule.forFeature([CentroCusto])], + controllers: [CentrosCustoController], + providers: [CentrosCustoService], + exports: [CentrosCustoService], +}) +export class CentrosCustoModule {} diff --git a/backend/src/modules/centros-custo/centros-custo.service.ts b/backend/src/modules/centros-custo/centros-custo.service.ts new file mode 100644 index 0000000..46790fc --- /dev/null +++ b/backend/src/modules/centros-custo/centros-custo.service.ts @@ -0,0 +1,14 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { CentroCusto } from './entities/centro-custo.entity'; + +@Injectable() +export class CentrosCustoService { + constructor(@InjectRepository(CentroCusto) private repo: Repository) {} + findAll() { return this.repo.find({ where: { ativo: true } }); } + findOne(id: string) { return this.repo.findOne({ where: { id } }); } + create(data: Partial) { return this.repo.save(data); } + async update(id: string, data: Partial) { await this.repo.update(id, data); return this.findOne(id); } + async remove(id: string) { await this.repo.update(id, { ativo: false }); } +} diff --git a/backend/src/modules/centros-custo/entities/centro-custo.entity.ts b/backend/src/modules/centros-custo/entities/centro-custo.entity.ts new file mode 100644 index 0000000..322e442 --- /dev/null +++ b/backend/src/modules/centros-custo/entities/centro-custo.entity.ts @@ -0,0 +1,25 @@ +import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm'; + +@Entity('centros_custo') +export class CentroCusto { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column({ unique: true, length: 20 }) + codigo: string; + + @Column({ length: 200 }) + nome: string; + + @Column({ nullable: true }) + responsavel_id: string; + + @Column({ default: true }) + ativo: boolean; + + @CreateDateColumn() + created_at: Date; + + @UpdateDateColumn() + updated_at: Date; +} diff --git a/backend/src/modules/dashboard/dashboard.controller.ts b/backend/src/modules/dashboard/dashboard.controller.ts new file mode 100644 index 0000000..e520cb2 --- /dev/null +++ b/backend/src/modules/dashboard/dashboard.controller.ts @@ -0,0 +1,13 @@ +import { Controller, Get, Patch, Param, Query } from '@nestjs/common'; +import { DashboardService } from './dashboard.service'; + +@Controller('dashboard') +export class DashboardController { + constructor(private svc: DashboardService) {} + + @Get('indicadores') indicadores() { return this.svc.indicadores(); } + @Get('demandas-por-status') demandasPorStatus() { return this.svc.demandasPorStatus(); } + @Get('consumo-orcamento') consumoOrcamento(@Query('ano') ano: string) { return this.svc.consumoOrcamento(parseInt(ano) || 2026); } + @Get('alertas') alertas(@Query('usuario_id') uid: string) { return this.svc.alertas(uid); } + @Patch('alertas/:id/ler') marcarLido(@Param('id') id: string) { return this.svc.marcarAlertaLido(id); } +} diff --git a/backend/src/modules/dashboard/dashboard.module.ts b/backend/src/modules/dashboard/dashboard.module.ts new file mode 100644 index 0000000..824aaec --- /dev/null +++ b/backend/src/modules/dashboard/dashboard.module.ts @@ -0,0 +1,19 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { Demanda } from '../demandas/entities/demanda.entity'; +import { Proposta } from '../propostas/entities/proposta.entity'; +import { OrdemServico } from '../ordens-servico/entities/ordem-servico.entity'; +import { OrcamentoPlanejado } from '../orcamento/entities/orcamento-planejado.entity'; +import { WorkflowAprovacao } from '../workflow/entities/workflow-aprovacao.entity'; +import { Alerta } from './entities/alerta.entity'; +import { AuditLog } from './entities/audit-log.entity'; +import { DashboardController } from './dashboard.controller'; +import { DashboardService } from './dashboard.service'; + +@Module({ + imports: [TypeOrmModule.forFeature([Demanda, Proposta, OrdemServico, OrcamentoPlanejado, WorkflowAprovacao, Alerta, AuditLog])], + controllers: [DashboardController], + providers: [DashboardService], + exports: [DashboardService], +}) +export class DashboardModule {} diff --git a/backend/src/modules/dashboard/dashboard.service.ts b/backend/src/modules/dashboard/dashboard.service.ts new file mode 100644 index 0000000..9647eb1 --- /dev/null +++ b/backend/src/modules/dashboard/dashboard.service.ts @@ -0,0 +1,73 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { Demanda } from '../demandas/entities/demanda.entity'; +import { Proposta } from '../propostas/entities/proposta.entity'; +import { OrdemServico } from '../ordens-servico/entities/ordem-servico.entity'; +import { OrcamentoPlanejado } from '../orcamento/entities/orcamento-planejado.entity'; +import { WorkflowAprovacao } from '../workflow/entities/workflow-aprovacao.entity'; +import { Alerta } from './entities/alerta.entity'; + +@Injectable() +export class DashboardService { + constructor( + @InjectRepository(Demanda) private demandaRepo: Repository, + @InjectRepository(Proposta) private propostaRepo: Repository, + @InjectRepository(OrdemServico) private osRepo: Repository, + @InjectRepository(OrcamentoPlanejado) private orcRepo: Repository, + @InjectRepository(WorkflowAprovacao) private wfRepo: Repository, + @InjectRepository(Alerta) private alertaRepo: Repository, + ) {} + + async indicadores() { + const demandas = await this.demandaRepo.find(); + const os = await this.osRepo.find(); + const wf = await this.wfRepo.find(); + const alertas = await this.alertaRepo.find({ where: { lido: false } }); + + return { + demandas_abertas: demandas.filter(d => ['aberta', 'em_escopo'].includes(d.status)).length, + em_cotacao: demandas.filter(d => d.status === 'em_cotacao').length, + pendentes: demandas.filter(d => ['propostas_recebidas', 'em_comparacao'].includes(d.status)).length, + em_aprovacao: wf.filter(w => ['pendente', 'em_andamento'].includes(w.status)).length, + os_ativas: os.filter(o => ['emitida', 'em_execucao'].includes(o.status)).length, + alertas: alertas.length, + }; + } + + async demandasPorStatus() { + const demandas = await this.demandaRepo.find(); + const statusCount: Record = {}; + for (const d of demandas) { + statusCount[d.status] = (statusCount[d.status] || 0) + 1; + } + return Object.entries(statusCount).map(([name, value]) => ({ name, value })); + } + + async consumoOrcamento(ano: number) { + const items = await this.orcRepo.find({ where: { ano } }); + const meses = ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez']; + const byMonth: Record = {}; + for (const item of items) { + if (!byMonth[item.mes]) byMonth[item.mes] = { name: meses[item.mes - 1], planejado: 0, comprometido: 0, realizado: 0 }; + byMonth[item.mes].planejado += item.valor_planejado; + byMonth[item.mes].comprometido += item.valor_comprometido; + byMonth[item.mes].realizado += item.valor_realizado; + } + return Object.values(byMonth).sort((a: any, b: any) => { + const ai = meses.indexOf(a.name); + const bi = meses.indexOf(b.name); + return ai - bi; + }); + } + + async alertas(usuarioId?: string) { + const where: any = { lido: false }; + if (usuarioId) where.usuario_id = usuarioId; + return this.alertaRepo.find({ where, order: { created_at: 'DESC' }, take: 20 }); + } + + async marcarAlertaLido(id: string) { + await this.alertaRepo.update(id, { lido: true }); + } +} diff --git a/backend/src/modules/dashboard/entities/alerta.entity.ts b/backend/src/modules/dashboard/entities/alerta.entity.ts new file mode 100644 index 0000000..5c3d3e8 --- /dev/null +++ b/backend/src/modules/dashboard/entities/alerta.entity.ts @@ -0,0 +1,31 @@ +import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn } from 'typeorm'; + +@Entity('alertas') +export class Alerta { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column() + usuario_id: string; + + @Column({ length: 50 }) + tipo: string; + + @Column({ length: 300 }) + titulo: string; + + @Column({ type: 'text', nullable: true }) + mensagem: string; + + @Column({ length: 50, nullable: true }) + entidade: string; + + @Column({ nullable: true }) + entidade_id: string; + + @Column({ default: false }) + lido: boolean; + + @CreateDateColumn() + created_at: Date; +} diff --git a/backend/src/modules/dashboard/entities/audit-log.entity.ts b/backend/src/modules/dashboard/entities/audit-log.entity.ts new file mode 100644 index 0000000..59c3b99 --- /dev/null +++ b/backend/src/modules/dashboard/entities/audit-log.entity.ts @@ -0,0 +1,34 @@ +import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn } from 'typeorm'; + +@Entity('audit_log') +export class AuditLog { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column({ nullable: true }) + usuario_id: string; + + @Column({ length: 50 }) + acao: string; + + @Column({ length: 50 }) + entidade: string; + + @Column({ nullable: true }) + entidade_id: string; + + @Column({ type: 'simple-json', nullable: true }) + dados_antes: any; + + @Column({ type: 'simple-json', nullable: true }) + dados_depois: any; + + @Column({ length: 45, nullable: true }) + ip: string; + + @Column({ type: 'text', nullable: true }) + user_agent: string; + + @CreateDateColumn() + created_at: Date; +} diff --git a/backend/src/modules/demandas/demandas.controller.ts b/backend/src/modules/demandas/demandas.controller.ts new file mode 100644 index 0000000..727f109 --- /dev/null +++ b/backend/src/modules/demandas/demandas.controller.ts @@ -0,0 +1,27 @@ +import { Controller, Get, Post, Patch, Delete, Body, Param, Query } from '@nestjs/common'; +import { DemandasService } from './demandas.service'; + +@Controller('demandas') +export class DemandasController { + constructor(private svc: DemandasService) {} + + @Get() findAll(@Query() query: any) { return this.svc.findAll(query); } + @Get(':id') findOne(@Param('id') id: string) { return this.svc.findOne(id); } + @Post() create(@Body() body: any) { return this.svc.create(body); } + @Patch(':id') update(@Param('id') id: string, @Body() body: any) { return this.svc.update(id, body); } + + @Post(':id/publicar') publicar(@Param('id') id: string) { return this.svc.updateStatus(id, 'aberta'); } + @Post(':id/cancelar') cancelar(@Param('id') id: string) { return this.svc.updateStatus(id, 'cancelada'); } + @Post(':id/enviar-cotacao') enviarCotacao(@Param('id') id: string) { return this.svc.updateStatus(id, 'em_cotacao'); } + + @Get(':id/itens-linha') itens(@Param('id') id: string) { return this.svc.findItens(id); } + @Post(':id/itens-linha') createItem(@Param('id') id: string, @Body() body: any) { + return this.svc.createItem({ ...body, demanda_id: id }); + } + @Patch(':id/itens-linha/:itemId') updateItem(@Param('itemId') itemId: string, @Body() body: any) { + return this.svc.updateItem(itemId, body); + } + @Delete(':id/itens-linha/:itemId') removeItem(@Param('itemId') itemId: string) { + return this.svc.removeItem(itemId); + } +} diff --git a/backend/src/modules/demandas/demandas.module.ts b/backend/src/modules/demandas/demandas.module.ts new file mode 100644 index 0000000..0c600da --- /dev/null +++ b/backend/src/modules/demandas/demandas.module.ts @@ -0,0 +1,14 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { Demanda } from './entities/demanda.entity'; +import { ItemLinha } from './entities/item-linha.entity'; +import { DemandasController } from './demandas.controller'; +import { DemandasService } from './demandas.service'; + +@Module({ + imports: [TypeOrmModule.forFeature([Demanda, ItemLinha])], + controllers: [DemandasController], + providers: [DemandasService], + exports: [DemandasService], +}) +export class DemandasModule {} diff --git a/backend/src/modules/demandas/demandas.service.ts b/backend/src/modules/demandas/demandas.service.ts new file mode 100644 index 0000000..9f828d0 --- /dev/null +++ b/backend/src/modules/demandas/demandas.service.ts @@ -0,0 +1,35 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { Demanda } from './entities/demanda.entity'; +import { ItemLinha } from './entities/item-linha.entity'; + +@Injectable() +export class DemandasService { + constructor( + @InjectRepository(Demanda) private repo: Repository, + @InjectRepository(ItemLinha) private itemRepo: Repository, + ) {} + + findAll(query?: any) { + const where: any = {}; + if (query?.status) where.status = query.status; + if (query?.centro_custo_id) where.centro_custo_id = query.centro_custo_id; + if (query?.categoria_id) where.categoria_id = query.categoria_id; + return this.repo.find({ where, relations: ['itens_linha'], order: { created_at: 'DESC' } }); + } + + findOne(id: string) { return this.repo.findOne({ where: { id }, relations: ['itens_linha'] }); } + create(data: Partial) { return this.repo.save(data); } + async update(id: string, data: Partial) { await this.repo.update(id, data); return this.findOne(id); } + + async updateStatus(id: string, status: string) { + await this.repo.update(id, { status }); + return this.findOne(id); + } + + findItens(demandaId: string) { return this.itemRepo.find({ where: { demanda_id: demandaId }, order: { ordem: 'ASC' } }); } + createItem(data: Partial) { return this.itemRepo.save(data); } + async updateItem(id: string, data: Partial) { await this.itemRepo.update(id, data); return this.itemRepo.findOne({ where: { id } }); } + async removeItem(id: string) { await this.itemRepo.delete(id); } +} diff --git a/backend/src/modules/demandas/entities/demanda.entity.ts b/backend/src/modules/demandas/entities/demanda.entity.ts new file mode 100644 index 0000000..6b83ae0 --- /dev/null +++ b/backend/src/modules/demandas/entities/demanda.entity.ts @@ -0,0 +1,53 @@ +import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, OneToMany } from 'typeorm'; +import { ItemLinha } from './item-linha.entity'; + +@Entity('demandas') +export class Demanda { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column({ type: 'integer', unique: true, nullable: true }) + numero: number; + + @Column({ length: 300 }) + titulo: string; + + @Column({ type: 'text', nullable: true }) + descricao: string; + + @Column() + local_id: string; + + @Column() + centro_custo_id: string; + + @Column() + categoria_id: string; + + @Column({ length: 20 }) + criticidade: string; + + @Column({ nullable: true }) + data_desejada: string; + + @Column({ length: 30, default: 'rascunho' }) + status: string; + + @Column() + solicitante_id: string; + + @Column({ nullable: true }) + gestor_id: string; + + @Column({ type: 'simple-json', default: '[]' }) + documentos: any; + + @OneToMany(() => ItemLinha, i => i.demanda) + itens_linha: ItemLinha[]; + + @CreateDateColumn() + created_at: Date; + + @UpdateDateColumn() + updated_at: Date; +} diff --git a/backend/src/modules/demandas/entities/item-linha.entity.ts b/backend/src/modules/demandas/entities/item-linha.entity.ts new file mode 100644 index 0000000..c0363d4 --- /dev/null +++ b/backend/src/modules/demandas/entities/item-linha.entity.ts @@ -0,0 +1,36 @@ +import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, ManyToOne, JoinColumn } from 'typeorm'; +import { Demanda } from './demanda.entity'; + +@Entity('itens_linha') +export class ItemLinha { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column() + demanda_id: string; + + @ManyToOne(() => Demanda, d => d.itens_linha) + @JoinColumn({ name: 'demanda_id' }) + demanda: Demanda; + + @Column({ length: 300 }) + descricao: string; + + @Column({ length: 50, nullable: true }) + tipo: string; + + @Column({ type: 'float', nullable: true }) + quantidade: number; + + @Column({ length: 30, nullable: true }) + unidade: string; + + @Column({ type: 'text', nullable: true }) + observacoes: string; + + @Column({ default: 0 }) + ordem: number; + + @CreateDateColumn() + created_at: Date; +} diff --git a/backend/src/modules/fornecedores/entities/certidao.entity.ts b/backend/src/modules/fornecedores/entities/certidao.entity.ts new file mode 100644 index 0000000..05cac50 --- /dev/null +++ b/backend/src/modules/fornecedores/entities/certidao.entity.ts @@ -0,0 +1,36 @@ +import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, ManyToOne, JoinColumn } from 'typeorm'; +import { Fornecedor } from './fornecedor.entity'; + +@Entity('certidoes') +export class Certidao { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column() + fornecedor_id: string; + + @ManyToOne(() => Fornecedor, f => f.certidoes) + @JoinColumn({ name: 'fornecedor_id' }) + fornecedor: Fornecedor; + + @Column({ length: 100 }) + tipo: string; + + @Column({ length: 100, nullable: true }) + numero: string; + + @Column() + data_emissao: string; + + @Column() + data_validade: string; + + @Column({ type: 'text', nullable: true }) + arquivo_url: string; + + @Column({ length: 20, default: 'vigente' }) + status: string; + + @CreateDateColumn() + created_at: Date; +} diff --git a/backend/src/modules/fornecedores/entities/fornecedor.entity.ts b/backend/src/modules/fornecedores/entities/fornecedor.entity.ts new file mode 100644 index 0000000..8d4d292 --- /dev/null +++ b/backend/src/modules/fornecedores/entities/fornecedor.entity.ts @@ -0,0 +1,50 @@ +import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, OneToMany } from 'typeorm'; +import { Certidao } from './certidao.entity'; + +@Entity('fornecedores') +export class Fornecedor { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column({ length: 10 }) + tipo_pessoa: string; + + @Column({ unique: true, length: 18 }) + cpf_cnpj: string; + + @Column({ length: 300 }) + razao_social: string; + + @Column({ length: 300, nullable: true }) + nome_fantasia: string; + + @Column({ length: 255, nullable: true }) + email: string; + + @Column({ length: 20, nullable: true }) + telefone: string; + + @Column({ type: 'text', nullable: true }) + endereco: string; + + @Column({ type: 'simple-json', nullable: true }) + categorias_atendidas: string[]; + + @Column({ type: 'float', default: 3.0 }) + rating: number; + + @Column({ nullable: true }) + usuario_id: string; + + @Column({ default: true }) + ativo: boolean; + + @OneToMany(() => Certidao, c => c.fornecedor) + certidoes: Certidao[]; + + @CreateDateColumn() + created_at: Date; + + @UpdateDateColumn() + updated_at: Date; +} diff --git a/backend/src/modules/fornecedores/fornecedores.controller.ts b/backend/src/modules/fornecedores/fornecedores.controller.ts new file mode 100644 index 0000000..62d0174 --- /dev/null +++ b/backend/src/modules/fornecedores/fornecedores.controller.ts @@ -0,0 +1,18 @@ +import { Controller, Get, Post, Patch, Delete, Body, Param } from '@nestjs/common'; +import { FornecedoresService } from './fornecedores.service'; + +@Controller('fornecedores') +export class FornecedoresController { + constructor(private svc: FornecedoresService) {} + + @Get() findAll() { return this.svc.findAll(); } + @Get(':id') findOne(@Param('id') id: string) { return this.svc.findOne(id); } + @Post() create(@Body() body: any) { return this.svc.create(body); } + @Patch(':id') update(@Param('id') id: string, @Body() body: any) { return this.svc.update(id, body); } + @Delete(':id') remove(@Param('id') id: string) { return this.svc.remove(id); } + + @Get(':id/certidoes') certidoes(@Param('id') id: string) { return this.svc.findCertidoes(id); } + @Post(':id/certidoes') createCertidao(@Param('id') id: string, @Body() body: any) { + return this.svc.createCertidao({ ...body, fornecedor_id: id }); + } +} diff --git a/backend/src/modules/fornecedores/fornecedores.module.ts b/backend/src/modules/fornecedores/fornecedores.module.ts new file mode 100644 index 0000000..f5b08bd --- /dev/null +++ b/backend/src/modules/fornecedores/fornecedores.module.ts @@ -0,0 +1,14 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { Fornecedor } from './entities/fornecedor.entity'; +import { Certidao } from './entities/certidao.entity'; +import { FornecedoresController } from './fornecedores.controller'; +import { FornecedoresService } from './fornecedores.service'; + +@Module({ + imports: [TypeOrmModule.forFeature([Fornecedor, Certidao])], + controllers: [FornecedoresController], + providers: [FornecedoresService], + exports: [FornecedoresService], +}) +export class FornecedoresModule {} diff --git a/backend/src/modules/fornecedores/fornecedores.service.ts b/backend/src/modules/fornecedores/fornecedores.service.ts new file mode 100644 index 0000000..053f4f1 --- /dev/null +++ b/backend/src/modules/fornecedores/fornecedores.service.ts @@ -0,0 +1,22 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { Fornecedor } from './entities/fornecedor.entity'; +import { Certidao } from './entities/certidao.entity'; + +@Injectable() +export class FornecedoresService { + constructor( + @InjectRepository(Fornecedor) private repo: Repository, + @InjectRepository(Certidao) private certRepo: Repository, + ) {} + + findAll() { return this.repo.find({ where: { ativo: true }, relations: ['certidoes'] }); } + findOne(id: string) { return this.repo.findOne({ where: { id }, relations: ['certidoes'] }); } + create(data: Partial) { return this.repo.save(data); } + async update(id: string, data: Partial) { await this.repo.update(id, data); return this.findOne(id); } + async remove(id: string) { await this.repo.update(id, { ativo: false }); } + + findCertidoes(fornecedorId: string) { return this.certRepo.find({ where: { fornecedor_id: fornecedorId } }); } + createCertidao(data: Partial) { return this.certRepo.save(data); } +} diff --git a/backend/src/modules/locais/entities/local.entity.ts b/backend/src/modules/locais/entities/local.entity.ts new file mode 100644 index 0000000..5d1810d --- /dev/null +++ b/backend/src/modules/locais/entities/local.entity.ts @@ -0,0 +1,28 @@ +import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, ManyToOne, JoinColumn } from 'typeorm'; + +@Entity('locais') +export class Local { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column({ length: 200 }) + nome: string; + + @Column({ type: 'text', nullable: true }) + endereco: string; + + @Column({ nullable: true }) + centro_custo_id: string; + + @Column({ nullable: true }) + responsavel_id: string; + + @Column({ default: true }) + ativo: boolean; + + @CreateDateColumn() + created_at: Date; + + @UpdateDateColumn() + updated_at: Date; +} diff --git a/backend/src/modules/locais/locais.controller.ts b/backend/src/modules/locais/locais.controller.ts new file mode 100644 index 0000000..8b2e9cf --- /dev/null +++ b/backend/src/modules/locais/locais.controller.ts @@ -0,0 +1,13 @@ +import { Controller, Get, Post, Patch, Delete, Body, Param } from '@nestjs/common'; +import { LocaisService } from './locais.service'; + +@Controller('locais') +export class LocaisController { + constructor(private svc: LocaisService) {} + + @Get() findAll() { return this.svc.findAll(); } + @Get(':id') findOne(@Param('id') id: string) { return this.svc.findOne(id); } + @Post() create(@Body() body: any) { return this.svc.create(body); } + @Patch(':id') update(@Param('id') id: string, @Body() body: any) { return this.svc.update(id, body); } + @Delete(':id') remove(@Param('id') id: string) { return this.svc.remove(id); } +} diff --git a/backend/src/modules/locais/locais.module.ts b/backend/src/modules/locais/locais.module.ts new file mode 100644 index 0000000..f9cbfff --- /dev/null +++ b/backend/src/modules/locais/locais.module.ts @@ -0,0 +1,13 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { Local } from './entities/local.entity'; +import { LocaisController } from './locais.controller'; +import { LocaisService } from './locais.service'; + +@Module({ + imports: [TypeOrmModule.forFeature([Local])], + controllers: [LocaisController], + providers: [LocaisService], + exports: [LocaisService], +}) +export class LocaisModule {} diff --git a/backend/src/modules/locais/locais.service.ts b/backend/src/modules/locais/locais.service.ts new file mode 100644 index 0000000..af2fa78 --- /dev/null +++ b/backend/src/modules/locais/locais.service.ts @@ -0,0 +1,14 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { Local } from './entities/local.entity'; + +@Injectable() +export class LocaisService { + constructor(@InjectRepository(Local) private repo: Repository) {} + findAll() { return this.repo.find({ where: { ativo: true } }); } + findOne(id: string) { return this.repo.findOne({ where: { id } }); } + create(data: Partial) { return this.repo.save(data); } + async update(id: string, data: Partial) { await this.repo.update(id, data); return this.findOne(id); } + async remove(id: string) { await this.repo.update(id, { ativo: false }); } +} diff --git a/backend/src/modules/orcamento/entities/orcamento-planejado.entity.ts b/backend/src/modules/orcamento/entities/orcamento-planejado.entity.ts new file mode 100644 index 0000000..bafab66 --- /dev/null +++ b/backend/src/modules/orcamento/entities/orcamento-planejado.entity.ts @@ -0,0 +1,34 @@ +import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm'; + +@Entity('orcamento_planejado') +export class OrcamentoPlanejado { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column() + ano: number; + + @Column() + mes: number; + + @Column() + centro_custo_id: string; + + @Column() + categoria_id: string; + + @Column({ type: 'float' }) + valor_planejado: number; + + @Column({ type: 'float', default: 0 }) + valor_comprometido: number; + + @Column({ type: 'float', default: 0 }) + valor_realizado: number; + + @CreateDateColumn() + created_at: Date; + + @UpdateDateColumn() + updated_at: Date; +} diff --git a/backend/src/modules/orcamento/orcamento.controller.ts b/backend/src/modules/orcamento/orcamento.controller.ts new file mode 100644 index 0000000..0646c63 --- /dev/null +++ b/backend/src/modules/orcamento/orcamento.controller.ts @@ -0,0 +1,13 @@ +import { Controller, Get, Post, Patch, Body, Param, Query } from '@nestjs/common'; +import { OrcamentoService } from './orcamento.service'; + +@Controller('orcamento') +export class OrcamentoController { + constructor(private svc: OrcamentoService) {} + + @Get() findAll(@Query() query: any) { return this.svc.findAll(query); } + @Get('resumo') resumo(@Query('ano') ano: string) { return this.svc.resumo(parseInt(ano) || 2026); } + @Get(':id') findOne(@Param('id') id: string) { return this.svc.findOne(id); } + @Post() create(@Body() body: any) { return this.svc.create(body); } + @Patch(':id') update(@Param('id') id: string, @Body() body: any) { return this.svc.update(id, body); } +} diff --git a/backend/src/modules/orcamento/orcamento.module.ts b/backend/src/modules/orcamento/orcamento.module.ts new file mode 100644 index 0000000..0cc131b --- /dev/null +++ b/backend/src/modules/orcamento/orcamento.module.ts @@ -0,0 +1,13 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { OrcamentoPlanejado } from './entities/orcamento-planejado.entity'; +import { OrcamentoController } from './orcamento.controller'; +import { OrcamentoService } from './orcamento.service'; + +@Module({ + imports: [TypeOrmModule.forFeature([OrcamentoPlanejado])], + controllers: [OrcamentoController], + providers: [OrcamentoService], + exports: [OrcamentoService], +}) +export class OrcamentoModule {} diff --git a/backend/src/modules/orcamento/orcamento.service.ts b/backend/src/modules/orcamento/orcamento.service.ts new file mode 100644 index 0000000..f3e5983 --- /dev/null +++ b/backend/src/modules/orcamento/orcamento.service.ts @@ -0,0 +1,33 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { OrcamentoPlanejado } from './entities/orcamento-planejado.entity'; + +@Injectable() +export class OrcamentoService { + constructor(@InjectRepository(OrcamentoPlanejado) private repo: Repository) {} + + findAll(query?: any) { + const where: any = {}; + if (query?.ano) where.ano = query.ano; + if (query?.mes) where.mes = query.mes; + if (query?.centro_custo_id) where.centro_custo_id = query.centro_custo_id; + return this.repo.find({ where }); + } + + findOne(id: string) { return this.repo.findOne({ where: { id } }); } + create(data: Partial) { return this.repo.save(data); } + async update(id: string, data: Partial) { await this.repo.update(id, data); return this.findOne(id); } + + async resumo(ano: number) { + const items = await this.repo.find({ where: { ano } }); + const byMonth: any = {}; + for (const item of items) { + if (!byMonth[item.mes]) byMonth[item.mes] = { mes: item.mes, planejado: 0, comprometido: 0, realizado: 0 }; + byMonth[item.mes].planejado += item.valor_planejado; + byMonth[item.mes].comprometido += item.valor_comprometido; + byMonth[item.mes].realizado += item.valor_realizado; + } + return Object.values(byMonth).sort((a: any, b: any) => a.mes - b.mes); + } +} diff --git a/backend/src/modules/ordens-servico/entities/avaliacao.entity.ts b/backend/src/modules/ordens-servico/entities/avaliacao.entity.ts new file mode 100644 index 0000000..5b96aa2 --- /dev/null +++ b/backend/src/modules/ordens-servico/entities/avaliacao.entity.ts @@ -0,0 +1,25 @@ +import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn } from 'typeorm'; + +@Entity('avaliacoes') +export class Avaliacao { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column() + ordem_servico_id: string; + + @Column() + fornecedor_id: string; + + @Column() + avaliador_id: string; + + @Column({ type: 'float' }) + nota: number; + + @Column({ type: 'text', nullable: true }) + comentario: string; + + @CreateDateColumn() + created_at: Date; +} diff --git a/backend/src/modules/ordens-servico/entities/ordem-servico.entity.ts b/backend/src/modules/ordens-servico/entities/ordem-servico.entity.ts new file mode 100644 index 0000000..b85201f --- /dev/null +++ b/backend/src/modules/ordens-servico/entities/ordem-servico.entity.ts @@ -0,0 +1,40 @@ +import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm'; + +@Entity('ordens_servico') +export class OrdemServico { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column({ type: 'integer', unique: true, nullable: true }) + numero: number; + + @Column() + demanda_id: string; + + @Column() + proposta_id: string; + + @Column() + fornecedor_id: string; + + @Column({ type: 'float' }) + valor: number; + + @Column({ length: 30, default: 'emitida' }) + status: string; + + @Column({ nullable: true }) + data_inicio: string; + + @Column({ nullable: true }) + data_conclusao: string; + + @Column({ type: 'text', nullable: true }) + observacoes: string; + + @CreateDateColumn() + created_at: Date; + + @UpdateDateColumn() + updated_at: Date; +} diff --git a/backend/src/modules/ordens-servico/ordens-servico.controller.ts b/backend/src/modules/ordens-servico/ordens-servico.controller.ts new file mode 100644 index 0000000..36df928 --- /dev/null +++ b/backend/src/modules/ordens-servico/ordens-servico.controller.ts @@ -0,0 +1,17 @@ +import { Controller, Get, Post, Body, Param } from '@nestjs/common'; +import { OrdensServicoService } from './ordens-servico.service'; + +@Controller('ordens-servico') +export class OrdensServicoController { + constructor(private svc: OrdensServicoService) {} + + @Get() findAll() { return this.svc.findAll(); } + @Get(':id') findOne(@Param('id') id: string) { return this.svc.findOne(id); } + @Post() create(@Body() body: any) { return this.svc.create(body); } + @Post(':id/iniciar') iniciar(@Param('id') id: string) { return this.svc.iniciar(id); } + @Post(':id/concluir') concluir(@Param('id') id: string) { return this.svc.concluir(id); } + @Post(':id/cancelar') cancelar(@Param('id') id: string) { return this.svc.cancelar(id); } + @Post(':id/avaliacao') avaliacao(@Param('id') id: string, @Body() body: any) { + return this.svc.createAvaliacao({ ...body, ordem_servico_id: id }); + } +} diff --git a/backend/src/modules/ordens-servico/ordens-servico.module.ts b/backend/src/modules/ordens-servico/ordens-servico.module.ts new file mode 100644 index 0000000..05e45cd --- /dev/null +++ b/backend/src/modules/ordens-servico/ordens-servico.module.ts @@ -0,0 +1,14 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { OrdemServico } from './entities/ordem-servico.entity'; +import { Avaliacao } from './entities/avaliacao.entity'; +import { OrdensServicoController } from './ordens-servico.controller'; +import { OrdensServicoService } from './ordens-servico.service'; + +@Module({ + imports: [TypeOrmModule.forFeature([OrdemServico, Avaliacao])], + controllers: [OrdensServicoController], + providers: [OrdensServicoService], + exports: [OrdensServicoService], +}) +export class OrdensServicoModule {} diff --git a/backend/src/modules/ordens-servico/ordens-servico.service.ts b/backend/src/modules/ordens-servico/ordens-servico.service.ts new file mode 100644 index 0000000..d43a9a6 --- /dev/null +++ b/backend/src/modules/ordens-servico/ordens-servico.service.ts @@ -0,0 +1,23 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { OrdemServico } from './entities/ordem-servico.entity'; +import { Avaliacao } from './entities/avaliacao.entity'; + +@Injectable() +export class OrdensServicoService { + constructor( + @InjectRepository(OrdemServico) private repo: Repository, + @InjectRepository(Avaliacao) private avalRepo: Repository, + ) {} + + findAll() { return this.repo.find(); } + findOne(id: string) { return this.repo.findOne({ where: { id } }); } + create(data: Partial) { return this.repo.save(data); } + + async iniciar(id: string) { await this.repo.update(id, { status: 'em_execucao', data_inicio: new Date().toISOString().split('T')[0] }); return this.findOne(id); } + async concluir(id: string) { await this.repo.update(id, { status: 'concluida', data_conclusao: new Date().toISOString().split('T')[0] }); return this.findOne(id); } + async cancelar(id: string) { await this.repo.update(id, { status: 'cancelada' }); return this.findOne(id); } + + createAvaliacao(data: Partial) { return this.avalRepo.save(data); } +} diff --git a/backend/src/modules/propostas/entities/proposta.entity.ts b/backend/src/modules/propostas/entities/proposta.entity.ts new file mode 100644 index 0000000..b9bc570 --- /dev/null +++ b/backend/src/modules/propostas/entities/proposta.entity.ts @@ -0,0 +1,52 @@ +import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm'; + +@Entity('propostas') +export class Proposta { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column() + demanda_id: string; + + @Column() + fornecedor_id: string; + + @Column({ default: 1 }) + versao_atual: number; + + @Column({ type: 'float', nullable: true }) + valor_bruto: number; + + @Column({ type: 'float', nullable: true }) + valor_liquido: number; + + @Column({ type: 'simple-json', default: '{}' }) + impostos: any; + + @Column({ type: 'text', nullable: true }) + condicao_pagamento: string; + + @Column({ nullable: true }) + prazo_execucao_dias: number; + + @Column({ nullable: true }) + data_entrega_estimada: string; + + @Column({ type: 'float', nullable: true }) + match_escopo_pct: number; + + @Column({ type: 'float', nullable: true }) + confiabilidade_ocr: number; + + @Column({ default: false }) + selecionada: boolean; + + @Column({ length: 20, default: 'recebida' }) + status: string; + + @CreateDateColumn() + created_at: Date; + + @UpdateDateColumn() + updated_at: Date; +} diff --git a/backend/src/modules/propostas/propostas.controller.ts b/backend/src/modules/propostas/propostas.controller.ts new file mode 100644 index 0000000..7ad5a75 --- /dev/null +++ b/backend/src/modules/propostas/propostas.controller.ts @@ -0,0 +1,18 @@ +import { Controller, Get, Post, Patch, Body, Param } from '@nestjs/common'; +import { PropostasService } from './propostas.service'; + +@Controller() +export class PropostasController { + constructor(private svc: PropostasService) {} + + @Get('propostas') findAll() { return this.svc.findAll(); } + @Get('propostas/:id') findOne(@Param('id') id: string) { return this.svc.findOne(id); } + @Post('propostas') create(@Body() body: any) { return this.svc.create(body); } + @Patch('propostas/:id') update(@Param('id') id: string, @Body() body: any) { return this.svc.update(id, body); } + @Post('propostas/:id/selecionar') selecionar(@Param('id') id: string) { return this.svc.selecionar(id); } + + @Get('demandas/:demandaId/propostas') byDemanda(@Param('demandaId') id: string) { return this.svc.findByDemanda(id); } + @Post('demandas/:demandaId/propostas') createForDemanda(@Param('demandaId') demandaId: string, @Body() body: any) { + return this.svc.create({ ...body, demanda_id: demandaId }); + } +} diff --git a/backend/src/modules/propostas/propostas.module.ts b/backend/src/modules/propostas/propostas.module.ts new file mode 100644 index 0000000..580fc40 --- /dev/null +++ b/backend/src/modules/propostas/propostas.module.ts @@ -0,0 +1,13 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { Proposta } from './entities/proposta.entity'; +import { PropostasController } from './propostas.controller'; +import { PropostasService } from './propostas.service'; + +@Module({ + imports: [TypeOrmModule.forFeature([Proposta])], + controllers: [PropostasController], + providers: [PropostasService], + exports: [PropostasService], +}) +export class PropostasModule {} diff --git a/backend/src/modules/propostas/propostas.service.ts b/backend/src/modules/propostas/propostas.service.ts new file mode 100644 index 0000000..6969ce6 --- /dev/null +++ b/backend/src/modules/propostas/propostas.service.ts @@ -0,0 +1,23 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { Proposta } from './entities/proposta.entity'; + +@Injectable() +export class PropostasService { + constructor(@InjectRepository(Proposta) private repo: Repository) {} + + findByDemanda(demandaId: string) { return this.repo.find({ where: { demanda_id: demandaId } }); } + findAll() { return this.repo.find(); } + findOne(id: string) { return this.repo.findOne({ where: { id } }); } + create(data: Partial) { return this.repo.save(data); } + async update(id: string, data: Partial) { await this.repo.update(id, data); return this.findOne(id); } + + async selecionar(id: string) { + const prop = await this.findOne(id); + // Deselect others for same demanda + await this.repo.update({ demanda_id: prop.demanda_id }, { selecionada: false }); + await this.repo.update(id, { selecionada: true, status: 'selecionada' }); + return this.findOne(id); + } +} diff --git a/backend/src/modules/users/entities/perfil.entity.ts b/backend/src/modules/users/entities/perfil.entity.ts new file mode 100644 index 0000000..1d165f7 --- /dev/null +++ b/backend/src/modules/users/entities/perfil.entity.ts @@ -0,0 +1,26 @@ +import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, OneToMany } from 'typeorm'; +import { Usuario } from './usuario.entity'; + +@Entity('perfis') +export class Perfil { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column({ unique: true, length: 50 }) + nome: string; + + @Column({ type: 'text', nullable: true }) + descricao: string; + + @Column({ type: 'simple-json', default: '{}' }) + permissoes: any; + + @OneToMany(() => Usuario, u => u.perfil) + usuarios: Usuario[]; + + @CreateDateColumn() + created_at: Date; + + @UpdateDateColumn() + updated_at: Date; +} diff --git a/backend/src/modules/users/entities/usuario.entity.ts b/backend/src/modules/users/entities/usuario.entity.ts new file mode 100644 index 0000000..0f90570 --- /dev/null +++ b/backend/src/modules/users/entities/usuario.entity.ts @@ -0,0 +1,36 @@ +import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, ManyToOne, JoinColumn } from 'typeorm'; +import { Perfil } from './perfil.entity'; + +@Entity('usuarios') +export class Usuario { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column({ length: 200 }) + nome: string; + + @Column({ unique: true, length: 255 }) + email: string; + + @Column({ length: 255 }) + senha_hash: string; + + @Column() + perfil_id: string; + + @ManyToOne(() => Perfil, p => p.usuarios) + @JoinColumn({ name: 'perfil_id' }) + perfil: Perfil; + + @Column({ default: true }) + ativo: boolean; + + @Column({ nullable: true }) + ultimo_acesso: Date; + + @CreateDateColumn() + created_at: Date; + + @UpdateDateColumn() + updated_at: Date; +} diff --git a/backend/src/modules/users/users.controller.ts b/backend/src/modules/users/users.controller.ts new file mode 100644 index 0000000..ca54b4a --- /dev/null +++ b/backend/src/modules/users/users.controller.ts @@ -0,0 +1,25 @@ +import { Controller, Get, Post, Patch, Delete, Body, Param } from '@nestjs/common'; +import { UsersService } from './users.service'; + +@Controller() +export class UsersController { + constructor(private svc: UsersService) {} + + @Get('users') + findAll() { return this.svc.findAll(); } + + @Get('users/:id') + findOne(@Param('id') id: string) { return this.svc.findOne(id); } + + @Post('users') + create(@Body() body: any) { return this.svc.create(body); } + + @Patch('users/:id') + update(@Param('id') id: string, @Body() body: any) { return this.svc.update(id, body); } + + @Delete('users/:id') + remove(@Param('id') id: string) { return this.svc.remove(id); } + + @Get('perfis') + perfis() { return this.svc.findAllPerfis(); } +} diff --git a/backend/src/modules/users/users.module.ts b/backend/src/modules/users/users.module.ts new file mode 100644 index 0000000..7ab01dd --- /dev/null +++ b/backend/src/modules/users/users.module.ts @@ -0,0 +1,14 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { Usuario } from './entities/usuario.entity'; +import { Perfil } from './entities/perfil.entity'; +import { UsersController } from './users.controller'; +import { UsersService } from './users.service'; + +@Module({ + imports: [TypeOrmModule.forFeature([Usuario, Perfil])], + controllers: [UsersController], + providers: [UsersService], + exports: [UsersService], +}) +export class UsersModule {} diff --git a/backend/src/modules/users/users.service.ts b/backend/src/modules/users/users.service.ts new file mode 100644 index 0000000..cc93fde --- /dev/null +++ b/backend/src/modules/users/users.service.ts @@ -0,0 +1,20 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { Usuario } from './entities/usuario.entity'; +import { Perfil } from './entities/perfil.entity'; + +@Injectable() +export class UsersService { + constructor( + @InjectRepository(Usuario) private userRepo: Repository, + @InjectRepository(Perfil) private perfilRepo: Repository, + ) {} + + findAll() { return this.userRepo.find({ relations: ['perfil'], where: { ativo: true } }); } + findOne(id: string) { return this.userRepo.findOne({ where: { id }, relations: ['perfil'] }); } + create(data: Partial) { return this.userRepo.save(data); } + async update(id: string, data: Partial) { await this.userRepo.update(id, data); return this.findOne(id); } + async remove(id: string) { await this.userRepo.update(id, { ativo: false }); } + findAllPerfis() { return this.perfilRepo.find(); } +} diff --git a/backend/src/modules/workflow/entities/workflow-aprovacao.entity.ts b/backend/src/modules/workflow/entities/workflow-aprovacao.entity.ts new file mode 100644 index 0000000..e4d57f1 --- /dev/null +++ b/backend/src/modules/workflow/entities/workflow-aprovacao.entity.ts @@ -0,0 +1,37 @@ +import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm'; + +@Entity('workflow_aprovacao') +export class WorkflowAprovacao { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column() + demanda_id: string; + + @Column({ nullable: true }) + proposta_id: string; + + @Column({ type: 'float' }) + valor_total: number; + + @Column({ length: 30, default: 'pendente' }) + status: string; + + @Column({ default: 1 }) + etapa_atual: number; + + @Column({ type: 'simple-json', default: '[]' }) + etapas: any; + + @Column({ default: false }) + emergencial: boolean; + + @Column({ type: 'text', nullable: true }) + justificativa_emergencial: string; + + @CreateDateColumn() + created_at: Date; + + @UpdateDateColumn() + updated_at: Date; +} diff --git a/backend/src/modules/workflow/workflow.controller.ts b/backend/src/modules/workflow/workflow.controller.ts new file mode 100644 index 0000000..07bb47d --- /dev/null +++ b/backend/src/modules/workflow/workflow.controller.ts @@ -0,0 +1,14 @@ +import { Controller, Get, Post, Body, Param } from '@nestjs/common'; +import { WorkflowService } from './workflow.service'; + +@Controller('workflow') +export class WorkflowController { + constructor(private svc: WorkflowService) {} + + @Get() findAll() { return this.svc.findAll(); } + @Get('pendentes') pendentes() { return this.svc.findPendentes(); } + @Get(':id') findOne(@Param('id') id: string) { return this.svc.findOne(id); } + @Post() create(@Body() body: any) { return this.svc.create(body); } + @Post(':id/aprovar') aprovar(@Param('id') id: string, @Body() body: any) { return this.svc.aprovar(id, body?.observacao); } + @Post(':id/reprovar') reprovar(@Param('id') id: string, @Body() body: any) { return this.svc.reprovar(id, body?.observacao); } +} diff --git a/backend/src/modules/workflow/workflow.module.ts b/backend/src/modules/workflow/workflow.module.ts new file mode 100644 index 0000000..55e7082 --- /dev/null +++ b/backend/src/modules/workflow/workflow.module.ts @@ -0,0 +1,13 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { WorkflowAprovacao } from './entities/workflow-aprovacao.entity'; +import { WorkflowController } from './workflow.controller'; +import { WorkflowService } from './workflow.service'; + +@Module({ + imports: [TypeOrmModule.forFeature([WorkflowAprovacao])], + controllers: [WorkflowController], + providers: [WorkflowService], + exports: [WorkflowService], +}) +export class WorkflowModule {} diff --git a/backend/src/modules/workflow/workflow.service.ts b/backend/src/modules/workflow/workflow.service.ts new file mode 100644 index 0000000..5bb9c45 --- /dev/null +++ b/backend/src/modules/workflow/workflow.service.ts @@ -0,0 +1,51 @@ +import { Injectable, NotFoundException } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { WorkflowAprovacao } from './entities/workflow-aprovacao.entity'; + +@Injectable() +export class WorkflowService { + constructor(@InjectRepository(WorkflowAprovacao) private repo: Repository) {} + + findAll() { return this.repo.find(); } + findOne(id: string) { return this.repo.findOne({ where: { id } }); } + findByDemanda(demandaId: string) { return this.repo.findOne({ where: { demanda_id: demandaId } }); } + create(data: Partial) { return this.repo.save(data); } + + async aprovar(id: string, observacao?: string) { + const wf = await this.repo.findOneOrFail({ where: { id } }); + const etapas = wf.etapas as any[]; + const current = etapas[wf.etapa_atual - 1]; + if (current) { + current.status = 'aprovado'; + current.data_acao = new Date().toISOString(); + current.observacao = observacao || 'Aprovado'; + } + if (wf.etapa_atual >= etapas.length) { + wf.status = 'aprovado'; + } else { + wf.etapa_atual++; + wf.status = 'em_andamento'; + } + wf.etapas = etapas; + return this.repo.save(wf); + } + + async reprovar(id: string, observacao: string) { + const wf = await this.repo.findOneOrFail({ where: { id } }); + const etapas = wf.etapas as any[]; + const current = etapas[wf.etapa_atual - 1]; + if (current) { + current.status = 'reprovado'; + current.data_acao = new Date().toISOString(); + current.observacao = observacao; + } + wf.status = 'reprovado'; + wf.etapas = etapas; + return this.repo.save(wf); + } + + findPendentes() { + return this.repo.find({ where: { status: 'pendente' } }); + } +} diff --git a/backend/test/app.e2e-spec.ts b/backend/test/app.e2e-spec.ts new file mode 100644 index 0000000..36852c5 --- /dev/null +++ b/backend/test/app.e2e-spec.ts @@ -0,0 +1,25 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { INestApplication } from '@nestjs/common'; +import request from 'supertest'; +import { App } from 'supertest/types'; +import { AppModule } from './../src/app.module'; + +describe('AppController (e2e)', () => { + let app: INestApplication; + + beforeEach(async () => { + const moduleFixture: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + app = moduleFixture.createNestApplication(); + await app.init(); + }); + + it('/ (GET)', () => { + return request(app.getHttpServer()) + .get('/') + .expect(200) + .expect('Hello World!'); + }); +}); diff --git a/backend/test/jest-e2e.json b/backend/test/jest-e2e.json new file mode 100644 index 0000000..e9d912f --- /dev/null +++ b/backend/test/jest-e2e.json @@ -0,0 +1,9 @@ +{ + "moduleFileExtensions": ["js", "json", "ts"], + "rootDir": ".", + "testEnvironment": "node", + "testRegex": ".e2e-spec.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + } +} diff --git a/backend/tsconfig.build.json b/backend/tsconfig.build.json new file mode 100644 index 0000000..64f86c6 --- /dev/null +++ b/backend/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] +} diff --git a/backend/tsconfig.json b/backend/tsconfig.json new file mode 100644 index 0000000..c4038d3 --- /dev/null +++ b/backend/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "module": "nodenext", + "moduleResolution": "nodenext", + "resolvePackageJsonExports": true, + "esModuleInterop": true, + "isolatedModules": true, + "declaration": true, + "removeComments": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "target": "ES2023", + "sourceMap": true, + "outDir": "./dist", + "baseUrl": "./", + "incremental": true, + "skipLibCheck": true, + "strictNullChecks": false, + "forceConsistentCasingInFileNames": true, + "noImplicitAny": false, + "strictBindCallApply": false, + "noFallthroughCasesInSwitch": false + } +} diff --git a/docs/ARQUITETURA-TECNICA.md b/docs/ARQUITETURA-TECNICA.md new file mode 100644 index 0000000..52f1957 --- /dev/null +++ b/docs/ARQUITETURA-TECNICA.md @@ -0,0 +1,1104 @@ +# HEFESTO — Arquitetura Técnica +## Sistema de Controle Orçamentário para Facilities + +**Versão:** 1.0 +**Data:** 2026-02-09 +**Stack:** NestJS · React · PostgreSQL + +--- + +## 1. Visão Geral da Arquitetura + +``` +┌─────────────────────────────────────────────────────────────────────┐ +│ CLIENTE (Browser) │ +│ ┌───────────────────────────────────────────────────────────────┐ │ +│ │ React + Vite (SPA) │ │ +│ │ ┌──────┐ ┌──────────┐ ┌──────────┐ ┌─────────┐ ┌────────┐ │ │ +│ │ │ Auth │ │Dashboard │ │Demandas │ │Propostas│ │Relat. │ │ │ +│ │ └──────┘ └──────────┘ └──────────┘ └─────────┘ └────────┘ │ │ +│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────────┐│ │ +│ │ │Orçamento │ │Fornec. │ │Workflow │ │Ordens de Serviço ││ │ +│ │ └──────────┘ └──────────┘ └──────────┘ └──────────────────┘│ │ +│ └───────────────────────────────────────────────────────────────┘ │ +└────────────────────────────┬────────────────────────────────────────┘ + │ HTTPS / REST + JWT +┌────────────────────────────▼────────────────────────────────────────┐ +│ API GATEWAY (NestJS) │ +│ ┌────────┐ ┌──────┐ ┌──────────┐ ┌──────────┐ ┌───────────────┐ │ +│ │ Auth │ │Users │ │ Locais │ │Categorias│ │ Fornecedores │ │ +│ └────────┘ └──────┘ └──────────┘ └──────────┘ └───────────────┘ │ +│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌────────┐ │ +│ │Demandas │ │Propostas │ │Orçamento │ │Workflow │ │ OCR │ │ +│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └────────┘ │ +│ ┌───────────────┐ ┌──────────┐ ┌──────────────────────────────┐ │ +│ │Ordens Serviço │ │Dashboard │ │ Relatórios │ │ +│ └───────────────┘ └──────────┘ └──────────────────────────────┘ │ +│ ┌─────────────────────────────────────────────────────────────┐ │ +│ │ Guards (JWT + RBAC) │ Interceptors │ Pipes │ Audit Logger │ │ +│ └─────────────────────────────────────────────────────────────┘ │ +└────────────────────────────┬────────────────────────────────────────┘ + ┌──────────────┼──────────────┐ + ▼ ▼ ▼ + ┌────────────┐ ┌────────────┐ ┌────────────┐ + │ PostgreSQL │ │ Redis │ │ Storage │ + │ (dados) │ │ (cache/ │ │ (S3/MinIO │ + │ │ │ filas) │ │ PDFs) │ + └────────────┘ └────────────┘ └────────────┘ + │ + ┌────▼─────┐ + │ OpenAI │ + │GPT-4o- │ + │ mini │ + └──────────┘ +``` + +--- + +## 2. Modelo de Dados Completo + +### 2.1 Diagrama Entidade-Relacionamento (textual) + +``` +perfis ──1:N──> usuarios +locais ──1:N──> demandas +centros_custo ──1:N──> demandas +centros_custo ──1:N──> orcamento_planejado +categorias ──1:N──> demandas +categorias ──1:N──> orcamento_planejado +fornecedores ──1:N──> certidoes +fornecedores ──1:N──> propostas +demandas ──1:N──> itens_linha +demandas ──1:N──> propostas +demandas ──1:1──> workflow_aprovacao +demandas ──1:1──> ordens_servico +propostas ──1:N──> versoes_proposta +demandas ──1:1──> comparativo_propostas +ordens_servico ──1:1──> avaliacoes +matriz_alcada ──> centros_custo, perfis +``` + +### 2.2 Tabelas + +#### `perfis` +| Coluna | Tipo | Restrições | +|--------|------|-----------| +| id | UUID | PK, DEFAULT gen_random_uuid() | +| nome | VARCHAR(50) | NOT NULL, UNIQUE | +| descricao | TEXT | | +| permissoes | JSONB | NOT NULL, DEFAULT '{}' | +| created_at | TIMESTAMPTZ | DEFAULT NOW() | +| updated_at | TIMESTAMPTZ | DEFAULT NOW() | + +> Valores seed: `solicitante`, `gestor_facilities`, `aprovador_financeiro`, `diretoria`, `fornecedor`, `administrador` + +#### `usuarios` +| Coluna | Tipo | Restrições | +|--------|------|-----------| +| id | UUID | PK | +| nome | VARCHAR(200) | NOT NULL | +| email | VARCHAR(255) | NOT NULL, UNIQUE | +| senha_hash | VARCHAR(255) | NOT NULL | +| perfil_id | UUID | FK → perfis.id, NOT NULL | +| ativo | BOOLEAN | DEFAULT TRUE | +| ultimo_acesso | TIMESTAMPTZ | | +| created_at | TIMESTAMPTZ | DEFAULT NOW() | +| updated_at | TIMESTAMPTZ | DEFAULT NOW() | + +#### `locais` +| Coluna | Tipo | Restrições | +|--------|------|-----------| +| id | UUID | PK | +| nome | VARCHAR(200) | NOT NULL | +| endereco | TEXT | | +| centro_custo_id | UUID | FK → centros_custo.id, NOT NULL | +| responsavel_id | UUID | FK → usuarios.id | +| ativo | BOOLEAN | DEFAULT TRUE | +| created_at | TIMESTAMPTZ | DEFAULT NOW() | +| updated_at | TIMESTAMPTZ | DEFAULT NOW() | + +#### `centros_custo` +| Coluna | Tipo | Restrições | +|--------|------|-----------| +| id | UUID | PK | +| codigo | VARCHAR(20) | NOT NULL, UNIQUE | +| nome | VARCHAR(200) | NOT NULL | +| responsavel_id | UUID | FK → usuarios.id | +| ativo | BOOLEAN | DEFAULT TRUE | +| created_at | TIMESTAMPTZ | DEFAULT NOW() | +| updated_at | TIMESTAMPTZ | DEFAULT NOW() | + +#### `categorias` +| Coluna | Tipo | Restrições | +|--------|------|-----------| +| id | UUID | PK | +| nome | VARCHAR(200) | NOT NULL | +| subcategoria | VARCHAR(200) | | +| criticidade_padrao | VARCHAR(20) | CHECK (criticidade_padrao IN ('baixa','media','alta','critica')) | +| sla_dias | INTEGER | DEFAULT 30 | +| categoria_pai_id | UUID | FK → categorias.id (auto-ref) | +| ativo | BOOLEAN | DEFAULT TRUE | +| created_at | TIMESTAMPTZ | DEFAULT NOW() | +| updated_at | TIMESTAMPTZ | DEFAULT NOW() | + +#### `fornecedores` +| Coluna | Tipo | Restrições | +|--------|------|-----------| +| id | UUID | PK | +| tipo_pessoa | VARCHAR(10) | NOT NULL, CHECK (tipo_pessoa IN ('PF','PJ')) | +| cpf_cnpj | VARCHAR(18) | NOT NULL, UNIQUE | +| razao_social | VARCHAR(300) | NOT NULL | +| nome_fantasia | VARCHAR(300) | | +| email | VARCHAR(255) | | +| telefone | VARCHAR(20) | | +| endereco | TEXT | | +| categorias_atendidas | UUID[] | (array de FK → categorias.id) | +| rating | NUMERIC(2,1) | DEFAULT 3.0, CHECK (rating >= 1 AND rating <= 5) | +| usuario_id | UUID | FK → usuarios.id (login do portal) | +| ativo | BOOLEAN | DEFAULT TRUE | +| created_at | TIMESTAMPTZ | DEFAULT NOW() | +| updated_at | TIMESTAMPTZ | DEFAULT NOW() | + +#### `certidoes` +| Coluna | Tipo | Restrições | +|--------|------|-----------| +| id | UUID | PK | +| fornecedor_id | UUID | FK → fornecedores.id, NOT NULL | +| tipo | VARCHAR(100) | NOT NULL | +| numero | VARCHAR(100) | | +| data_emissao | DATE | NOT NULL | +| data_validade | DATE | NOT NULL | +| arquivo_url | TEXT | | +| status | VARCHAR(20) | CHECK (status IN ('vigente','vencida','pendente')) | +| created_at | TIMESTAMPTZ | DEFAULT NOW() | + +#### `orcamento_planejado` +| Coluna | Tipo | Restrições | +|--------|------|-----------| +| id | UUID | PK | +| ano | INTEGER | NOT NULL | +| mes | INTEGER | NOT NULL, CHECK (mes BETWEEN 1 AND 12) | +| centro_custo_id | UUID | FK → centros_custo.id, NOT NULL | +| categoria_id | UUID | FK → categorias.id, NOT NULL | +| valor_planejado | NUMERIC(15,2) | NOT NULL | +| valor_comprometido | NUMERIC(15,2) | DEFAULT 0 | +| valor_realizado | NUMERIC(15,2) | DEFAULT 0 | +| created_at | TIMESTAMPTZ | DEFAULT NOW() | +| updated_at | TIMESTAMPTZ | DEFAULT NOW() | +| UNIQUE(ano, mes, centro_custo_id, categoria_id) | | | + +#### `demandas` +| Coluna | Tipo | Restrições | +|--------|------|-----------| +| id | UUID | PK | +| numero | SERIAL | UNIQUE (código sequencial) | +| titulo | VARCHAR(300) | NOT NULL | +| descricao | TEXT | | +| local_id | UUID | FK → locais.id, NOT NULL | +| centro_custo_id | UUID | FK → centros_custo.id, NOT NULL | +| categoria_id | UUID | FK → categorias.id, NOT NULL | +| criticidade | VARCHAR(20) | NOT NULL, CHECK (... IN ('baixa','media','alta','critica')) | +| data_desejada | DATE | | +| status | VARCHAR(30) | NOT NULL, DEFAULT 'rascunho' | +| solicitante_id | UUID | FK → usuarios.id, NOT NULL | +| gestor_id | UUID | FK → usuarios.id | +| documentos | JSONB | DEFAULT '[]' | +| created_at | TIMESTAMPTZ | DEFAULT NOW() | +| updated_at | TIMESTAMPTZ | DEFAULT NOW() | + +> **Status possíveis:** `rascunho`, `aberta`, `em_escopo`, `em_cotacao`, `propostas_recebidas`, `em_comparacao`, `em_aprovacao`, `aprovada`, `os_emitida`, `em_execucao`, `concluida`, `cancelada` + +#### `itens_linha` +| Coluna | Tipo | Restrições | +|--------|------|-----------| +| id | UUID | PK | +| demanda_id | UUID | FK → demandas.id, NOT NULL | +| descricao | VARCHAR(300) | NOT NULL | +| tipo | VARCHAR(50) | CHECK (tipo IN ('mao_de_obra','material','equipamento','outros')) | +| quantidade | NUMERIC(10,2) | | +| unidade | VARCHAR(30) | | +| observacoes | TEXT | | +| ordem | INTEGER | DEFAULT 0 | +| created_at | TIMESTAMPTZ | DEFAULT NOW() | + +#### `propostas` +| Coluna | Tipo | Restrições | +|--------|------|-----------| +| id | UUID | PK | +| demanda_id | UUID | FK → demandas.id, NOT NULL | +| fornecedor_id | UUID | FK → fornecedores.id, NOT NULL | +| versao_atual | INTEGER | DEFAULT 1 | +| valor_bruto | NUMERIC(15,2) | | +| valor_liquido | NUMERIC(15,2) | | +| impostos | JSONB | DEFAULT '{}' (iss, inss, pcc) | +| condicao_pagamento | TEXT | | +| prazo_execucao_dias | INTEGER | | +| data_entrega_estimada | DATE | | +| match_escopo_pct | NUMERIC(5,2) | | +| confiabilidade_ocr | NUMERIC(5,2) | | +| selecionada | BOOLEAN | DEFAULT FALSE | +| status | VARCHAR(20) | DEFAULT 'recebida' | +| created_at | TIMESTAMPTZ | DEFAULT NOW() | +| updated_at | TIMESTAMPTZ | DEFAULT NOW() | + +#### `versoes_proposta` +| Coluna | Tipo | Restrições | +|--------|------|-----------| +| id | UUID | PK | +| proposta_id | UUID | FK → propostas.id, NOT NULL | +| versao | INTEGER | NOT NULL | +| arquivo_url | TEXT | NOT NULL | +| arquivo_nome | VARCHAR(300) | | +| dados_extraidos | JSONB | (resultado bruto do OCR) | +| dados_parseados | JSONB | (resultado estruturado) | +| confiabilidade | NUMERIC(5,2) | | +| uploaded_by | UUID | FK → usuarios.id | +| created_at | TIMESTAMPTZ | DEFAULT NOW() | + +#### `comparativo_propostas` +| Coluna | Tipo | Restrições | +|--------|------|-----------| +| id | UUID | PK | +| demanda_id | UUID | FK → demandas.id, NOT NULL, UNIQUE | +| propostas_ids | UUID[] | NOT NULL | +| benchmark_id | UUID | FK → propostas.id | +| dados_comparativo | JSONB | NOT NULL | +| anotacoes | JSONB | DEFAULT '[]' | +| gerado_em | TIMESTAMPTZ | DEFAULT NOW() | +| atualizado_em | TIMESTAMPTZ | DEFAULT NOW() | + +#### `workflow_aprovacao` +| Coluna | Tipo | Restrições | +|--------|------|-----------| +| id | UUID | PK | +| demanda_id | UUID | FK → demandas.id, NOT NULL | +| proposta_id | UUID | FK → propostas.id, NOT NULL | +| valor_total | NUMERIC(15,2) | NOT NULL | +| status | VARCHAR(30) | NOT NULL, DEFAULT 'pendente' | +| etapa_atual | INTEGER | DEFAULT 1 | +| etapas | JSONB | NOT NULL (array de etapas) | +| emergencial | BOOLEAN | DEFAULT FALSE | +| justificativa_emergencial | TEXT | | +| created_at | TIMESTAMPTZ | DEFAULT NOW() | +| updated_at | TIMESTAMPTZ | DEFAULT NOW() | + +> **Status:** `pendente`, `em_andamento`, `aprovado`, `reprovado`, `aprovado_com_ressalva`, `cancelado` + +> **Estrutura de `etapas` (JSONB):** +> ```json +> [ +> { +> "ordem": 1, +> "perfil": "gestor_facilities", +> "aprovador_id": "uuid", +> "status": "aprovado", +> "data_acao": "2026-01-15T10:00:00Z", +> "observacao": "OK", +> "ressalva": false +> }, +> { +> "ordem": 2, +> "perfil": "aprovador_financeiro", +> "aprovador_id": null, +> "status": "pendente", +> "data_acao": null, +> "observacao": null, +> "ressalva": false +> } +> ] +> ``` + +#### `matriz_alcada` +| Coluna | Tipo | Restrições | +|--------|------|-----------| +| id | UUID | PK | +| centro_custo_id | UUID | FK → centros_custo.id | +| valor_minimo | NUMERIC(15,2) | NOT NULL | +| valor_maximo | NUMERIC(15,2) | NOT NULL | +| perfil_aprovador | VARCHAR(50) | NOT NULL | +| ordem_sequencial | INTEGER | DEFAULT 1 | +| ativo | BOOLEAN | DEFAULT TRUE | +| created_at | TIMESTAMPTZ | DEFAULT NOW() | + +#### `ordens_servico` +| Coluna | Tipo | Restrições | +|--------|------|-----------| +| id | UUID | PK | +| numero | SERIAL | UNIQUE | +| demanda_id | UUID | FK → demandas.id, NOT NULL, UNIQUE | +| proposta_id | UUID | FK → propostas.id, NOT NULL | +| fornecedor_id | UUID | FK → fornecedores.id, NOT NULL | +| valor | NUMERIC(15,2) | NOT NULL | +| status | VARCHAR(30) | DEFAULT 'emitida' | +| data_emissao | TIMESTAMPTZ | DEFAULT NOW() | +| data_inicio | DATE | | +| data_conclusao | DATE | | +| observacoes | TEXT | | +| created_at | TIMESTAMPTZ | DEFAULT NOW() | +| updated_at | TIMESTAMPTZ | DEFAULT NOW() | + +> **Status:** `emitida`, `em_execucao`, `concluida`, `cancelada` + +#### `avaliacoes` +| Coluna | Tipo | Restrições | +|--------|------|-----------| +| id | UUID | PK | +| ordem_servico_id | UUID | FK → ordens_servico.id, NOT NULL, UNIQUE | +| fornecedor_id | UUID | FK → fornecedores.id, NOT NULL | +| avaliador_id | UUID | FK → usuarios.id, NOT NULL | +| nota | NUMERIC(2,1) | NOT NULL, CHECK (nota >= 1 AND nota <= 5) | +| comentario | TEXT | | +| created_at | TIMESTAMPTZ | DEFAULT NOW() | + +#### `audit_log` +| Coluna | Tipo | Restrições | +|--------|------|-----------| +| id | UUID | PK | +| usuario_id | UUID | FK → usuarios.id | +| acao | VARCHAR(50) | NOT NULL | +| entidade | VARCHAR(50) | NOT NULL | +| entidade_id | UUID | | +| dados_antes | JSONB | | +| dados_depois | JSONB | | +| ip | VARCHAR(45) | | +| user_agent | TEXT | | +| created_at | TIMESTAMPTZ | DEFAULT NOW() | + +> **Índice:** `CREATE INDEX idx_audit_log_entidade ON audit_log(entidade, entidade_id);` +> **Índice:** `CREATE INDEX idx_audit_log_usuario ON audit_log(usuario_id, created_at DESC);` + +#### `alertas` +| Coluna | Tipo | Restrições | +|--------|------|-----------| +| id | UUID | PK | +| usuario_id | UUID | FK → usuarios.id, NOT NULL | +| tipo | VARCHAR(50) | NOT NULL | +| titulo | VARCHAR(300) | NOT NULL | +| mensagem | TEXT | | +| entidade | VARCHAR(50) | | +| entidade_id | UUID | | +| lido | BOOLEAN | DEFAULT FALSE | +| created_at | TIMESTAMPTZ | DEFAULT NOW() | + +> **Tipos de alerta:** `estouro_orcamento`, `sla_vencendo`, `proposta_pendente`, `aprovacao_pendente`, `certidao_vencendo`, `os_atrasada` + +--- + +## 3. Módulos NestJS + +### 3.1 Estrutura de Pastas + +``` +src/ +├── main.ts +├── app.module.ts +├── common/ +│ ├── decorators/ # @Roles(), @CurrentUser(), @Audit() +│ ├── guards/ # JwtAuthGuard, RolesGuard +│ ├── interceptors/ # AuditInterceptor, TransformInterceptor +│ ├── pipes/ # ParseUUIDPipe, ValidationPipe +│ ├── filters/ # HttpExceptionFilter +│ ├── dto/ # PaginationDto, FilterDto +│ └── interfaces/ # ICurrentUser, IPaginatedResult +├── config/ +│ ├── database.config.ts +│ ├── jwt.config.ts +│ ├── storage.config.ts +│ └── openai.config.ts +├── modules/ +│ ├── auth/ +│ │ ├── auth.module.ts +│ │ ├── auth.controller.ts +│ │ ├── auth.service.ts +│ │ ├── strategies/ # JwtStrategy, LocalStrategy +│ │ ├── dto/ # LoginDto, RegisterDto, RefreshTokenDto +│ │ └── guards/ +│ ├── users/ +│ │ ├── users.module.ts +│ │ ├── users.controller.ts +│ │ ├── users.service.ts +│ │ ├── entities/ # User, Perfil +│ │ └── dto/ +│ ├── locais/ +│ │ ├── locais.module.ts +│ │ ├── locais.controller.ts +│ │ ├── locais.service.ts +│ │ ├── entities/ # Local, CentroCusto +│ │ └── dto/ +│ ├── categorias/ +│ │ ├── categorias.module.ts +│ │ ├── categorias.controller.ts +│ │ ├── categorias.service.ts +│ │ ├── entities/ # Categoria +│ │ └── dto/ +│ ├── fornecedores/ +│ │ ├── fornecedores.module.ts +│ │ ├── fornecedores.controller.ts +│ │ ├── fornecedores.service.ts +│ │ ├── entities/ # Fornecedor, Certidao +│ │ └── dto/ +│ ├── demandas/ +│ │ ├── demandas.module.ts +│ │ ├── demandas.controller.ts +│ │ ├── demandas.service.ts +│ │ ├── entities/ # Demanda, ItemLinha +│ │ └── dto/ +│ ├── propostas/ +│ │ ├── propostas.module.ts +│ │ ├── propostas.controller.ts +│ │ ├── propostas.service.ts +│ │ ├── entities/ # Proposta, VersaoProposta, ComparativoPropostas +│ │ └── dto/ +│ ├── orcamento/ +│ │ ├── orcamento.module.ts +│ │ ├── orcamento.controller.ts +│ │ ├── orcamento.service.ts +│ │ ├── entities/ # OrcamentoPlanejado +│ │ └── dto/ +│ ├── workflow/ +│ │ ├── workflow.module.ts +│ │ ├── workflow.controller.ts +│ │ ├── workflow.service.ts +│ │ ├── entities/ # WorkflowAprovacao, MatrizAlcada +│ │ └── dto/ +│ ├── ordens-servico/ +│ │ ├── ordens-servico.module.ts +│ │ ├── ordens-servico.controller.ts +│ │ ├── ordens-servico.service.ts +│ │ ├── entities/ # OrdemServico, Avaliacao +│ │ └── dto/ +│ ├── ocr/ +│ │ ├── ocr.module.ts +│ │ ├── ocr.service.ts +│ │ ├── ocr.processor.ts # Bull queue processor +│ │ ├── prompts/ # System prompts para GPT-4o-mini +│ │ └── interfaces/ +│ ├── dashboard/ +│ │ ├── dashboard.module.ts +│ │ ├── dashboard.controller.ts +│ │ └── dashboard.service.ts +│ └── relatorios/ +│ ├── relatorios.module.ts +│ ├── relatorios.controller.ts +│ ├── relatorios.service.ts +│ └── templates/ # Templates PDF/Excel +└── database/ + ├── migrations/ + └── seeds/ +``` + +### 3.2 Dependências entre Módulos + +``` + ┌──────────┐ + │ Auth │ + └────┬─────┘ + │ JWT/Guards + ┌──────────────┼──────────────────┐ + ▼ ▼ ▼ + ┌────────┐ ┌──────────┐ ┌──────────┐ + │ Users │ │Dashboard │ │Relatórios│ + └────────┘ └──────────┘ └──────────┘ + │ agrega │ lê + ┌──────────────────┼──────────────┐ │ + ▼ ▼ ▼ ▼ ▼ +┌────────┐┌────────┐┌──────────┐┌──────────┐ +│ Locais ││Categ. ││Demandas ││Orçamento │ +└────────┘└────────┘└─────┬────┘└──────────┘ + │ + ┌───────────┼───────────┐ + ▼ ▼ ▼ + ┌──────────┐┌──────────┐┌──────────┐ + │Propostas ││Workflow ││ Fornec. │ + └─────┬────┘└────┬─────┘└──────────┘ + │ │ + ▼ ▼ + ┌────────┐┌──────────────┐ + │ OCR ││Ordens Serviço│ + └────────┘└──────────────┘ +``` + +--- + +## 4. API REST Completa + +### 4.1 Autenticação (`/api/auth`) + +| Método | Rota | Descrição | Acesso | +|--------|------|-----------|--------| +| POST | `/api/auth/login` | Login (email + senha) → JWT | Público | +| POST | `/api/auth/refresh` | Renovar token | Autenticado | +| POST | `/api/auth/logout` | Invalidar refresh token | Autenticado | +| GET | `/api/auth/me` | Dados do usuário logado | Autenticado | +| POST | `/api/auth/forgot-password` | Solicitar reset de senha | Público | +| POST | `/api/auth/reset-password` | Redefinir senha com token | Público | + +### 4.2 Usuários (`/api/users`) + +| Método | Rota | Descrição | Acesso | +|--------|------|-----------|--------| +| GET | `/api/users` | Listar usuários (paginado) | Admin | +| GET | `/api/users/:id` | Detalhe do usuário | Admin | +| POST | `/api/users` | Criar usuário | Admin | +| PATCH | `/api/users/:id` | Atualizar usuário | Admin | +| DELETE | `/api/users/:id` | Desativar usuário (soft) | Admin | +| GET | `/api/perfis` | Listar perfis | Admin | +| POST | `/api/perfis` | Criar perfil | Admin | +| PATCH | `/api/perfis/:id` | Atualizar permissões | Admin | + +### 4.3 Locais e Centros de Custo (`/api/locais`, `/api/centros-custo`) + +| Método | Rota | Descrição | Acesso | +|--------|------|-----------|--------| +| GET | `/api/locais` | Listar locais | Autenticado | +| GET | `/api/locais/:id` | Detalhe do local | Autenticado | +| POST | `/api/locais` | Criar local | Admin, Gestor | +| PATCH | `/api/locais/:id` | Atualizar local | Admin, Gestor | +| DELETE | `/api/locais/:id` | Desativar local | Admin | +| GET | `/api/centros-custo` | Listar centros de custo | Autenticado | +| GET | `/api/centros-custo/:id` | Detalhe | Autenticado | +| POST | `/api/centros-custo` | Criar CC | Admin | +| PATCH | `/api/centros-custo/:id` | Atualizar CC | Admin | + +### 4.4 Categorias (`/api/categorias`) + +| Método | Rota | Descrição | Acesso | +|--------|------|-----------|--------| +| GET | `/api/categorias` | Listar (árvore ou flat) | Autenticado | +| GET | `/api/categorias/:id` | Detalhe | Autenticado | +| POST | `/api/categorias` | Criar categoria | Admin | +| PATCH | `/api/categorias/:id` | Atualizar | Admin | +| DELETE | `/api/categorias/:id` | Desativar | Admin | + +### 4.5 Fornecedores (`/api/fornecedores`) + +| Método | Rota | Descrição | Acesso | +|--------|------|-----------|--------| +| GET | `/api/fornecedores` | Listar (paginado, filtros) | Autenticado | +| GET | `/api/fornecedores/:id` | Detalhe + certidões | Autenticado | +| POST | `/api/fornecedores` | Cadastrar fornecedor | Admin, Gestor | +| PATCH | `/api/fornecedores/:id` | Atualizar | Admin, Gestor | +| DELETE | `/api/fornecedores/:id` | Desativar | Admin | +| GET | `/api/fornecedores/:id/certidoes` | Listar certidões | Autenticado | +| POST | `/api/fornecedores/:id/certidoes` | Upload certidão | Fornecedor, Admin | +| PATCH | `/api/fornecedores/:id/certidoes/:certId` | Atualizar certidão | Admin | +| GET | `/api/fornecedores/:id/avaliacoes` | Histórico de avaliações | Autenticado | + +### 4.6 Demandas (`/api/demandas`) + +| Método | Rota | Descrição | Acesso | +|--------|------|-----------|--------| +| GET | `/api/demandas` | Listar (paginado, filtros por status/CC/local/categoria) | Autenticado | +| GET | `/api/demandas/:id` | Detalhe completo | Autenticado | +| POST | `/api/demandas` | Criar demanda (rascunho) | Solicitante, Gestor | +| PATCH | `/api/demandas/:id` | Atualizar demanda | Solicitante, Gestor | +| POST | `/api/demandas/:id/publicar` | Publicar (rascunho → aberta) | Solicitante, Gestor | +| POST | `/api/demandas/:id/cancelar` | Cancelar demanda | Gestor, Admin | +| POST | `/api/demandas/:id/documentos` | Upload documento | Solicitante, Gestor | +| DELETE | `/api/demandas/:id/documentos/:docId` | Remover documento | Solicitante, Gestor | +| GET | `/api/demandas/:id/itens-linha` | Listar itens de linha | Autenticado | +| POST | `/api/demandas/:id/itens-linha` | Adicionar item de linha | Gestor | +| PATCH | `/api/demandas/:id/itens-linha/:itemId` | Atualizar item | Gestor | +| DELETE | `/api/demandas/:id/itens-linha/:itemId` | Remover item | Gestor | +| POST | `/api/demandas/:id/enviar-cotacao` | Enviar p/ cotação (validações) | Gestor | +| GET | `/api/demandas/:id/timeline` | Timeline de eventos | Autenticado | + +### 4.7 Propostas (`/api/propostas`) + +| Método | Rota | Descrição | Acesso | +|--------|------|-----------|--------| +| GET | `/api/demandas/:demandaId/propostas` | Listar propostas da demanda | Autenticado | +| GET | `/api/propostas/:id` | Detalhe da proposta | Autenticado | +| POST | `/api/demandas/:demandaId/propostas` | Upload proposta (PDF) | Fornecedor | +| POST | `/api/propostas/:id/nova-versao` | Nova versão do PDF | Fornecedor | +| GET | `/api/propostas/:id/versoes` | Listar versões | Autenticado | +| GET | `/api/propostas/:id/versoes/:versaoId` | Detalhe da versão + dados OCR | Autenticado | +| POST | `/api/propostas/:id/selecionar` | Selecionar proposta vencedora | Gestor | +| PATCH | `/api/propostas/:id/dados-extraidos` | Corrigir dados do OCR | Gestor | +| GET | `/api/demandas/:demandaId/comparativo` | Painel comparativo | Autenticado | +| POST | `/api/demandas/:demandaId/comparativo/gerar` | Gerar/atualizar comparativo | Gestor | +| POST | `/api/demandas/:demandaId/comparativo/anotacoes` | Adicionar anotação | Autenticado | + +### 4.8 Orçamento (`/api/orcamento`) + +| Método | Rota | Descrição | Acesso | +|--------|------|-----------|--------| +| GET | `/api/orcamento` | Listar planejamento (filtros: ano, mês, CC, categoria) | Financeiro, Admin | +| GET | `/api/orcamento/:id` | Detalhe | Financeiro, Admin | +| POST | `/api/orcamento` | Criar linha orçamentária | Admin | +| PATCH | `/api/orcamento/:id` | Atualizar planejado | Admin | +| POST | `/api/orcamento/importar` | Importar planilha | Admin | +| GET | `/api/orcamento/resumo` | Resumo planejado x comprometido x realizado | Financeiro, Diretoria | +| GET | `/api/orcamento/verificar` | Verificar disponibilidade (CC, categoria, valor) | Sistema | + +### 4.9 Workflow de Aprovação (`/api/workflow`) + +| Método | Rota | Descrição | Acesso | +|--------|------|-----------|--------| +| POST | `/api/demandas/:demandaId/workflow/iniciar` | Iniciar workflow | Gestor | +| GET | `/api/workflow/:id` | Status do workflow | Autenticado | +| POST | `/api/workflow/:id/aprovar` | Aprovar etapa atual | Aprovador da etapa | +| POST | `/api/workflow/:id/reprovar` | Reprovar (com justificativa) | Aprovador da etapa | +| POST | `/api/workflow/:id/aprovar-com-ressalva` | Aprovar com ressalva | Aprovador da etapa | +| GET | `/api/workflow/pendentes` | Minhas aprovações pendentes | Autenticado | +| GET | `/api/matriz-alcada` | Listar regras de alçada | Admin | +| POST | `/api/matriz-alcada` | Criar regra | Admin | +| PATCH | `/api/matriz-alcada/:id` | Atualizar regra | Admin | +| DELETE | `/api/matriz-alcada/:id` | Desativar regra | Admin | + +### 4.10 Ordens de Serviço (`/api/ordens-servico`) + +| Método | Rota | Descrição | Acesso | +|--------|------|-----------|--------| +| GET | `/api/ordens-servico` | Listar OS | Autenticado | +| GET | `/api/ordens-servico/:id` | Detalhe | Autenticado | +| POST | `/api/ordens-servico/:id/iniciar` | Marcar início execução | Gestor | +| POST | `/api/ordens-servico/:id/concluir` | Marcar conclusão | Gestor | +| POST | `/api/ordens-servico/:id/cancelar` | Cancelar OS | Admin | +| POST | `/api/ordens-servico/:id/avaliacao` | Avaliar fornecedor | Gestor, Solicitante | + +### 4.11 Dashboard (`/api/dashboard`) + +| Método | Rota | Descrição | Acesso | +|--------|------|-----------|--------| +| GET | `/api/dashboard/indicadores` | Cards principais | Autenticado | +| GET | `/api/dashboard/demandas-por-status` | Gráfico por status | Autenticado | +| GET | `/api/dashboard/demandas-por-categoria` | Gráfico por categoria | Autenticado | +| GET | `/api/dashboard/consumo-orcamento` | Plan. x Comprom. x Realiz. | Financeiro, Diretoria | +| GET | `/api/dashboard/propostas-por-fornecedor` | Gráfico fornecedores | Gestor | +| GET | `/api/dashboard/alertas` | Alertas do usuário | Autenticado | +| PATCH | `/api/dashboard/alertas/:id/ler` | Marcar alerta como lido | Autenticado | + +### 4.12 Relatórios (`/api/relatorios`) + +| Método | Rota | Descrição | Acesso | +|--------|------|-----------|--------| +| GET | `/api/relatorios/consumo-orcamentario` | Por CC e categoria | Financeiro, Diretoria | +| GET | `/api/relatorios/saving` | Saving gerado | Financeiro, Diretoria | +| GET | `/api/relatorios/historico-decisoes` | Trilha de auditoria | Admin | +| GET | `/api/relatorios/lead-time` | Lead time por status | Gestor, Admin | +| GET | `/api/relatorios/gargalos` | Gargalos de aprovação | Admin | +| GET | `/api/relatorios/exportar/:tipo` | Exportar PDF ou Excel | Autenticado | + +### 4.13 OCR (`/api/ocr`) — interno + +| Método | Rota | Descrição | Acesso | +|--------|------|-----------|--------| +| POST | `/api/ocr/extrair` | Disparar extração de PDF | Sistema/Gestor | +| GET | `/api/ocr/status/:jobId` | Status do job de extração | Sistema/Gestor | + +--- + +## 5. Workflow de Aprovação — Máquina de Estados + +### 5.1 Diagrama de Estados da Demanda + +``` + ┌──────────┐ + │ RASCUNHO │ + └────┬─────┘ + │ publicar (valida: itens_linha, CC, local) + ▼ + ┌──────────┐ + │ ABERTA │ + └────┬─────┘ + │ gestor assume + ▼ + ┌──────────┐ + │ EM_ESCOPO│ ← define itens de linha + └────┬─────┘ + │ enviar cotação (valida: ≥1 item) + ▼ + ┌───────────┐ + │ EM_COTAÇÃO│ ← fornecedores enviam propostas + └────┬──────┘ + │ todas propostas recebidas + ▼ + ┌─────────────────┐ + │PROPOSTAS_RECEB. │ + └────────┬────────┘ + │ gestor inicia comparação + ▼ + ┌─────────────┐ + │EM_COMPARAÇÃO│ ← painel comparativo, OCR + └──────┬──────┘ + │ seleciona proposta → inicia workflow + ▼ + ┌─────────────┐ + │EM_APROVAÇÃO │ ← fluxo de alçadas + └──────┬──────┘ + ┌────┼────┐ + ▼ │ ▼ + ┌──────┐ │ ┌──────────┐ + │REPROV│ │ │APROVADA │ + └──────┘ │ └────┬─────┘ + │ │ gera OS automática + │ ▼ + │ ┌──────────┐ + │ │OS_EMITIDA│ + │ └────┬─────┘ + │ │ + │ ▼ + │ ┌────────────┐ + │ │EM_EXECUÇÃO │ + │ └─────┬──────┘ + │ │ + │ ▼ + │ ┌──────────┐ + │ │CONCLUÍDA │ + │ └──────────┘ + │ + (cancelar em qualquer ponto) + ▼ + ┌──────────┐ + │CANCELADA │ + └──────────┘ +``` + +### 5.2 Fluxo de Alçadas (Workflow de Aprovação) + +``` +Proposta Selecionada (valor R$) + │ + ▼ +┌────────────────────────┐ +│ Consultar matriz_alcada│ +│ (CC + valor) │ +└────────┬───────────────┘ + │ + ▼ + Valor ≤ alçada do Gestor? + ├── SIM → Aprovação automática pelo Gestor ──→ APROVADO + │ + └── NÃO → Fluxo Sequencial: + │ + ▼ + ┌─────────────────────┐ + (1) │ Gestor de Facilities│──→ Aprova? ──→ Próxima etapa + └─────────────────────┘ │ + Reprova? ──→ REPROVADO + │ + ▼ + ┌─────────────────────┐ + (2) │ Aprovador Financeiro│──→ Aprova? ──→ Próxima etapa + └─────────────────────┘ │ + Reprova? ──→ REPROVADO + │ + ▼ + ┌─────────────────────┐ + (3) │ Diretoria │──→ Aprova? ──→ APROVADO + └─────────────────────┘ │ + Reprova? ──→ REPROVADO +``` + +### 5.3 Exceções Emergenciais + +1. Demanda marcada como `criticidade = 'critica'` pode ser sinalizada como **emergencial** +2. Workflow emergencial exige `justificativa_emergencial` obrigatória +3. Permite pular etapas intermediárias, indo direto ao aprovador de maior alçada +4. Gera alerta automático para todos os aprovadores pulados +5. Registra em `audit_log` com flag `emergencial = true` + +### 5.4 Aprovação com Ressalva + +- Qualquer aprovador pode aprovar com ressalva (`aprovado_com_ressalva`) +- Exige campo `observacao` obrigatório +- O workflow continua normalmente, mas a OS gerada carrega flag de ressalva +- Visível no relatório de histórico de decisões + +--- + +## 6. OCR/IA — Estratégia de Extração Inteligente + +### 6.1 Pipeline de Processamento + +``` +PDF Upload + │ + ▼ +┌──────────────────┐ +│ 1. Armazenar S3 │ (MinIO / S3-compatible) +└────────┬─────────┘ + │ + ▼ +┌──────────────────┐ +│ 2. Fila Bull/ │ (Redis queue: "ocr-extraction") +│ BullMQ │ +└────────┬─────────┘ + │ Worker processa + ▼ +┌──────────────────────────────────────┐ +│ 3. Extrair texto do PDF │ +│ - pdf-parse (texto nativo) │ +│ - Tesseract.js (se escaneado) │ +└────────┬─────────────────────────────┘ + │ + ▼ +┌──────────────────────────────────────┐ +│ 4. Enviar para GPT-4o-mini │ +│ System prompt estruturado: │ +│ - Extrair: valor_bruto, │ +│ valor_liquido, impostos, │ +│ condicao_pagamento, │ +│ prazo_execucao, data_entrega │ +│ - Mapear itens ↔ itens_linha │ +│ - Retornar JSON tipado │ +│ - Indicar confiança (0-100%) │ +└────────┬─────────────────────────────┘ + │ + ▼ +┌──────────────────────────────────────┐ +│ 5. Salvar em versoes_proposta │ +│ - dados_extraidos (raw GPT) │ +│ - dados_parseados (estruturado) │ +│ - confiabilidade │ +└────────┬─────────────────────────────┘ + │ + ▼ +┌──────────────────────────────────────┐ +│ 6. Calcular match_escopo_pct │ +│ Itens mapeados / Total itens │ +└──────────────────────────────────────┘ +``` + +### 6.2 System Prompt para GPT-4o-mini + +``` +Você é um extrator de dados de propostas comerciais de serviços de Facilities. + +Dado o texto de uma proposta PDF, extraia os seguintes campos em JSON: + +{ + "valor_bruto": number | null, + "valor_liquido": number | null, + "impostos": { + "iss": number | null, + "inss": number | null, + "pcc": number | null, + "outros": number | null + }, + "condicao_pagamento": string | null, + "prazo_execucao_dias": number | null, + "data_entrega_estimada": string | null, // ISO 8601 + "itens": [ + { + "descricao": string, + "valor_unitario": number | null, + "quantidade": number | null, + "valor_total": number | null, + "unidade": string | null + } + ], + "confianca_geral": number // 0 a 100 +} + +Regras: +- Se o campo não for encontrado, retorne null +- Valores monetários em BRL, sem símbolo +- confianca_geral indica % de certeza da extração +- Retorne SOMENTE o JSON, sem explicações +``` + +### 6.3 Match de Escopo + +O serviço compara `itens` retornados pelo GPT com `itens_linha` da demanda usando similaridade textual (Levenshtein / embeddings simples). Resultado: `match_escopo_pct` na proposta. + +### 6.4 Tratamento de Falhas + +- **Confiabilidade < 60%**: alerta ao Gestor para revisão manual +- **PDF escaneado com baixa qualidade**: fallback para Tesseract + retry GPT +- **Timeout GPT**: retry com backoff exponencial (3 tentativas) +- **Todos os erros logados** em `audit_log` + +--- + +## 7. Segurança + +### 7.1 RBAC — Controle de Acesso por Perfil + +```typescript +// Decorator customizado +@Roles('administrador', 'gestor_facilities') +@UseGuards(JwtAuthGuard, RolesGuard) +``` + +**Matriz de Permissões:** + +| Recurso | Solicitante | Gestor | Financeiro | Diretoria | Fornecedor | Admin | +|---------|:-----------:|:------:|:----------:|:---------:|:----------:|:-----:| +| Criar demanda | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | +| Definir escopo | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ | +| Upload proposta | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | +| Comparar propostas | ❌ | ✅ | ✅ | ✅ | ❌ | ✅ | +| Selecionar proposta | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ | +| Aprovar workflow | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | +| Ver orçamento | ❌ | ✅ | ✅ | ✅ | ❌ | ✅ | +| Editar orçamento | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | +| Cadastros base | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | +| Relatórios | ❌ | ✅ | ✅ | ✅ | ❌ | ✅ | +| Avaliar fornecedor | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | + +### 7.2 Autenticação + +- **JWT** com access token (15 min) + refresh token (7 dias) +- Refresh tokens armazenados em banco (revogáveis) +- Bcrypt para hash de senhas (salt rounds: 12) +- Rate limiting: 5 tentativas de login / 15 min por IP + +### 7.3 LGPD + +- Dados pessoais de fornecedores (CPF/CNPJ) criptografados em repouso (AES-256) +- Endpoint `DELETE /api/users/:id/dados-pessoais` para anonimização +- Consentimento registrado no cadastro de fornecedores +- Logs de acesso a dados sensíveis em `audit_log` +- Retenção de logs: 5 anos (configurável) + +### 7.4 Audit Log + +Todo `CUD` (Create, Update, Delete) é interceptado pelo `AuditInterceptor`: + +```typescript +@Injectable() +export class AuditInterceptor implements NestInterceptor { + intercept(context: ExecutionContext, next: CallHandler) { + const req = context.switchToHttp().getRequest(); + const before = /* snapshot antes */; + return next.handle().pipe( + tap(result => { + this.auditService.log({ + usuario_id: req.user.id, + acao: req.method, + entidade: /* extraído da rota */, + entidade_id: req.params.id, + dados_antes: before, + dados_depois: result, + ip: req.ip, + user_agent: req.headers['user-agent'], + }); + }), + ); + } +} +``` + +--- + +## 8. Infraestrutura e Deploy + +### 8.1 Ambientes + +| Ambiente | Descrição | +|----------|-----------| +| `development` | Local, Docker Compose | +| `staging` | Pré-produção | +| `production` | Produção | + +### 8.2 Docker Compose (dev) + +```yaml +services: + api: + build: ./backend + ports: ["3000:3000"] + depends_on: [postgres, redis] + environment: + DATABASE_URL: postgresql://hefesto:hefesto@postgres:5432/hefesto + REDIS_URL: redis://redis:6379 + JWT_SECRET: ${JWT_SECRET} + OPENAI_API_KEY: ${OPENAI_API_KEY} + S3_ENDPOINT: http://minio:9000 + + frontend: + build: ./frontend + ports: ["5173:5173"] + + postgres: + image: postgres:16-alpine + volumes: ["pgdata:/var/lib/postgresql/data"] + environment: + POSTGRES_DB: hefesto + POSTGRES_USER: hefesto + POSTGRES_PASSWORD: hefesto + + redis: + image: redis:7-alpine + + minio: + image: minio/minio + command: server /data --console-address ":9001" + ports: ["9000:9000", "9001:9001"] + +volumes: + pgdata: +``` + +### 8.3 Tecnologias e Bibliotecas + +| Camada | Tecnologia | +|--------|-----------| +| Backend | NestJS 10+, TypeScript 5+ | +| ORM | TypeORM (migrations + entities) | +| Validação | class-validator, class-transformer | +| Filas | BullMQ + Redis | +| Autenticação | @nestjs/passport, passport-jwt | +| Upload | Multer + S3 SDK | +| PDF parse | pdf-parse, Tesseract.js | +| IA | OpenAI SDK (GPT-4o-mini) | +| Frontend | React 18+, Vite 5+ | +| UI Kit | shadcn/ui + Tailwind CSS | +| State | TanStack Query (React Query) | +| Gráficos | Recharts | +| Tabelas | TanStack Table | +| Exportação | jsPDF, ExcelJS | +| Testes | Jest (back), Vitest (front) | + +--- + +## 9. Índices do Banco de Dados + +```sql +-- Performance queries frequentes +CREATE INDEX idx_demandas_status ON demandas(status); +CREATE INDEX idx_demandas_solicitante ON demandas(solicitante_id); +CREATE INDEX idx_demandas_cc ON demandas(centro_custo_id); +CREATE INDEX idx_demandas_local ON demandas(local_id); +CREATE INDEX idx_demandas_created ON demandas(created_at DESC); + +CREATE INDEX idx_propostas_demanda ON propostas(demanda_id); +CREATE INDEX idx_propostas_fornecedor ON propostas(fornecedor_id); + +CREATE INDEX idx_workflow_status ON workflow_aprovacao(status); +CREATE INDEX idx_workflow_demanda ON workflow_aprovacao(demanda_id); + +CREATE INDEX idx_os_status ON ordens_servico(status); +CREATE INDEX idx_os_fornecedor ON ordens_servico(fornecedor_id); + +CREATE INDEX idx_orcamento_periodo ON orcamento_planejado(ano, mes); +CREATE INDEX idx_orcamento_cc ON orcamento_planejado(centro_custo_id); + +CREATE INDEX idx_alertas_usuario ON alertas(usuario_id, lido, created_at DESC); + +CREATE INDEX idx_certidoes_fornecedor ON certidoes(fornecedor_id); +CREATE INDEX idx_certidoes_validade ON certidoes(data_validade); + +CREATE INDEX idx_audit_log_entidade ON audit_log(entidade, entidade_id); +CREATE INDEX idx_audit_log_usuario ON audit_log(usuario_id, created_at DESC); +``` + +--- + +## 10. Regras de Negócio Críticas + +1. **Demanda sem itens de linha não pode ser publicada** — validação no `POST /demandas/:id/publicar` +2. **Demanda sem CC e Local não pode ser publicada** — validação no `POST /demandas/:id/publicar` +3. **Fornecedor com certidão vencida não pode receber OS** — verificação no momento da geração da OS +4. **Alerta automático quando proposta > 20% do orçamento planejado** — trigger no `OrcamentoService.verificar()` +5. **OS gerada automaticamente após aprovação final** — event listener no `WorkflowService` +6. **Rating do fornecedor atualizado após avaliação** — média ponderada recalculada +7. **Valor comprometido atualizado ao emitir OS** — `OrcamentoService.comprometer()` +8. **Valor realizado atualizado ao concluir OS** — `OrcamentoService.realizar()` +9. **Soft delete em todas as entidades cadastrais** — campo `ativo` ao invés de DELETE físico + +--- + +*Documento gerado para o projeto HEFESTO — v1.0* diff --git a/docs/ESPECIFICACAO-FUNCIONAL.pdf b/docs/ESPECIFICACAO-FUNCIONAL.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cd19ca7ca184fd564e38d4e92a1c8514024ed670 GIT binary patch literal 87409 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 z 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%0Df{h`B=NB6Qv@oyoC-o} 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 80% | Demandas com 3+ propostas / total | +| % de aprovações no prazo | > 95% | Aprovações dentro do SLA configurado | +| Economia média por demanda | > 12% | (Valor estimado - valor contratado) / estimado | +| NPS do solicitante | > 70 | Pesquisa trimestral | + +### 9.2 Métricas de Negócio + +| Métrica | Meta Ano 1 | Meta Ano 2 | +|---|---|---| +| MRR (Receita Mensal Recorrente) | R$ 30.000 | R$ 150.000 | +| Clientes ativos | 10 | 40 | +| Churn mensal | < 3% | < 2% | +| CAC (Custo de Aquisição) | < R$ 5.000 | < R$ 4.000 | +| LTV (Lifetime Value) | > R$ 50.000 | > R$ 80.000 | +| LTV/CAC | > 10x | > 20x | + +### 9.3 Métricas de Impacto no Cliente + +- **Redução de 70%** no tempo gasto com gestão manual de cotações +- **Redução de 40%** no ciclo de aprovação +- **Economia média de 15%** em contratações por comparação efetiva +- **100% de rastreabilidade** em auditorias +- **Zero** propostas perdidas ou esquecidas + +--- + +*Documento gerado automaticamente — HEFESTO v1.0* diff --git a/docs/MANUAL-NEGOCIOS.pdf b/docs/MANUAL-NEGOCIOS.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fddeaed08d4b9c6ccbd7bccc26428842a6203353 GIT binary patch literal 77287 zcma&OQ*dWp*X|wLwr$($*tTukw$ZVjbZmEQ+s;3B(!tm7-rvD<*Zb72`()KRShWu3 zs5!6S7~>j~Tv1Gdo|%CihWzOE>J^5Ih>6I-*cyh9k5R(P*450JQNq^9)lAIH#KF{z zQP#}f!qt+9g_(mzKmf+Y)!EF*4#smMS9`J!mlJOLh4uup=Ij#)juECAyc5>jLmbnD z_qt5Wba}U4f`nYTxM4fycf$|XWXX#}z9ZAOh6?c$L2GE9@3hG)pWb)+fG>fMuQ!vo z`)ch}^bzkKU%vDdl!>(u@`t&5r|$>4(%ut=seIMGxY_(f!FOjCj=bY{s9PBv>e3cv zo;1ORuU5ovn+H1F%_i%viF~z*>d9R%J)g-3*RR(}1HwMWK3_KMQb`tSnqufdT5u7Z zoSZ(r3fL}^DPNZ>BT}_|k2?KLNK~a&UK@}WvKqK1b(I^92B&n^+vegw09U7dI0|5^ zNqf%3R|p%8<-QN=%!NU)mK;|B%s5Ds1@csM(y@FEJ$%WcR$iK$(#DzzTT<~>$gho~ z1}@%x8q8XwnlbQIQ}MQ1h+SkvE3lOW@inyN`tJPeB(F3QSs0+`yy@a7d=XW{?E&Eg2ptKoNPI6S} zBf2b2^(NI$8@8d%xcM|cysk(u^+n2o?d-Pu@cqQvb%}2)P;h|FS7Vg0Bz(8?rx+p% zLOJvDg{MiEOPTp(;56JZe=%z3Mil6ItbShm1a*PHnb)_A^!|~{sty9QNCiiUvD;uX zAZj~oe&T3r{@8xs0v!!LeHHkf_KA%I_DsK9XcJG|ofAXz4B_(d(SUCn`Ad_XGmvR7 zUA)J~2O*UX7lGSETtV!|29VlAO74hwvAAM5xI}B6g_9>#EJq}kZ?-Oo*kfXqkZ&`e zCZWWta2)z6*o92cCf|2&6K~Sh!YH*ge<8*cXlA#hE*TiR+~8jBkC+o)B^b;_tO47h zU#9>znJwI(ICWI+xOw)hEc>Ld)|l#h-JS6apTH81_ll7cRQH z=}ah6Doz2~eD)lIB(bgv>do=i|Te=D>+Q#wBwSE`~hR8_pzHQ_eUj@3*e-((Ny`La40*J$o%h(H6WBs-oo=M zjb669b~D~#^SCJq;xFNzEjj~_YX=~c2A&I16V0=+*m^HXfj70eF}yw4yx7QWLJu_C zt|XvI&)8yCnbc3jNx&whs;ON$stUv9zNm0r^I$nTh}FBp2IipsEh(wfL^z8zR@R8o z*11uw=WoAbh38N;r$E9y9y2G?a3|I=HkJf(vXg~I;G(E`7na}cm!lM@coEM=$r6DV zLt2Qk)H+>|xPG9_i!_%*FFurSR7IDQ^LdEmeViFi1M`*JaiCOr<0_}wIrqWd;JJu> zz;&LBVH9TvB;z$<6;=I;IDRrU=CD2PsKU`3eixvm9 z1DWPs(%7*Va=Mw9_cFAU^&GAb%FIQq_6mn|K9vWw9fQNlJ;LBbPDIAzDHDY{mJBWU2&> z>lIyWM;n`jw$sX%uHEdAPL?MXtFhdT0X%Frg)qLihXUVI<+y^St@gvP8|Oh$wyf^z zYkFco(o%esj@rt*vsdcWu?;PA*Q@xl+2$!^ZbRgZ(W5I2s^I?TYe)dLZ#6mrSN{On5ATsUoIzWCre({ z9yfY9n-#VhbZFGHUsh*ooUQaqp7Gib&7M4#;R@0i_s&KZrIanG@Hf9jZYo>aR$6;< z()iOcjJx9r4C0u0JMh1K2CA&b1&q}48mcM_r@Wo+J}$w>1}3rRV5-Shka1wUUZ6IY z5)Ziryrcbr8##BN-2lt0#5F(8{$$q_LahbG-6jSb9f`E2=-?tG`(bG(dt0+h$5i(# zT#&sV2w~wHWSFMZj>`niF`1t$wKe)oo@~^msiJAL9xur$BD;~gsboGG#1x)KJ2s9)fNG8+?v9ato_I0kpcC3)Q5-?G3FnM}2{h~lv zP8cvxS(|a$!|msrJL5gSk~`xiHIgqN@ZC;TD*AQ?SO?ee*Q!pHk@l*;x~jj&ud@Is zdmR}2iS*f~QIq<;^{&$xP_5#ayf{{9xyq9&uRC1Y2s zRnrjCd3>mu2DI44s5k(w8kRoinVZLWtS2mSsJt@pg+ow9mtoT3)0HtSxTz}mWqeE~ zzyRI?!VkyE8GLX32wvaCV1XMO%Dx6mw@ReVD@Ih9`c9+VfHS@y54=15 z7#xDNYH_{dfG%G4cJ86h!hz;P?M(-GNN1n#Iw{OWzX-wB=!(d-QQ57*clxR8ZOa0> z;*2rSRrDiVUrUr;;&)Lv><7zmt!!0OzsHlcPHGcfA%CrU&v@d~T340sp4TMhkc1JN zj_gwf5fw#Lpg+kc2kcFBiO04r9`zCOVcPd3{V@~&~%~b6gPMYw?<`P(C&zT z6u0_TcX;gpmj;NC!5ot1K2H@y_TP&d~T4P9kd6rJBluqDVi%{XE~)ZMZ9kSC0H&d6GIpZ6lYSBtl(`xt>HehcoI zjuCYd=}#Iz9+KUvhg!vqYh0J)K!6!LnnYKS^(kaX?KrNBt#ZV|=9#kB&Y31j#r7*_ zoE3(xd&BIn1wwa-nQpEPgl)_PV8E(T&Eh~Fw-4_fIiWldGUb?L?emInewCdYVx*kh zpLg)=iXDwV_NhF{L_d_!iQ^gpshh^|YtVL(k33eav_2tN*BUra#zl%i zp_c4=sz0i?7$?g0+|!H>k`Tw1lAa#5*$?4WbvrLm9Z<4qZa)sfXH}hP6G+}^SAH@4 zv-%Gnm#i!;fd`cDv-ps=SY1A^_{bA& zbQH(Q4lSmDU$kagtZf8Yci4IXiqyV9O;1BI-N8_&*Q`PE9!6jwHgrEhzNejcK?{RZ zCY6%hg*rdBhl_hn-NN8nTqEQqIN2k7YjUiA$ku^2w9U(>bsALWigsc_5?kH)<7QB` z(`~SX$AaYafG27iO(V1iaDaSYMTLv-OT<-V(6ycB(XaheKjh<#%)zP4b`uj_NU6@~ zzsE&NSUzvVZs?1_@>q!o`}T_?4{1LnuUox`K@ppBL@_$TOASDIDs1a^-~10xG zL}}ExtXZaM*rPXa^~Iqzrs;`(_@;7(gsas3wK2OuCPS2wht$#FtI?AoQII7CVF4GE z4Lkd#m1w^R8furM!>!Zy;`Ovrf?99t^%ZDlL~0L!cP&kb8F}d!+Oy z4{W4MniqaW6!x6_NKIG}e$~}hiX@h`IJKgW+D3lIxqHufD`D(So%yL(L9?_2Rhl8t zYuk54Qo!#!1)FqM^ZE5@H8y9vSQ5+<=+K=%-1HdA^|%id5(&aCZF z`!_g>pFAHVzn>Sm>O)z#?!n+E7or^$Gt%67*{D8>w#x+XaP-<3y61Zv803%i6^{I+ zFWLII+C)s}l1vP@?c5vlef8!o4)jC)wR4PGxmsiGtA#w%a^o9VaiZKiD`RlLU`)z` zX;v@GRN>2>Umjl4M;Of-xueEMYE?3*Azn6V8M{g2%s}72t+poQA5Ur;7X|#bH1jvl z4s|TN9#dK*dNWaJB^w#+KNOm=~YJ5k$LPq!i94V#hcsEwp15;lveNprgIiwIH#btf9t9;mR|WL560+` zC8l~!mb4q-hCegM%aAGb&b&DdWn1c|vgzoAGIrk!AiJZ7yG1G29X=G>=Ww|MaXh-K zbeX(tlEx)?EBOFBl3_;`$ynQ?M|_cj{mVsw}v8L;oKwlV5Za-z#S1D{au z;*0(wDCpnyaeo(DoGdE^PN!yS=u7q-1>KlSpfqM-{&dwzh&+mLxw@&3_bb?2vFesU`I4)txc(y2P0=SlI7CjSitfI8UW{YZQ|?@L)C&Wd~}_Q%u>O3_O%M ze(ihn3%TwMA_vDx$SD}yv9>S`w7zeZ{)s06dg8tV155PiEal;^0N`3sTYt$p7}1y` z9bq}`LAmuHSDQ{Z&<@CS#e!)hT*aLzQhcUWItDT7JS@?cPG2ezz3PJ}6SZMPaHDj7 zS9e*S?9Q9WUcSfAZ49?^FESLG*rkp?qdmB{2@d!#?g>`tuvHtcVxDB@Ewd8 zTWK`C+nNPvua)qgv23YXs!mEZ)BsXtahX{(piVfWU+bm7J;>gnT@E+>7|{?$R`<+U z{h^|4Yb*7FkwBTc9W3UP0w|xhXJ~nzGk7XI*y{@S5v{4zaX*7s*qex5*#~z_^)WQ_wb2)POMg{&F}sxd6j1~>L*s+r)2xlq|1y=K{LP{&3DE)SnWVR>LuY&IK z`t<0`+Z`%<1YhwAeFp)>JeODREuON*#`3(1@1`uh5EkBOruGvWq)uZn7Q zz^p3k%&r%!CWo)%uKHN@a=7rC@;=#&@`)idHHrXIE#RAR1G7*go|X+5%45@Ispj`~7C0TxA#IJUyMzq zEv-Mm=0G|ySv@wEhF$vSzD8es$E_W?rR~;a-GL{qjulcicx$DsYYQ?5bL4RR*?Z8e zh@HgMqqEFPg>yOBS&$M{Oix_fgNRod5=DGi9&B<3lC%EYS|3S-p-&o<)MA5dRlb1W z!1EGKWtpZCMPql@hWlU? zp?Qt{;=mP(a-uGfWu$zof*MoR;RfH&NvX9ZiRXAoVrv+29paJWk=ujvUvU%s^#~64Wb5E_Up#88PD_G81u8kO;)$ z>RLjdtNs}YZZ|Tqk^|`3`jz1cwUs7|Ww`IJ#lE=5`icJy8!Sx!1~!;E+1dXSHfpuI z>PR`^{--JtRQ*5Q6indczp&8`s~kHDs8v4t&X&aCmy9!~qm9{)@v)1+IZx!_EAf4M z8Dv=cHo+YF4DiC^EDs1A zN4d95Xv)YLt-ZeaY;WL)CKsF)+|Oia5G_$gNbhhmzJ%UrafIvb3i*QaJp@|mx^pl$ zU0QJlEbx`LwN}=C5z&e5>06tP1=?J;00A$7YH&;PJ&6Mhc0-huy?JaVm)h)vsl@&Y z#}khx6BAiyyiXusC2p(n2Z9D!<4h1Yecny|QP!kPnci?>3sn?S0WuRAEfcA*4rp)i zoi@3n4UkTmn+u%kdpD5{ZW5aZ&2xgsGee?#*r~gur?PTQPhOlv1YgR8`C(-blRb z{7KIg_jDHTHTD@~`f^=Rdd@R4Qw}M7 z-orlqAABro^Hw-|(m(0lwvc9?fXcKeNQcmwp9z9=Q6!@l>rG4Zh_AiA`6um-VoHl; z+$syY$r_ZUt4wq0$PP@PY|XJ-seXFOOAmHtnc}=C;;q#xMtW85^P8B;Flu@DVc3xt zpHziTlu^p8EHGN$*lxV$Ny;xdL6D1b2{(?+SP8WVNuioo{btSv{j1Timh;nc`~!Jg z+%VMz>7HKv$Pr@;qx-diDb@My)Vzs6_esl=7p^k1mbDk2NGfo`B*`kjm4fCn3Q@Qkj)Xm0`Y56{;@*z$vN^)^>$FG`BT<|`n^5y}EMsmbx z`>C^Hw9RnV>Jv7jn-1$L27hcdV`fZx`EIbDxmh2Rc`B9N(Q0kTkuKTrDftW8owVDe zX49YZx}>~od%_MyDyVLaJhXq5u=J!`Wz z7#dePdbY}CFGvSX6UIvfjmQLf53iS9H4U%KdzvUI3xAB~1`=o~_wJ={QO_d24F5sy zqZ|@QxaqtAe3RghvnhGQ&{$$iS`v3 z%-gZFl)r$cv(%dbhn6tLx@UzePW8NVcw(w{QvKG1KqTPvKc|5}=&3add|`V(A&z9g ztadLqTWsaP8*X+}00hO6bQuQZ#O=!9^qhr4B8j`1WAtV%u|vmjPQDkK!jo4cl-?|9 zF|fVo-qivsHKtx9NmD!(QTJN7(6SnTTA#(-&p~G#fec({ z=T(m7S~lSP6D-KQ91RAj_6L{|Dj?0ZCj|rE5x1i_G5?D|vi>W9*@HHI2)y0M>)HAKfkh;$nFw; zc8~NqYxnMd`;Y7zWS=4$EWQXoL>?!QucynVz zwHw!@239+c5=vV2q-y9kS@{i=kK}iK+&xV`96QA)mE${O z{}8D>ortA{Q=^cV@ba~h(`&FIhfc~=pxuMfd++ORYpaV%7tf9Ajf9$W4}Y#-yQcD} zk_KEXw!QpN162oWKKxU)AF8ZDaerJTK#ob)kS!)_YmQv_YjgNFpfpZTjn*u@?)4J5 zG2e*&O8U_%Ls@q^j&}EE=2S={OBbPfN&@(uKCQ5-1P8kG4)d5qiefwnW%pWF{lsQ@ ze$Z@+*2uBARNy9rVX6+Hdh4A2;;UjxKjv&1(tZ%SDSM69qL!7d_}p9u1}gF6iFWqy&o9e|kYPzp7YvWSc({O-{Oia6}|I(1r0cdqCV z8PrISG`O@>5UlA$#VmSe$*9cgk+vB*2>cIh*RZtne*A z59I)#haKX`AiGO($c!`aQrcI(TV~)r{~=c=ZI(T*@+bL8n1zdKAh=ByNOQD^I75J*(LuG|9dp17 z%McetK&yp*7vPz;*7B@Qz+hZWb*u!TUg_4_A)3WScqgQqJpS>DTvb7;G;tgkR)LmL zWX-`F+Us3$ z%aJ`T5ny)9MY5|5YIJTkp@~HFKr}sH%hJgzD&D2zyQDcD_50zdE6(!@k0%v}ua|+} z*$adSzbA5rUGy0S-6%5(X*F7&6(~gQ?0(;j^Xx$8j#KeyU!h zIwWo8VB5PF*eX8sFhC!SU^MVl)3I5^u~gp<$&nB74iPPThCgdh+>yz<)eofXPiHHU zF%+&IDqZc<6!3Gy0~V8Km4QXQI#stC+Pa!UW6kH6+h(``;y|y4m5*!;sTs$Lq4ThH z#YzI7!uNMy%~)6pUG(?~&yJH}9r{8)B|KgEB|0Xwy>^-!Y4Pe(lpaWroY?isrHP#W zPx>;tI!|tzN;bpwWrYGcaabQa3wZdQR$*V`)*%{+%a;9OY~b?LjRwnS6G~eLJv$9` zB{ksI^P!jPMAg2lto;cH$o}R0KR-qlyQ@llc1);%&=fd)trhpU(VF#l;(FNZ>43cI z@jCavUIJY z1FnpM>cOW zu(SG26y)yawGrEX?Nel4L>@)rQfQ=+Z(*?rWimKZQyzjZ!Jr6?L*M2|7|BpdpFgKsI*G< zVoLmO-lD#-$bB^KwhM93pl$EXT=e4b>YrwUo|P8CZaV1yUc;z` zS(NH6NSU3C<&7|u9U0%ixH3BNf|v=@H4`9h*GpTw^k&*T4yAdA#UsCuV7AKyR>*_8 zUF{s$NIeWTd#ggWjk{ZXbv*}<^@Y++XW^6&==qEe%hQTvP)K(yxjutAm{2~F#@lhIW}4cuD$c_zR}xtw!NOyeqFK z-+4hqXK8ldVPsF1uhTL9)-QB4&~3+PTh&G@lNX%g3Q(gJ_bmNY=V#`QuM z0UbKz5Pnd|1M5Ul1|uUS6XJ7yNmzz%Tg8{T8CbjldO?bX?rFp(I z{&=p1=aXhfxP5Kz{g6Cl0xt&>hl)}Q{7hnY_cA3O6bA~8>h&=3GMaNsz>S6Q z*t1)JyF*}>2+fe^Yjafp%S(`4kd&!5p*=<^CveGb4H@0ym0%uFyskJjpSD{h8&k!3profBvKD9{l zT2YMiVQw-_599vo@SL@S992y{X5&#^{NwWE^3Wr#GD%Bh6by|?=g_wC3n}GDQe*K2 zo?7-ki?zeq)6Ni-LoMt^PXUXgn1F>*6PTmdm@wn_eyzm$KF})ByX$pjDB=242>xtR z)@eJav1D1823|k;I56CAHk@nGY@Gdtu~F+moP=fY6e>2X?{0>*+)l$YFFM)<$XgtD zJ49X3(y-`pcau0Em5nvRZ~5#m*EJhilpgiBrsc0s7{WyOwuXca;-EXV;pxp1guJdK zuUx?wzvFHwx8FP$v~+2*$~lZcZU*VO<&Sa~X_WlsL%6{=?jQD8x>eSL6zsI6_m;Io&nSB*EVD`qv0v z9XI6lXn$STz5^PvC_0zZ#>3EJEFL`A&(GuamT*u5sFh0dKj<_iwB zxj7O7Z{T>^kRM?<-Rz9_rugm+*NG%jn(L zD$d=ul{pzwpt1b*6$}azFevtRv$|aN*iEeJDyD8Z7+IDx8d1;?_xKFs>Lq`@ihD&W zX?!q}Vtzry>SV5SG`aY9D4ppw+`Od@O3LFRseeYzlDjF z?cWL0KO3+uTD%E=YodP}uw}9^v_)hWz<9b~k{~6#rd?!VSG?up=o-g25#EXiQNw z-*ELh1;=l!C_Rb+`ivwFuC99b{<9`76(r{;S8EVP=}r8Ys*x5ZEEx^XsU1^e3}Y1{ zLyC{;NQDH-LPbN0=UOx&9Q7+2JaP8nj)2VvE@o{U!*3e0q+WEQ@A2 z(z=UUlC49xN-LP`se-uC>|6aH!o!pcK8$;~YV6M9KttnUo`vlUK+IXu5MS#_*S!3iTD z+5~&V{4k75C%BZJerfi^zivgonj~r=G5p>`rBq}bC3VOf%)-YHO%#!Q3U8{3GD;pW z>%!zNS&p>soa8K|>xs!b*+Gcd5y11gqv|Cw3=v)EIX;h%b z${k=JI%|XnFT{hQJ%jD~t-2dX+pA-S!#y{`usC9fd7iC#yAT){LZ~907$T(u|7v>q zYb|%PX#(hy{m(*a2UwkSmkD$>6(_cn>(vsM+Y5u#VsW+pp9S0^lxw?<<;J)EG8wh> znV=8}__Q!o3=6aqPh8!aVYuxLEkEOOYzpdHqD!i=ZJE+BAqk*>++q{<2YOnJG%{a=~uZll+_8cELxa(c^YzuRHqK;;=wV)2`ILzKqdlwHMHE+ zXmS)l%CK?~3;14z=0VL_>mB22JQ7ejnUg#Vbw1DRP8HHLjJ?kz5`&r|Lh#d4d`zSr-8oxb(B(T%{y+wo{^21KZQw^>LA;9ny1* zo*XG^u$CC7zUN&yaZ*(-6v@`sTcup;13-(Jw;A6-B*2Abpi=Q?96qatJoOf@J?&-O z?{e8#<;9oCUNegtY^87X5i0W5A_bh7J6*KraC2=l)+dJO+7ZZ}eL;xkdH1bsa4;Jl zsjZaIN~4_DG5GsG*tXo9sUMVuP3vU)3;bX&Lv7rw?l$?r_?1Q=t_Pq;O#W&Tc4KuB zdAE3bIr0%-Cd=P|SPev?lGUvBD7SWP&bUhi_%I9X^No}rmE+>7bqQ!b*7v)~Kd0;- zv-m(RI1JPuvGi97N75gLqTsot4JM)86r)aKG~!f5G7(zH%o?HvyrQ!!H^HoHWxO@l zSbj{*HB`HrGSo>t<9l%*u!MKMT0(hituh0U_uUKH)uUeOA|ew3X96S#AlWq$Wmtl4E}KEXc;&FYDWDl~*JyUj)}cbOV+U zy%YUFJI|Nh&3ki8XHNEprCU45pNt==)!HkVx__Vs|AKrp4_CQ!Pa5kbjTXL_`zzQE!D`F?e&JodM8{bsG7a#i88YR!1p^o9r z&9)VnHbLOD3eu(I{n(BaZ#wKDJ;oqj5DK@K)|4(Z`avpojX@tQLO4R2mGVSK?PI5U zD=a%MjXF(UvIA!;LDU7eF7Gew;+)5jEV@?W)+00I7U6nRIizc|#ay}bpjd$>A|X#7 zEhPAW-Uq?bBu+W%2N`{TnXd3{VHwuMZ>+_JYm{?M}Sk_P9!h)gSz)hdsfKHuxS**8w?={9#WG56xWI+4bY zw-h)0{54u+4g)R7J-Qt@S{N^ts?k_nzF-X4PAI69YM%(wG|0UG9%>nN304{DB5ba7 zE(|xZI9#{P$={-D7yO4+yg!|&mE0eX_&2j+de|W?;NS`?(!~+>_OWKv*l7K2$8#X| z+6VyrLWk1g-gC*ZI#4Y@-X}ux9W&|+k@dT4-PvO_O@o>elFER_VVc7dY`b>TF)M_S) z#F$=x4&D~Gt&`y1M_f)2r+e2n{W127aW{UNJ6+hFTH@5zkvo;RIDl4)t+qYnzHaOP zWQLkvHUC)Al?=^C6pYSbB!qq6<}(0{$mi!Fr0GV*%RBOJNuXTJ{3+^{W7T_pW{ccr zK>BOHFwHghKt=4tjei{2?Cpxzb(lTaA78SqtUr8>U@)~n2G<%nCwsS!h%alf8fSl& z9bnMTlfA4u9tUaM?(*r7Si4*Lvc~JG$9$numKtdWE-k=o2F9LCmy#-LHYV#_ixJlwzwDEoP1Ery;|-NXQ?s5C|;FwI9EG4WO}C(2mqGtntk|h zQT&A2t+LlL41neBD{m8dU(Mk7C$$DKX(ZmrksmpS`6{6}ZkV{3^eq zK2l<)cLcqJT0dKFdYt}-_M;Mi5|%N6q+=!vj>;t3WR6ub_*oWZ0!_Ma%rtW$Rce%o ziaqt5wE~D(o>aatPl7+p8|P^$-Kxb{o0cLakY%nhBFB6bUQ@nGVAk&@B~&V^o4T9A zF_BC&Gzn}N#dTuS`1JkZ!xlvXE!7&l-r4Ebqrm&hpIA5LH(Zkmp&Y?Q=&`_p*uo`n zD)1{|-;i}2r{u#{-w2Ki18ATB9=?RBd9ed-P*4|-MyH^rR##95 zX^F=n-@T2-&S$}3yg#+3|JMFdDX)m%+$CDijOI%4X3U*X3P+VtC!H0w-+N-(azf3d zwxN8GQAL#XHsZg#{bA}WnPKqR2Y2K9xEMV4<5#b9dO`;G3(wVK5^wkgTL70%2W(hW zFc67gS$RD=`-;?yhm+xc9ZYJAP!TrU5+!;yJ%^!3#AasLqh^RHESj0MiDzJOW6^A? z(8JuS%6_^t!uMO&Q1&;1Rkg^b{K5?E`BR(a_F;! zSzPX*|7Gp|omYj0mGz%%*I*yY1h@TwPEcP}g;eD(B8dkT71U~doxUkzY*~^lMhy4i zCxx&*H<14Ek#}XG?ICC33iN(ldxT}UB;lodc|krHn8FcyT+j^nBdswfjI{YW><f{O1eepF;FFo+-Oe{upFwoqM-vP=8M7i`ja6ZZN zIl8wU1(%*p9#SvQOAPBzAZ+SMw)ky_WcB@nP%*}-(2}u6l;~D^Xq=~d52|pbFQ`6N z0}t~r^@iX4a~08F1kXnopS_&?#N5%7Ed!(ZIc`d62Z%KUcGCZCx&C9|NX5Pt(A4zE#W~9PK5pR|-u;oC4Jay8?kk0E$oiu??49g;`G#XnnJ31Ua{j?ieEF2siI-ZM43`+{?1DY?Y42!Z0s!U)GUfABp z(bQ71G&p>AY;rOPt>5SUy>rj+E#sb#B3E8H{IL6}WVo<`rGurS#w9fHwvTQU@V?($ zs^F1_PeiFUR`S-!b8@j$LPfbjQAtU|cRwI^XFImD1AKR;JUt&0y0WtZ%Dz;Q^p@xI z>0eH{b>w}1w0`6ZUatFH*&O-vndvO9wrPJc0ul&|1h2o|K28~M4bBG%Wy<|Ea;Beo zt$6;J*G+H9nBUz3G1uc^#=Q9w%-kS~1IcbWWB<3{{HwMyE89Oj-g?QK)_*B1{KhZ3 zN0wSx579~}R23KLXP&HcU!93{RJGm{iGxAzdT26um_yFni--9onGCBM;?&n%?Ua$B zTCFs^AFnlZO`u9GT}D%5dI+)aq=ajF?xolZ1&-k}fI*NVKY{uq@-P#2nQ=G9<&$^t z{?~3NF>PVd<7X-82)u=r|2d>3i&_g^G~LK$y;Kk3V;DV$nNI%@p3f@znRf2lLE;hC z_-GxkD5$kzJo+frX|mvY`kaSIFvbO#`jIT9`Mf(%19(;UpX;BEMajD&v*&fZrMw6M zQAvDcv&8pNx@2FmM}ov&IhHbLB;W+|(PKaErO3(914Nriq$5`(g#()pEVn%$>*E~) z#-#G<$Adb^yE{dNSx~r4L%YMN!Q*&o4Bk#y77Mz*YRUx~BWG)0Pp#}PyHVQW5{p+B zJslk!Zy#cnz8;{fc_OGGylUDSN$yrBLUn445TIQLjB+V`5)-^ zfA1+^CSvDc=VJYTY)EEycJ_aW!IdAhFPiwXqnd_?g2!yGN%HtQG#oKXG7>|FDG0O_ z5g9WW7`U7y1zD!4u{j6{QF|R=yr|kx2u&D6Nh`L07gSiOxQnEwJ(xlNEV{Z2cm8RJ zmSXy)%9|qV@3)rz>8Ik(UTt0H$+`G26uW~km7TxIa@zFF z>~JAe%fL@byDIC)=8~N!WIn|3JJM_&zUj#-jv?Vu{|@s48Wvm05!X>5XQWP#g^@GM0v~mX7ifMRFqbK zTrYg(h(FXb=&+Y@&-frSZySxxP(~OHshv=M0Bp(MMsR9GIdh0mXo2;Gdgsk2?WFZi~bAFVt?I}a_Sw#FDPZ-ii{H_|2HAXh}{`Fi;m))cQek9{zZLP zsM{|fzi?kZA@S<4;w_|oDsP0I2>l5EPz+;)x+v2MN3@G_OI&TJR4+uAK_%vi#KBc( zgF<;<`nI$`Fo^wlOHes*OWmn>2efay_nd<|1qdf&j>)nV18xlX#CXF1;Fy=++TCCy z^POlb=SO*m1QGlKVLRb|0~cGm_S9_zJ#ij;{DI6OtNZxArA7jT2`e#xxAil!Qh4t$ zUa&_hlgD=KZ8`)|gIkjKRJ22Bf80_mXXshOP!%|pVW?&d1$JFnUSU%$t3k4+hZ^9U z?299BVV07VDK&zT;D-kgg9n<2Jm+B>i+PIEuo+Y!7!7bxsqJVF9>`I`eZhDm$=1XJMYWN{X~R*sq6Z0cw<6x5YpJ@@ z#rv`i@%;||*=1~6ecxr`5*AaCDNafD=q4cRN8?SHQ%`)9ZMQ>08UCe=*pj9Rw1ss# zw6w|X@YjV8BrzV9m$&D+lbJQV*g^pO%m9@KkUMYOikf>w(>ffZSu~>jag?zFvez6Q znsLiNwMz(+Bw|*bqM0aq!Sg;?a=<}i0LrG?!^4=Hjj+7@Ba?du)SuQjWTV-U}JbeZX}+QXpu~uB92NFfR_DYSL97PJAZ;c*_(`zU0a08ppNMvSrADx9kH`8^CT-!8j zFoTbyfq01TTPLIs`U{pr!5bFmyc%QES&bt?UdggSmj;z0)KIImd)Fy}n03{vrahzX z=gg3T0W8b))x8I(B@;sp-dDuNj;q)rIf!+1lq+RoXWtIJW;fl=ZnwMLa@^l4ajiqL zg>u9Z;|zz3Op8RNn@Dm^Po_mktg1n3ZsFpRcU_nBbDWpMg5Bgxbhi40S~lj+fcs-u z3q`OnlckbHEhY{C(VlcX?Z5{Zp{7^wQ4!5B5giQffs-x3z(ki~TzXzL@p|j|ca1!; zzddp9RINKdp5nh#(Na;-X6f}W(b?Y7>7H9_wqM16Ja@evcXy4n>!VGLJYRVq#QJ{3 z*=jHEYjhmyG34F$(ss~$6EV^nJ{!za#w4)lnsvWA@#bx}7iVpMai9A{s&j(9OhqH<~s4uD*5jXxtLaIV2=B7?v}g z4XE);8=FEclNLqtz~$1i(dil!@vnMQ7z}#tc0~QctCj89ILnVZoYFnP)hXBgRRq3S zzIndaQxe?D>Ur$DtJUzYSGVfKeHfoIyt5HX&PX zZl~O%fT2mFC|v`$xtx2dn%V1tv|VzYJ6Q^~(T7kC+E25hXYj%yvxwZdfp4R^scVD)52i%h(#2{KGAsZPP85?S;SjkwtNU`CVnCy@eXl0|4 zL9G*_+O_~dH&AdoC>z`}%&kKT1RbLT*{1Cd&qy(gY7 z%?PW6&Bffr*@~mbF0l0g2`80$YKr2Gc6lJh_<+#n3nl;k#Ynr|`ey*;ZMu!j6iRLq z7v&T_tGw{7MAsaGb^Xb7N7L0h{!X|$E3R(sb@#`OcF$Y0{@zAm%X zT4=;vt#GeNN{lRY6bjikD)_mViI2EByzxXN$pN>Zt82+Ea3#qBYLXFw9f82m;Iwav zZcI!2-E*OM6So)oy)AF$SlqSK6~lVzYFH@<-VLyBz$!FZ0o1k1c0wz;T}NN@ayPkE zhhb@kH)b_+3t6H{h%v4db3Iug@a6SoZ8q%ba4ywaBT4|+Qk{hqE-GH=`&@j|73SJX z1EsMXd-H+Km473Lnorkb1xKabTH{$NmN!mF;W`AtpUHKKQoaQ__=!GE<&w?S_R}yT zVJcrWAV1KM-+7gwa~AGSr0ds+Efnd?e^yqTOYI~qoHGtNDI7(I0mexX?Pc3Jwb_>j zr;5!vKC#SfgZ)O{yToS2Ohk8*XbbMMHsc&flTv3UUoH<*WF0%uUF0%;GPZoMs+p~8i$veb5&JGa3y@L9^C~ZqFR6K4b%lW| z?63_koJ!ec9uytUTjXRp@D+D|f$}B66AZ<#p4hX1alrdG)gHQ^6XFiyv3pruH{V}< zTzOtFd<%Ra#`pc=LF{PCY~+3VxPz9bgA}#3g^t4p`J5i>8|L_qQ*IK~%6yi#m1B0l zU$^#ue#rf~T({2P8^8*qF?5Uq<|zo>2y?sJ5CImBz@b`e7c?#xgnMPw;_rQ0&wdu*{S`gbIsKmhdPb9fzJlN$W4f zL++6}MAc-5|!EFt!bQXoVdZy3Y%OLa)p5I-k6)hAT@ z^JziV9c7P}D&_Yk_KnfcP=s^j`l)3Y+oxB z{34b~wvwKbqLU7VM1j~0;$>c)?Goc^zR(gPrf++kmyY`$+c~%YLQ!wM{B=cl)s$o1 zD(S%*S5DTFmLk)maB+G!^|z*CKGk75aHi({0BP@ZI}K-rX-5sli66sdJ#x71K!zO) z5P{XX3U9PQWKU@8m?$hOfs1S&JW7XIWP#Uw;#$?cBhZp>8y z)4v(&uUE5Gg?6yj>iU+8q35^y@-aQV^8v4~$M^2j3FW=p*>m7abFqVK!;0MLu3xqTdZYHE5?x4KfmxaaQp`+9Nb&esoG@ri#``9Uz-{rFl* z=?jGL&D%Q=QNN}5>32tE$FD_prCv)2Dvrd&q~_)V_LlZlHl<@`$By#lf>`D4X)O=a zl4p+Ba+Jx@2h~;mg~o?4AEBgwK&BxqCcOE)%?37!uJ8z+{${otYdUOZ%zxX}+k_@K z%ew;Mu>syGE3&XjZ=OXmy4^~F?1hz;fO>;#h8pOPOkoNU*fI6?69V zia-7sM74e<&$rB430FFA0$Uh*3tspFel20w^N1R+Mn$Y3l;FtFmSKqFZ^bh^fM-jl zwoR=eTG>aPl0g&rj59TkwK%fka3Z|fS#aW>EW+D!G#miW08E_U`)3nO<9A-n$Se!4 zF2w$u<&_$z*v2mA7g&r_F26X!?Oh>zA6+t3NOf(RP%%32ZkAs05;Lb*@`C)Co0+|4B`qoo?Q%n zn0>oEFC(EIcLa(;*rY(5P(b81Bn1sKelcaeG?N3EBp9zTs!61ShQgp>Co^myqsxU^ z1ac!wDX5k&Q_!MyK9O2&y+*#;aaEG4+;IWin1e#BT9^Y$n@~+M4Ld3ghNCmAb28WT zzjd{Bt9G&W5k#w-a0l{;F}{%-gd1|^5zi&D@tuTH)K-zeAF`>$30hYV;5!MJBdH13 zdD;7HC0dRBQB=+NeFy`o3;vY>)Gb)`DV)&81arBk}+N3*UoE>$cxOb{Cbi? z(`%6d%0G2DWY{7YTc0dRghrqoF&wZ9u2Fc*kGkY!o|nB6M&@>!-vcZac7MVcGW zc*7VEFwDYhfp64DWoa|HU9r+?-V- z+qzcuFZ*7YyCV(Izkqe0CDp0C5dSZ2d3lVVWH(J?S=nGYge%Iz zaI~Sqw`S_agK4Ga*LO%p~GGeDdbSEq_C%C*dCC#Z^=1vK)mV{mX%Ff zo$w4m^HrW-K=>6~C0#q;m&zT1wRf#>912Omj`kPJ*Xfl_(L9JR3kzJfpx-b|KPdq< z?k9sIj!@Gg;;^`}#zwgGrNWURpslR~jnra}BE!hqLCPYXSeH66vh18Oq>3CLwbGDC zE>A@+_$W+fG8Tvke+Bf6QOfMdM@ELZ5BB#D4v@t}hAlaro~nx{w*Fc)#m9B;D>2{ggEuuaSvN9x z^-6c$uH(tW#cDXlvg3UGnaF@^$NQXA*ww~v-|@wFx>Kxk8%j@}6hAn5Jv}jUUwy-? zfqQQ5lZ;{lYzORTr&0#9xYk}(PsfpD`)>0)_bd_F`4gVGtfO=|CyeXg3R^v_>#%w8|GQ${zne%Yh+tfuH` z3}^9)N;_6tR(lG8oG<;+;6C^~m@3$^S&2UbxZ`(l>208;8^qse8}#LPA^^|N{Cv;y z*5d=9TD$u@__^fyoS})oS}!(sqUL*ujHAl)#k9(3LTM64yD4t&1S2gr7dJD>+2JP5 zpMVYd1VjEWWrk8#a?)3L_6WZ#6PI8X9j%GuvqOt$kzCHmNpL*Beu9m-1-$aiI$t2z zv7H9rv5L7I`}SGt2kswY6)QK}P_x4B?@VOB(rbtSh#6oT?%ue6e{;Tq!H8uH7D;TG8<3CrJ6f-_7fp30uZ>3NI{H5(GP^d*6WazmlGcTaGJPP zsmQz!A`ZsbYyJXQ%?{+mDRsKSMK}&0+|@vy7=av1qDIRD(UE|D^D(UOK+2I-lYY)y z=%s@0M&AjtA6|LxtcgX9^K1CckdOao-V#J;{%TQwU+hJN3F)&KNFumLMGOnAR}UY& z6-T@epoK+7%&YY%3*7x}*u`Y-sW1 z5aHLB_4HcT#hRO60_9xo3uPbqDr#DR5FSj8TNR@sW{rukYl9b+d$~d}&opmAqi`$= zCpc~=EsWSd2NEMm*c;S>VoJa?rn%I?uivbGwLl{j%BiNPgAf3pxCA;gocdy1Pq0h> zg5n67J(y4*&x*vHQ2Jwfa+bFYp*9UW$~5{^bL^9h&e7;D9hCBe3t0Sexo#ax=H<-J zk|C2im*UP*kK(gm1FrM2B_pl8hl<~hdq`(g3yp;4n9jS*!1}<`ScU{XoSQ{kl}DET zD{_{ey_F}gP>-N~^B+^TTr(Ei=g`M1eKd&UEL2FChe-m#qkh2q*oQ&|MCn<)V%2zojpVT+m3=xrJUF4&grP!E8R;!#lB?6`CRp-T;!D8?hi@b?_-MU56_Fn4=<9` z$aivFtnZJDynnlsH&JYqRl^*slN(@MMw3(gQoLaA)c=#XvFS5JhT&ybuol?AwQ|WB zR?Yder2jep(l4_k?w1uh^;)@K?zv!ZEz{F|@~67#L2v!@^8kuPnuVo~m*@^f?Dv&H zFg;o!VUDE0NyovEY{`IHBUSs97vXpJ>cBrCTtA+5(v&0n@n$dN+?RX(=Jwd-R`Xqt+a;)ok;qdz;okw|Z5%pu!_EEs>Ls;Y)ii@q^ zC!5L?wz;52X+wYW%s2UR`=+^wDD?bH=B|pZZ+iS~hqAAuc67k%-h&Y<&8GY!a`U=U zet+F=x$|eS$au2=u%-{^6vQbmm|4?~vw#FM<^HD2p4JX^OLEdSX~OS*NTB{h%(?B7 z9C3>=Qn0A!Dde(G8?#RfF{0V9)T!79oN-B$1GLZ7k(Aw=yQ_QyQ_{XV*p=U#Xf=hN zof>+sH+6V1FbqMOEc9NYlY<^nlI;ce&NxQzEb6(zMSqYcAc{%)#Zdfs-HZo;m9>R@ zSSds^74glR9GuwI{olTM_w%9@@XtPYn zx~ForP^+Z2$ai8cxuToJ4vD`^62Kb(J619CJ#PP$cO*?y2izSa?k=ZL=_r6LM9F#k zvidr04NDCw#{iBGCFPec2V5M0(V|2BdFcKfr}#%#v){>d@ZU&9f1GS}Cv4XpX=)~F z&r8E$ZQCe=y)+egX zv+N2wa;I6#eEgE2qy{gZDJS5}bhK@dS#eky1t%E6P!7odoSK*Dyt1e}(Cn|`+ z;f-BScuQ&5-9^6ArS5Af-N&XAIe+*u#vc%Wkn+@)rf;NB9rn3}+bgbDl%@sz~%pGt8+gokbyQ_1l zbGahnSrRZ&%B~QINmi`F6A4+fY!tw-WU4Enb>GgFnClwyZ~}u$HT%8Ewdjzmk5Ao8W!yw(u3|LxF<1{# zUeTex)~IWMFrv9cb4!7|$hqZzm?-vkQqD2>#d_h|t?<4=IqY6bQ8)(ayG9+riWZGJ zFlA6ov+J1MCV}@u*GK4+(z9&})ExZ9uw%C&wGL_8*A1hP$O?9bG%n_;5lE+=+CP?r zX_cBLp*{Z7Cfd(@=5_sR&+JTnGrM0`iIrP;-PL{UHVkFGi`U+nOe>OIR+~Z0l|SeP z1hfUKrveVnPk-t(=@GO2=EFyyPRw_!{9-y763Z<(r$eEOo0pGE=on4{4X$pPV`%_% zG_Xh)Do;QWiF}L}T`YqH`uD+9WV4_bIj9R|;<>_$2e!s}##hzdf&8p}d0)@kSsys- z*q^M_Y_-(otY+q`<;L&@*ayY~KUS3BJQS(A3-$^8S38KR^PEnK%v?ZTlOa!W(ei|) z?e#tQ)U5``Sw8r8wu!aw!PtwpnPcd2Nb69V{l@CUFZI@wdx-06z_7YqTU9;Q(>({s zvwO+qHCM-F&g)1$&KH8oOU*`5J&ea`0ZwhHWdH>41wv@UcL`+Um`gy;6NP56HVL2Uh| zQLe0K;N*a^?Bt@=X2lFD4TOI2CdQfK`7IkXmHiWbEd`QqWU5m>qO>`i)3M~j@hOR9 zw~$0w;fR=0S7`GQ{hb8Ffj`sREqXi^kwR8Xxo3(8p((Q=eT((H72GI7!yv<1{gZpS zSp;3Ml_(YRE=q7ys6RrXLNv@n+=@lHm3J3J8z_yet46UU(bmLq7UmiD%ry?&0KezE zKs`r-Vs;wdF=W6lQ52N;Bi3C5ezXHN%0euOE{Iy3R24qbw{5Bl`RlkP_$!VCCznc! zsffi|Z&}uwvg_WRE}qk#am-1C|NbJ!uKWIu90BRH9frs+1L2}1zh%>|A+iBeoQ#YD zsz5LaTn{THE9-E6W|Ou#k_*$9)U7ak=ag&K{W=FpA0FbSe(@~0JQpzUS@1LV;f#GH zGWhtjzlA)?C?WR8uvI11RFoZCR;7Ruqrg=`!Eaqv> zW!7aL*_;X)HaRx5dY(yq%lJ<5HRDa=bz?V8k?1~RO_OLN_BeKVnI2l*67#r(V89LM z!-eCQft zBHH$(O44_+a^)zenBZT72ds^?&I5O7>*p}Xd^LDn_oLI<{k-c9rHRMXSiac2PGCJy z;l(iNu-h=rB8N0b%%LSGnl|k=@3v=w zErch=MR(0F)Cy&RUGPYdb;L*%30!_ixItkFE`I3PUgJ?rKJ7n2B?hOHp-8Nyj6uh!Vp%Mu4xd#3@INT;RP#{&acU~2q#R14YS0?{yUfLcn)!?% z&^< zzF3suC}X(7;s;q2I`FId_wIvh!A~ggi-BSgg*gf`-Sr; zB^VA6fZiTT{G+(Ul{bzMgrc5NfA;Ss7bs(Oo{}GjD5O%<{WkBHJ)+x;O1y>C%Z*Ap z;AK~o?(mcLp0+fHEiC~*wB1}J21j{CA2)0M+f&Ehr0KXpOK$r@5w$?IjPP9jGn(mk|pQ^Z*7K(U=tiQpv#;T9)QPrhsQn=@^?Rb0SbQr2tuQ4{-O5aM!sMQ%B7^FW^R^|+^ zIe*0OT3s~W5W6OP`~6A%h`TC%V!IJXKsHQ-h_W#32ZTxVrdXE!78NcTcWLvy^CTv@V28;8$@3pY z%1+F8FeUL?V>GhllC`fE!K->m2RR`R*a&f-S4gM`W92~$AaYrzWkKbT!R zc0e5vUlQxKS?Sp}n9MQ+g`Sr9pu;kT&QM-Foazdgll?%G##On)G;+%`Ea|V0Mgf)% zzs)!ifJS#WS=mc?7+;b6Xj}roTx^lKD>>(i5h1uuw__&7I{T?JNgfKX&>SBLA@*KhukRqR zS~e5mGoov4_P5nSVtLvbq}EJX1dDP&4{Qi7MqFFI7GA&Zu69?|hB-#mhdU0)CjG!9 zgyL^}AzqDHr`VoCEsX)P9m*X#9SvRCIS2oI-vqo;Atn^CocYevF09 z<^X6;X3*}QuERG<5Q@5I^M_pOM=D1WF@@O_y{4k(_Z8irD>BHm5x%-zLw?UmCSg!K zy)h2dYRP}QeM98S+;b-JIqpBff31S#VF;fQV$S-a8`g~GgrzD#xk8I8)N+K`#JC{1 zWB1sOe0I`(boNqp=-h+xfcPT56!y^Wi9TaI0l0L`Lf5JZ5cDSN74LwaigJovjjly2 zM4Q2Q&$@k6x#iNZ7Oa68IV^8SHbb0|BwyHCqI)Gg!_Yi>y5PRS9`i$d_@E69ba;o( zQLZTjLx;Ky&If!pJOBOpan5f<=z@Sb0>7}o-0?4|dhXXm!t5#dd3AtF`~QxgXJVp7 z(k$2oBAtG+{}e|Qw8E$QvBFp(Z$TvDX!^{ zs4M;Azk5TUGk`SF71;&8TeOB*|DWTcr|g?gXMpWLhkrY^vmWeMJU)|9;#CnCoS-@} z%65?9(rAiU{8y&jQ8dU{N45{5eKITY&uf zTtHhy?K)pTTgdI&BhOYO(!?UqHm=qC_9?I#JQlNsYqpu_ptS|WmV1B1H|+GskPcL6 z&Bk?ocr;KSx)DISCl6v9q*4XG&ZE?37}y+O)b{6JkCK~Hfz2UGZ4{ukB-j&QytC{b z!%3F^dR&Ti2481C#9TqL*hpl(CSk?$RAkW#(o*2n3OG+7D7Rp&5Ib|25nNLU7q;e$ zQJ5peJP_x5Z6rjf5Q?P)^@>(NiJ1veqqhpED7e?t;Cns{?0`6?4YG!dQRyD3DD+aV z4oE@o(}FRSLy0NzQ0dF^w;STIpbPPAP@st^3#(Iw{S!V_X2h)oEQO+zX*lT1@SU#rG&E|@lt)N_NswxY^!`D)3{Za}AZ%PHn>2IYJI| z^j$v$>Lc^}F_3sz;oNQi!hYoodpRIuK>Q^fH-!69rWN&aw!u(oBH#jK7a_tNF-^-J zWp)AKQcy601jyb z8N5tQgquHW-Jdc{luKHxuoY6M=LIa3p2vLe$#qS+%sJK^(2EUMx)_nv7NJU48)kyQ zP_KKcZ+a!ir5q0D{HxBqor)S0GhSt=?95vF@V$(1>KDkIyT zARk)2YL?Iryd=Hu+1l?`?J;NfIeoYH%-0-sZ&SeF%j&lvD*gh)=b%aoLk6eGY9NeX zu+c0><$q!eoyvp}gz^eqH(fQK8NXIc8Q4Uml(0@tH?iGbm^v#A%N~w`LgEoPRUqX8H8G~b4SR+Z3O0yt^0Uf znA<pJ+1!&R)|EoYS{SM?ZOZfyIXRYs^#RGqtotLL}wb90cV-ac<-iVFK z<@%d~2(ur&hIO(kE_TD$kPfbhWui;qvibyE@qF^_e#0dJz}q<1i+pD3d@ri87mvo` z#qL>w7PKuhRqLXv6_y{3V!M=D88vX1iVS5e_|vyA0`{gp!INmW7KB@2X1&4~a{-zj zXS%M5)LR2h=#^o5dLURvcV5`rLMMn4^8(S>w_;3f9*`i-Jhc7)dOb(xt)z|j1;aM69Lm{k+`mhSyL`M3#o>}rmwn6(;e&$Db1oYw;FA>wJ$jJ1}c*j=0rR(bqy38EG4>52MNN)UTvlw>@8 zM<3gCQTz?THC040@~U8Nh$<7luRrYjUuSaO=`d}vfE_p+y)Qsj+x$c}x|w-py6#yp z&gI>cl!=1=^do*wK=wneE||L3q?_u%acRyFLCN#=$0QbXCydv|A|lm-Yso9@4|DEW z2M5^7asWQqkqJ^~H9yP{j|1rwgbys<7Od)vp6X$vRmM@=9e4tVsjq3DpL=746hal z%e%0R8L}@x2Lp_=!6vNOj83yT-Uf1WIMuD*jx^tZz)48loJnh1-@1zk@UCiKnSgo)WXz<2 zPtnJi@xxig!YUJ5LO#a#V88P#3Z~et*hXj9#)m)}>9xgqzarL^g{%atQi( zc7tU2e1{P5hCW}R3KI@5=xI8_L9~~*izls-cQ$Tb6TEVow=Q{TRie|gkOmt+ zp>kV{+n2lGn+wuFk39w#gcIn>7!m8mfuCeRhoBGj>NuKt{Iy-G+{M2-u&(i^f<Uf3E9$Im+gb>>FXRKA*%_%TaK0!*TGUzcZi2o8DXA zccPCgq+GXsHcPkuuO}NU^dtUMb)}vZb)|mK;)Kqmd3l2Goe3JMFP=+(`oBe=X~!x5 z+Nb<$uP6By=hN3i@$ce-C)tyJlDg7#qB>XF3$MGIB!BKj;-J5_n zK^-oC*WW!=(vZ328^a_c`DdT@x06_^Bm-+{3v&nx%{V|_IJMpBTSy0 z>FW97bm+@Z_hzD#TFy_YllXXxllZwmt$R@xi+j;GjZ zuk#w!pC#Q>=BW9WcUpPrl#0UTj|E=SQ+IUHx4j+&l^Kn;?NXKU@6-xxd1KXyql%Vi z8OkW7V@u1bm%5$VrH@4}`Dln`ty!fdFzuOuu7PF)Y=tV*Knmd}@1=?oGOLEtAqbSt zhcAITFG9f-EjS4p#(Dh{sQL2t^^H~7fioa~JOK!5?>{~QT`FQpi!MNFg=%j;+vo4p z8uI0LYAx(ue?C?HqU3FTK^ZL>Lr2NWSUQ`&hXlSCUBV=zOWTID7qqSn4Xn-$jh`O0 zzwo1i=k0}l)wZ?gH-#D1w{Gj7*gk4aT*-+XHjXu7Z zc>dE|X9Z;eBlEZXZ*^&q+R`q>T<|ZT>WXqh?iERKw8jeXTPxc#E5%bGHhlfBAo8$b z5M6ac;CmY~KB{W%D@S!*keg5~gtHldbkS#dA z!XMiE}%Q_FL46lz!BdELTh z_9ZaHYhhKx(KGH(`kMDnIF(AQ4a(mYi@&UR1=NE;Gb<|?{%Qf?fb!bhQ>&=_0P@dU zP%&u*<`xvB6R9WFOOsPo%2=dIRdkZIbN-@FDNKw@o1+~aos^fivFrlaguBYh3Tj=< zLZL~Gm|vbR0gRfyr_F~1%ri$2?~sUUVSY=rWe_u?5*MS5G%B8Xz0ACAPNiZ=&fzxOhYO=C~5xeZ9I8C zgUquHO|+QoyvS!&>bhv(2ajWQ{BVD>;0()3@A`2Qq&<6=*d@I?o6m{TMM%(3($CY* zF^sE_*53)q76>nT{DDHfHc`MkPlQR>-N|w+<`c$T2qFfCJ~3ZMC4D9}0Pe8AXAG95 z`3rfKK2%vzOK&cETvU|ho@H_Kz5pwkM0s2qSa*D8o=OJ941|~JK?>wm34gBJUK%2% zpaB$Ta$<(=R{#qo_H6zm4$ORtziCtHn!G7@-e$X{iJ3}EHkOQ)D+v&>&Ma6|gVv8&6)@=0wu_w=kR0}BD+)^4QBf_B3wDEh3pY-Ee*os#jt;XA^Lr(;m4{^D8j zw*nYFSW_i>m9jQP6^?OgCEAQXR4Hh>wyhYygx0S7C74OEQY*iu_`4zi#}2BMsu{G& z9>OJs?;!7BXa9~ZIITke&{87_%2>OM!8m=9W64V!8&uo;u<|(`E)3ew6&O_S;ECqn zf+VA&pf=({JX~()<%Y!X52wW30pU~lprDjKZqauyr^K5ZE-K^w5^NH~Da$l+-ZMDu zczk5aqCr*Br~9B()O5JNW>wKC^hco)*%3udN^-Y`vX}H;*iTkW(0;l3svIsO^;`XGj_CLO?=TrDLK7u_kI|wm zEaq~4QWK?V?0+v9nb9JZ!|6YKP00n>+ONR{B*pe8{N!9pL34@k#swr~tXxX|3NA%i zZ2yijE+U~#xdo5E_{IUC1W&n;KFK%mK8rU9jq9o~-^#SHZhhOZ?(ZFRzZZQ>GrF3dPQFU~n5C4ADc31Y;OMvD?^~4o z&0J@iJHjHOAl*^;l|W8#cFNtrGMJoSgb+H)puXicxV9)&^)F+mlC9*xB0(r?8(@ba z);v-{*0>jr_13f*|1;05gW3Y|HCr|p z`#_49U5z*vAn+C5ZAX5O(GU#Ii|;0Ka1|!FBGNEpA#-CRMCq8v+MniT3Eh;St@nkx z9B)tzxr#96P1jBQcyw}l2Pv>D`pAUM*CyF9NuZDQ`BDwMeR8^21%9iK_Q_A2VRMoq z`8koi&k*~rNt9>1mqZ4XC&qK5?HR|qP!}ys{apQxx^2O|R}cLxj`nfM6n>Q;A#h9N zcTYsv-2;uynjQVXe)}!9y)fE=4X8-;38hd|D|8S;0GODrDblqI6mmi|e#PjVn7;C3yplc@@U+1mEr1Cl0@1gbIg9 z_$M|Z>*R^}{8k9L{h)NB48jdrfj}9PRy^#DmWPI5z2Cn%hGO88)YBRJnf85eq2F_V z7`@s2wAVcZkLA%9=CW&o!o&8Y59Fy#G-s{b58C&I+sBdMG zB4#%?I)&XPNy1@u7De_9ll(kKUD9y?w zN9?%&K_^zn$+6QRQj9*VH2Po+H+J%x7{k&8ou@;7W`0yAR)sVXOR?xvs8nHFls*Il zgG*AgT$%EMxR}f>e^FBE(!>jyDhHhmRs6T5@>PE$C3Dj#u}sr%Vi>ARVsPbxkRS_Y zvZzD%#Lh8vq8TZ2?a?BgG{*AiLy$=w3`hA!XuDXM&R$}f#v~Y8lYWl|#y-K}%&}H% zW;GJyg3&i@EIdiE*ccSCw$V`}#r{!FW+#4rAto4-g3*YS&s*Hzj66}W?hgQRW?Jt` zMj4VdAbxL}G3LZc31(K~D#pfW6OoRPm^u>)IKbbqB5M-|R>|l(7)wc$1SuU!lYewV zZ$hA?NkDcHaYMqos8SW_&{U-&sV0%6Bq>uL6=}Of5Sx;OLsG~{pV{W{NTy_#^B=^P zEKWnk6ISHPL`-hSUaL5IWH{eBdSq2$;ww@i5;u=#>p?Z)D)dZ)SkmRM&LJ^c8c&u^ zCU+!dc&7g47cmBr#ZQBydqgHeyNpG+Cha>{kih-2M=A#a%)E}Ig%5x@Ic}r;DO6 zZsv-gV(XfwbU3v>x_dlsuRuaIARbS7;34N_)AImfidm@Ni>vgnA@0Kx6LI}RtsBZZ z9}vn4mE-874ik+gX~vw0Ae6Ychk)3C?32cC!$l$8yH}ukk?=$Q%qo^K6zE#8Yy-QK z&HCazvO0atI;p_$G8`0opm6}byX8Hcg2nu^5K7YJ=|525dL(wy+MNa033vvL$>#(@ zND;xmLwWu3;oBL^J&G?R@?rDOV%V>A$yVQW)`okIEg}-Ggu*HWcYlu;=5WE9Bl~gm4yg0!EKf!Xf_slT)7`0uNd~953=NSutXf zWg+|!onm>*aFDz-ks$J%F-fQsdi3-oO)HLHDo0P2il9mK9jdfR^%zH2Y;+2LxVRrm z?(_Q_yM$KtkV`ivMus|nY!P+{5?pk*RZQ*0mn{$$s|x03IV`DJ&+uG?{g*ACW9Zw} zBZB<_qTVU{n&Y~u9Y$eWrj7`~)#LfdO@RzZ&3*8x3K0XN`a=6;RVe42_{EJ`HXYEK za?RN`(oZd7ng<0{iex-if64Q&2+HA--Y)!AA|oN)RUS?jA9`_u&T-Y^2tmvOO^C0F zY2=F)wa- z`rq-QM%UUnaYx{e>)V9v*mK6tz7h!HL=ri{iwzvPa^SUz#PH@f-ve&tpRC)l=IFn9 zTBK-!H*1_u@BAKN<;9G*@8OFtg|w-wN*MBJwmraA9yxyo4GYkW zz4RZn?`D7U-8yi^?Wy&Y;QIjeZjHr&dm-({f_V^QgKT0@ibS4Ri9#vhjvJJ~UBRgu zDUg-vm3=co)keeHygEI7e^pYQGW3|#B0%n$WO0Ip78r@s)=Qd!#@i<42DWtJ(%vy_ zz~zR&8L}i@h6X+q32kjMYE*YkaiKz2ZSoa-9Y(NM+FGpeGvJGbiDM3sz*a!ShnV1^ z&`B|^>_0a4O5g&g^$E{U&0@uGg#QxD*f(wy)ftPui)+<$?}rlx`EPDWm0@~%xc=VU=lKzjZm3Z*j}CEyrp5DV2t(ds~sHXru#ZmDtdsK6hrkS zxNO2>vAatYJb&e294<#=94As`*81z0=HJkhyG=g~`mce@q!#LJ--DSEorM>fKaY#D z1l?bI8#RA6?7e&J#)O{0@O$AfYj+X@?=I>(aPWC;zAsVum>)c0@DTnDCRgFJjV-mFC@HaY|-w0ZL z2W!(-R_S%s^j~N4h0SMhxV%H1R_MQ;Lt%UM78G7!zWp)^A=VzFX|pX1@3my<_S+CM2(8e1{c2;s~NxP*;u!S z&~>dq0P5ghD}MISBH2uUxDUv8;@C1}k%-vV7#h|eW?a0!%E2Zw!QSiHmOEEiI=0Wv z?4*Yc^nq;z8Sl6L2DA`v4WLS=(c0OR?baza`Bdq7y;O017S7&P`uV`OHuZaM8gxUo z=oJmh7hFnWVA^!`!u5L+(>V`5%fmOV19MQC)%}?hu*LSTva`_XvB|KoRu=DiRd-o4 z$KO|<$sML=%yPj(Ig9QKx*6iAl89rM7TLSvfl3tZoU!l#uUdfU5SJThCPmdQyi)uX z7MA`}P_GZdo^jMS9)hq7>~YIo6~yQw7#lVfFNW%iQCXPP4NA29H6_}2V7MR#@>~j6 zpb0D5l#Kp)L*7h1s_a}QPUpf$_l>JOObzg^0-rNOfCUMrgPZmm50{VXW=OR;=!Y-p#38&TReO)Y&K2ukrKP(+y zF#f{{D_*=8$lfVatE65^v10APrtfP#?4;bjB_7%Zc=G4syvis_IK>JfMY3ADBpPM_ zs#!PSJfG)~VXdhaHI~`{#Zm)^5ZLhLKNxjd3=`1|5p+0LDWbwF<@4XRJ8-z(biH3T z&Kl9BLgErT8fs(ABlGo(GAy5EV2 zFC9L>pQZ|I8r533LfCpBwE(qWS~xY74t6ubHB_s#@Z3RQD7uMNr6cz6H*bRN{oOq4GC-!xT*q4uyMxmqrl&3??*Zfc)gCB<_XxK1y zDgzQiIXW^WHV||d&Kxrw0JK3R7-NdHHR!AH+rRAN?9uxoqp%&+{b*;Z8VWqw(WSUM zMcy16KOPC|C!+Xhou9IIujiyJ{Vd%(&-KSzR=ZuNzrK@&ukxNf74I>Y_{N94ByY|#!j z_(?`L7u_mi+RjYL3TX+5(f9CTZC!`%2oqgGNO_7Bp)8uJm>gm(A}nK?Xo)CbCP`q% z(HI97V!fnB76zrX&vF3?HMM5u|H!;DLP-3XKN60KPjSRuCyYF&#Gs0Ele8B%URWxM z;!xu)_jP!jY_#QYyiBs|c{_TBM~5hNEq{G~D?j~yaeI~)<@8j&2$;@-9~xoqY(TrS zGjJtElXV$-j~Z(l2*&~*9;xfQP8B<>ID0mC?o(KaEW~{8Zd8gGj!O+OsIz8QeGGhQ;MPASD&cH>0GYjo)-VU8!~(0Kas? zpYr(%-o5i_?TG_@{sgxQ^MpIypW6Z-zYB`v@jjayjKeuXV;LT){88vlXVU#TXpCF# zWfW!wwu_rHy3YBl+$catG&JY~!clHNG!e9oAV4NUfC0lZw0%9Qm3}Mr77AG+Q~=1q zogu-3uqsE^QjUWr8P1@BK|Mv{HLs@#lmocm_eN+%&be^k4_W0}1YHV6Plx!ftOKD1 z%cD2#jsskON+GU;zh@t~hQauEzJ@M zakbNYeOqCzikBDz3wWfY5kt&qlZ}iEjR@247GMtE_POJFbG3T2UU$34nfKyz((B@# z^p&r|_jy_ULVa_jM!)5$=OdL)d$zm5@_0fPzDA?HTw%TSU&ijwcgFBX@|pT-?)OpB zqP70;OlGmP_1@r<8RT3OlEuZ~6PZ{f%m}rDePLIQok%4RF*fZb@amA{Z+yfzA_W)M z)X)+b#GPkZ+%kQ)7V;X>r_xx$9I>JJfPSP!M6&BT+$LW$;#?M?%;=x*C!GK=SdsJ0 znm)`yX$<@QudV6TfEJid_S4!6QkypbWE<5yHU5e1=-Ous6_PV3Hbd=w*|pooI0phJ zTkU0R;T?kz0UQIIwVWA7^_pE9t_W!@!fH@(>Qc0}z*I z@8}8l0V8-e{kQ|1Zvfj zrxZGUn|ln(Z9Ejz;BY#()^k%t<#5!~t=(}0=xqk>4e_kzo}bs>iY5pq8Zgs9{}YNK zwnY<;6UHnWU@x)fb}&kk5Os{G>n@^Q8^TL%g^ycx#SgJqEdRSZF9m)44cKY|j`bLT z&iJ!&P6zi9n8|ZIA)pE&7|>&B*SJ!~#N@b-ehdi&km!0zJEE!(zE4@=c}X6^Gl!%h zI$AHD5X%y>Aj?bSa-6MJ-2krlvfyK@^O*JXg;FfKl$+_R4*!(=?fi32g#}%;fK`It z5SJW@7e73xU5F=Tl6hvRvF**B&JDc$;8gO_h59~c%jocH3%Do%egOwE=12l1Vjr&Z zw2i}MUwmthe{0=gGN%;8Nt|Kbsh+<^IgJ7P9&D|W?XPZFl>{I*B69SFsZaMG$eOgg z=q4=ZY(M)V|0%-&A$yGmypZ*O6jT=BRvGf<0kGVdu(I2y=&&jRT~*hKHDWp{^2CTC zw}XZFK4Wni)VUJm!T&zsASXC^kanfT;+P1?H31 zr7cTezXig4oWJ5<{-ZDOct-4Q+aOSoq~>X^M9(}e22D>k<5#nO)qLeUvFdx0)O_e> z*&WAb&#ce#7naY>S$3R^t~5K5f=KR{7$w4e;)bOW>QcACaG!gFG*!bdkEqj6JtN7S=`YJ)SDl!7eZRU@obdrCcG&(vSA|+0jY% zb8s$&9U5OL8-1T}DTh`Xy8`OymmW2EwDZf4@)JNS(g?tJViSo;w6wYpQrqa3fy)_w zuiiTZUfe=$t6ZUu`mOrX+iov4vG8s#{c(W*Jd@ArJoX;t1APqpOkvx^&_J)v&mg%@ zU>$|UNz+#AUuB_Ou4-Zl$B3mb@&@J=!UBU8bmWCDU0TAby{?{5o;z3(aiALEjut;a zuxSwbnwnc%TAjyLcqO-$t#G*0BD&Ngy%pr&9_WAbS+uL)9SYyWwW8Dyvu=l#L`^@e zp0nRMUq)NB-Es#m-JF+XGo$hQOxtky8Q4DJT2ab-Rdl*($o@VDR2>6bj&b~DAn=pm9 z@&2tLk@8379#C-Pg3Y60We~b%8lG}rF%(0=5z12_tw3pmCgjZSx+CxDg4o4zV=p0r zjrud;euKeDJ`dR4v_1l={cBhygVAv!LCYw_+RkQwKWn4p>M|SJIKe>k= zjnh$tgWfLvJ{+hCP3v%H%E}qKSt4FPVhvrAy;?-Hg1Lp=W0*a63DD8cueF6>*T5*l9yEn6bWUo|`1R>>>!LfA zH7Ymzc+0pa*ZakwJQ@NXz_@wQ_;l>TK1tSTh zvM8sKsbVU}t@iO8s+(5YB6vvnNN@>y6Z8mcCHzS2r1RqC-{gaPBlHt$L;NBn7wv=> z?SN1AD6EV#R9X#sh?9fMey$`+8+3=KFEKX1312&7D-~9I^1YGzn6cMO`VCDm4lMNq zCI^eTp30SSo6>1cJY+2mhc7woII|@%VHlANFy^6S1BR&1NoFEBak~-Z=r8*v z$KPc%55nOvYMA}mfz(OHj4=GFVZ7PryM?P+kGXjpL0q_t>A+3``XxyOSJn9u;s`=I zEInIoTYPJ50oVFFC3$`0LF(L5F~GTj0@e2L@chyDxp?+an{UdrR*AB$RugLJU(ks* z5##83c8kr=r*3HMMI_WRC+h~z*^t9Ql|T`tbujof9@hT4(vpfaTU)?i8)>0R$|e%K zFt|0dq+%1NIFc?H$syJ2H60=_VxNX9->J;UNDqS^IC`gP#IZ+c!=i<`VbtIn}B|{ zhNmA;>?zD!9(Xe>9Jd%DOJZE49~ett1Wz}PWC(f3jNs!)uBRBF7PKOyp^a7)_5xA3 zGh9!^t9l$|gw&7bH;&PXL+@#KD=;76%(M z6ywWg>iNxWcd*K6rN2@y)!o|jt#@O;*P&nDXsR017Vr#@eG46l4dgl=1qMAQh(o@>#u8MrBr?(4W&60Y{b}AtODJ zgE7IP9)~+xRFBXhIk1~t#n3b2|5MRNotOI~Y8ZO6BA2Jjad7~CXGl;# z^;>i8Wg@;m>J+V$IOrpf&;Gr(oU(UzqUTZl*iGaG)BY$zUHh;+t{dXxLU|4pGA2kl z(`*VC;hO^_=h(#Bi+WSsvfMs2?Hp5Ybmoq$=rMQyD}fJ5voBag3awjMzkIi1Rh~Te zs$tA;-r>e#loKMJF1LW(J^Cd;Rx0;XY$s$4)olGAVk9Bb6dc{&` z)YxEwN70Om58=Fb#jlb--&U0SR|#Hpo#-j_((|>PRea`MgTODp4Y;okY25Q@==dUg z#(n;?1wX2U(`8PK$a^WVSDr_%7Hg54+vjvAf?wz ze2*FaL~Q(zaRAl?QB#ZrQ8GKW^o7G8dS5u$mjZ9pDZ;w|ft;$NQjtsURP2s8nD9U& zIi#@-hff@XSWY;^2vU6_4XU-U-JV9Pj~>Blc(~(ZUW^g(1pp`X$sX@u#HGs)2x3`d0OTOuK~M*s_Bggv)?Ydq5@n0BO-F0npxlFde~N zG|yRXk+`Q`YRnjp&{dZ%x=m9$DxZ{sh^Ue?M+jRC%%M`~@{a!Z{Lq9E z6(_cdkwXqNX2^^^duA879ASPfJUi!f+>>&gf9}S)?ZLmxd!I1*5;TdC&UD?r|Nd&^Q6##KdaD3;gshEvQhu0MHu<|hyF*2%3g-V6uWE=yy zh_Mo32jPw)ry-}JN1`W`9*Q3G9*`-JlY{DFRna=-Rnb~_-E{ek``$vqZWV5cZbFJ8 ziY5t4D5{u>n40A(VzjXuIPDsmILoExa*tR%Ls-n=Ur)ThMct>eT+9c7o3~e2`f~Tb z?d6t7``m8$*KNV=qikrn6!!dngFiW^3({yaWqjTIjIGAwHAtsXaXfBAYOP$H9_m6u z+{ep;d&_K$0H1Cc9UF);nK8caCwwogzOwn)K?&1rC2@*NAtubdsjdMz@>-T7cgs%Y z;E_aV;w)kaeT!M-z$%Q=9f3|Iy}651$Zu!$UbjBczFaq$FHZx;WsQ$(1EpcC>`s*8 zv$?!b_;kC+D)5#1!n{|`*B~|wU(;#XpqOBV39$-IK)d5v>ghMhS=HW73dp>ln=%$Q z0%$nj+TCG(QJ(wR$CFMhO_0sOba1-p8yHl-B@W{4B#`hI62P%_Ncdyk$BW9@BVHE6 z&zEyt14wWKhX>-%zuR9Qe(sSF3*{CwR%9Sr%;ADZJa zO>r=&iA5;7k$jRh0;p|)m38XD7p1#mnmEPXIrAw-fT;0JtL*r>h~3}X zsnVC#?hn1d*DVeG>2*?W%;IX*E6k=G89amjVp+gY9|| zU&JvC1jTlVi*hI3ut0;K%Hf?7hUo}gW}aMb&N2r~@3jxUu_PU9VTnJ#U}UVF ziML97x?nS<$#v!NBE}6%4KQwB#d(r0c<$`wpnpq?7pJ_`n)!OO{g{n$C$Lj>(0omK zRNagW$1CVjjrPC}Pzzf|F9OckKVskgC&bU75#KU4&Qgk_%I?LBj)aE~<2>3}BujQ& z%EZG}7FSD)HAF#PQ4Suo`mD80-?(?uRWUx~GS;r9A5XPDpaKL|iagGycDK&wBlP`R zw!(A1{p0t$5U zD~f?`Ch#r%@5kHc;u!S~vdN#i46{cY*kByW9$>Bcx8joWA;40Q!om(_?V)7S%r9wvSFwo#HEnc_Aj^jDSfw zz2u%HUs3N7!wiw=h^h&v`+nze^8#6e;)W<5GMq%Mgq^g0!s8M3HxIrLGcL<~LXElj zbI`QTmN~9hoA#_**9r|-Q`!MMH=Xmtm-;(+0M)y-58+Gq+KdLT1?i%&m;CmXno?&; zQG}*=D&MoWlj`*b?zHOT&CdK5kK=9NW*$N1P5Q?%xQZ$Mj*M#R=EGPJJA*Qsx!kK3!Q+CxmALEy`J{_7qx_^}U!HxM)Y+M0) zGT%mm4A5HvW0%GigIswH1Q zAne;1vc{*JkbN0Sq7in@wkWa>*bx7_P8uyM+{ptM=c`cFie9W%5;V~02MKRE_Tnka%lnoc_D=zvFVK zau9Yf1`L#vBlVK{mG$XS9#W$I75WN$o}EciGCERLgRqvNilK&KodOhxe4-!#BO)R_ z0>3`q07*zl5(B?RUP2Nl!(G})_uyd2B_bx`6#1iX{;*{-38Gv7eklI+Y!`AtA(>M;mR zw)4BAi=%h#y;$4TYX=?!Na_{d5PA(N9A!FiCXOez>R+90u?+y-pj_SB)RI~q0qOLk zbizvk%pB7P$y~5n>eT+%WWt$=XWan|9^6DjiB2MSZQ!`8KP8l4`%b z$dvV*4!e=_2=a)3dQI*oPLiYsB(ZY$YKCUw*o;w7Co zZ7&mK9&v=Ou*^#GtV}Up-H(IIe{TN>S_=o;T`nIt+d|T?+|p3;$hj%MR{g814x{43 z={S*i@DQDVe(M6k%G5Yj!!ogd(Jd+h27%&8-d)qSo;N{#LPC11T?*MR@9h#{*BoXw zI2acjAE0a*TXQ!@&d-EA3(P&55s(H(3*ECNkUT`$Az%jv#~Aoj#bq1C`moz&k9@y< z4GY_p-DS2axeL7HSIawBymp2eSG%I^M%a6+cAOLFt>_6l=~&h^)0~clBDw&I>IKS>)g0mNU!k#&2Dc3NTeqx_ z+=SZt&LhUKK{UPw=@!`x&O&rzv69Md|7xj1)R{9;Xt?Ze0vh=Po+ILCq02amt)8P#IKf6mQ=ii-oWxiV z@APepvpvE?u{^%}&m=4uY+3CDxbFSgVtWAj3BGIl*Y*@_n{`k5XxCOc?(|8RFZmPL z9^#dObGVCw#*hOs{DdFNxR*Xq635T=buTV^k+JCaGio^(3&xb?OUIfR`m+9)c+e1^ z766xVPchae;G1MX8nHt=vbwFahB8{;d!$bkI8x@62In{mY(jd+u7tIE; zP+jno=fS)JNQ%JI4fl`rElZ0=5Zwpjtz*i+6S^+_6A#Yd*2((^)=$+36W>S{Rl0=J zgUz>gr5JDaUKL;e-3hzoo0QdY?z_WJBLDlh3>X6X~d9VIeGc;kju}jl%f45WpvAXeQpb$MuWZ_K%|6o3mT3Nkj9!L3_*g zUE(ld7&|XCV)Bm?dpv#)3%)cdBc<-Mbc~P zee)s>-z3#}MRmTZe#p{){aA$55FOqiFmV>f{w4n#b7%UZat>iU@`~O!jJEB~w^Q<8 z`l+Zn74FD|zT+|Q6L^3KTH4K5PgEAuNF)}&TRdOeT++&v53FB@QAeycZL05r)HbHM zB)52G|ENYfu;j0@jSGhhSzb?f5%3GqFp?A~V#XoNg4o#4(Vjd35<>f1jrDwnU+}E# zeU9&O-AX;~3!_g;x?UhcX8n)pXWBq!*??xr2nzjMWn+rgz(e82VU9C-;StvH{GwL> z6s>CUdxsRa7u39$BHZoI?1etD*gcs^llwOqHEN@PICOyhds1)5VZ?S6+Vu(D&ixRw z8_h;{R*h;@Y=p<>vcPiUS2kXNYaWjW&2)a=nC#N-z;*$+3@%eP7bDWpbf8RspeueO zj5%WX8E@87 zOP8SD%Y>0HCd$PEnD{g1cJ}++` z#DMf}o&Q49a~1o}7SGb{%^gxLZ=gwjWq5B;K*G%+&pRmUL@7QKp2_{#Y%|-j*Q|W4IRUimpT(p3=5K|jo5(u8 zhv=U&FB|k20{A29o`e72_5e-GCGztz&fj$>%dtJmtACHG|0a*(z+ZuCf{*V#tp0yD z&t#N$eSCkU7^?ZNGYGCQ@;!ZrueQ^6wVIURgnEU_FZBJbzXec%Y2)YCcXyu@-@I?&bqe(H*RhYIUQAz83l=eq%4peLm)1A<$GlrVzCIiU%sOs?X8Ah1`d-{NqB>Fu zn2z4rnmta1AAn~&e&w&z6l;jrZYu!^@3Fmj9r+xnWmKlL zxAuAFz8L-OvD+J}clqCU<-O>b+a-SanZDnZhf?rkfyP7(qd5b7A8qQ&fexnr@@om+ zv+n%X=XyP4k;f(m{+?SrL5TY~wnR4Z&(QisI~e4(1;lE`7SR%>Xdjzg#wM;Gn_wxj z3FJ3TyvlB2b6YTBarg!oTL=d4N_qZJAB6P+Q5)&OFDk8HG{q?4#SZ8Sw_y&Tx|v>6AcD3kzY*sT->Gw@#O00-!adf$cIi;S3sis*4*#X?4- zRdUa8gp`(*RR@!CK%%CWvaa&6Ybq%v=kf5k)JQg`6d$f?^-*W#wyM*1jmaCfGWcRS z=uEq5BlUziRmP0wE|Wu(S4(4^8fES=P2PEpTDGcfanozPZ9Lc0PBt?=et)MdRuk581-06 z%ke#a=PwJ?piS?0MMo!j8y6&{AW%TQ(M?iTD5 z<}x??qAt6I0%#_h-pA!;Swg;EgsUug_T0sIv)zp|ChR{*)o;C(!_!vHiQfEnl-#i@)j`iPv{XjD zT__(^f&jlT=wh0l0V_DOau=H+#;;IIR*Ik20)DL5 zrPQvE!7nNex`%>859?g7Vr+(*br`fsPpZ zhwHG*-6Ni_Qpc!&1ZF*;3fIRO(lY+sR9j=Qv*;gu!g;7M(3iQJ=#SLg;1m4eG6NiJ z4b}vN;%-MT?Xjl&4K_Pn&zwyz!V9o5{y+v}HqBY(@b*g#UJ2T6^v+>?xWeiANIwNF-jlhZD@ zDzgqYid*q~*A+!68!Mt|n-gUMxH;!U*sJ@O2;gMQ<{k^=0XgXK@lXbL&d+gYj*|xQ z=Fb+c+hzm(fpQ?qoHDRvc-YSx$OYp?X&JaV-*#c}1?nqsYMfJP5knKm0!fz*W((oP z^K{zJJjN6^j}FWox0l~E)d={!LUl`((=igDb)y}^xHR+v64_YH*=*1WnGhxt>yVNY+u>OsE+wbj|7V5I;KaTg6y%wTr_wD(b z;I{QzkBdcfyU|U`k$J9M13oCJyEP{^_RDoN>T2$-My_*~{@!q2U$%G)M}G50%(pU@ z23KC9L0G7HLStw@VqW=9JJ;g$x*v!Je*C*AHO7Ztv!4cMdK(&hwE|=HLKsDwmx0q zN&OB@G{!%>TPAo`YVJkIl6$mfH8%V{OiTAGCgqg3nG|X$faz(~BXK+*dLzd>7o1Y5 zOmRx?O&Y*$Rae`qvdEKxwRWnnn9AL(@k7|Iur))l&=B2>Z;ZN9c{zDHN~W$-*himx zXSu$%I4|{;_#|#p;FZ3u-w56!-w2L-v*8na)%nWYNc6XWOE2uQ|0mcXg^Bj&_X~FP zB&a9)cogG#khZV-{`;Y?C3$_Q`|0dT{DhvS9#@~Dru;enJ;8ko{E^d>{OW2P5#lm8MD^x-7fTIJ|zALkB)o5pZGV%PkC7QDT9gMF8*I& zhj?ho3HBW>FB2@2cGwOnaq_g@TtRKceA;%$PMq?)TIcoz%xiX}N5uHVt9w1ICML7F z;Bl2zaZ^=8LB+_ml2irNL~=CMtIn*n!4B(Mlymb&lrwKy!tu@W@8e!hRJi)`506Km z8=B_#eeEY@TD6WAEq6*LRq3SeNmYkxIYm28B+Y4i<%Cq_y0laA@&t`r3ie8-<}nTU zLXy8L0dxuAXoXovQgSBLux5`yxwE?JU~nWRYhS&RL4YzPSdl4)CiCR=v9g1Ms3s{) zDX^6ppz~fsXBSo*`m_d84n&_$WMfB1LE94K<#uOrx_fN(9Jan(VyvblDN$}-ZGxv;sx}KrtbUCe?2f~e*s@a$&if@`qCH2Xi?(~pY z$dSs4!X=>BFn8U8rgxtJy`Pcc%vsgEl=BElTb!Iy$q`C)4oAB{0OA`aGE@mAa$`y~cdeCn!LZ0a4ZkU`i5e z1Q2#!3cnT2mYK=P(Fux-bYi0u6d8bw0G8nT;@G)am<)OJcxHS`UP4xp%)}&CiZFKHX!d87BB%|? z9Ue!*HVP`va$ip&)KnUJZ}Oi>jH zDKWn}Qi_D@w}?R6gp(25qW^fGJXIGYo_Be)#V&g@u-N=M9+0@X=@C$$Bns?VyjKk9 z^+cxrRZUfX$MyPF=6~Rh#vDl*YgS?aDxMM?wwjgE%)L|tbH>_2%~snm*=>hJGtZ1S zfNL=Mq71!N9d?aAD=R6giX$j1nUfT?#vC}hx+zNQO0 z7Oy`P>z6Rpl~RTiT@?#h3}lgwXr7f)cCT&wRB>5GC=}Z$bE+LNL7{#rogGMBD(5<{ z*`VVLEs^g`p^}y!lA@{^Va_8x2bqRD3i)CgKF2sDzRhrs7$1gVl$uw~bqEEn;WUo&kfc0x)phQOjY!`%e?^avQ7Okbjq=l%YgD=besJP@rx57| zavddKr8bgRp|l)qzngeTx>^Na$1#$hD#D~I$c$use5UcVFqw%s$c!WEP?-t%-(z6( z!2KbaQWNvYciEZ5P044eh(e%1mu>%PIO&b{h z7#xJ}!3~^m;uXT%1nu8bEbh0Dfbt>kt$|=rHcZ-4-UE9O<*(gA?X9G7Gd1kHEN#|X zt0ts>s}J4#K@X#RlCqa3?UJ`C_s%kkiX^;Qw^ zxhT`4G7g&ZsgLs(mhssgkR3;?zm-DhouB9gd-Mpl;F{p=n(!%0ng>UmXOh@R^~Mq7 zy~HK?uPmTxpl?O;Xb@g07@j^6UTN%u>a9|0N1E6VlHist-c7}EMC`jOJeyDCyC|{M z@ZVa<7{sWGBTHachS-k6 zc;#gEK&9bPioilaVw&nhqLiM>IATiI-^5eZhioah%AQrTHNq)e5E ztAO)?#;~!*s5ju=2xK@JH|IoPxNmj`lU}J@OM(xThbF0)iX+ODD~AN~X_HrEhXGr3 z52G|$ccR#q8P1aNlEVDO-EGH4G0ve!xz;~>ekvP3ZC@-WF~Sd&2?Gecp0$GnU! zuY@XnHwlf}L>KE)=u5Z+m#DYq*C9yj(xhg%?_3VYR;iULIkc5B6Bnj-=&>&9psJ2V zf+{EiH>@$KGmUd1YJX+wgE2?yw`QqS+GeOpm4+p$)H0KLsSA~Zv(M!M(Scf(1`EXY zK~XfcwU7{pBi9rfg>i4@4094EQ>Dtp%&4MwqVf(2+fE58Ri*qy$CRlEqSgwN7FOkS z-iYK1lNBN+WLqhf1GNZg(qXEMe56wbCFg`K8M5IlkEg~2Yd{70+Ga=X{(Vz`dO%fj+5=aiT zoCJXk6b!jj3P|Ok76}`su6zipNsBqc6!G2(u~AB9M4-P2i8z`K3@J#;1bV(w1bon$ zDgh|`jEINlND%l6#4|#QqwN$7!G=(Rv<Zf<2?kb<{{y$U_JMX+S#Cem^1ALm&6tv5@(@bQ8Gs`U{Fg4i2@9RDT+7ojNbbRS+42{=jk6KWJ1L&ss;_lTuF4e$~H}?b;&OV?&`O7k3Y((1L}#pQY+qkU45`@XSGj6O<$?~N(G7wfK+%*@&&+~ z3^sdoS~$)T)}33y3$y4PI4Td611UJl0-6uVnRpru1>wElc0LJ9aSt*~vBQLKXg&Kz z_(eNan!ZY6Mgo5|c?#{5WkEDu&M21hqW<$7(_PLuL+nb))M{(J) z9DI~RO0_O_xp+>q5vQUFbbIcW!qgb$lCU2P|MWsw$tUSa_t8xmy4U&z#ms*u>xkDo z>5ll$9af4f*8O5jVrZpMgW3knZu)|oJw9ma6l@08L|iM8w#7u+5jhSF*koZ3`~mMb zL<0X~*m6mpK@MqP+;AUAO2GU&V%`ing2jpfsML#d1mo?2x|q^O%y?=7WB|h`kKV>yS0MnYP)qo+122JX{tG zSs^72&6WvMhAf(LFy(>?t7t}nEMtj=unte;C}b#zv5~{hBx^eg9Ap4gU+OTZq3N-iz0PMlR9mV%fM8!okIb|=V!ap%_ zdUE=&z|M?@{CQq;UXR*=e`53eet3Ly7rX#n6X5OP#-_bdcxU!OKmvhp#|r#u%Kryr z?-(mu)U4?)+qP}nwryK`*|u%lYcJcjZQJ(UU+3QR>GZjs{!?>~WTbw~R5E62y!E_q z1A7EB39|}23WLo?zGxyKfkxM0aJI*Phz^h{iow%`buWTgIZ~Wo;Pkx3&VIW>nwPMBs zc)fhLZC1Gh$oE5HcaJ z{KI>J-{y&+6X$rmtZ*(CE<1=?4(Pt=6KO)*iX~{t^Y4Z%2;CfG;Yh_y$b-}z!39MS zV9OI5z`*EW)9C}BwNaquNed!rIoYwU^o6_q^Fr@&{dk*B>+`;zXLmQfUxOZ|-_GIr zHoH7tl1=Kg|x@S-Oc2L8Z zuJ8ZI=MT>7l3YO^8ak!f!LMWEXIP7H8oBb2##G*Xk%}!IN3F9t_(Ezv`Q?o_?h2}+b=EO=2e~6Z$_3;^m8jqEU4a^aE&n3DHwQBzi{n}y< z!WH@jY`^N8`vljh7Tjb0a`dkeW?v&#UHhVM0y6VAKSS+(jp&Y+!DIU(!J9<3OA6(VCb^Wa$weGv+s9_g^|~N%!?5`7;FmC! z|LF5Fm>cIx~otBM#X8CzG4| z4DF-t2|xd`Ww3*(Gzjg}1oni1+-k@OR(uYzhQJ8ceBX%$Ex86B6DQlz8sCH-ZjQ0GvFk)4P? z6|uwu0R|+iJ-(KRNPKy`#q0ID`*o-L^Ty|Uv7lfw4-U>}Lbp#2hu)8ZpYnAK|A6Bv z`8JV#-+sU5O|MIGXXq{S#)l2Wwh-Mmm^?7%RI+}oh+;t8<-A(gP#d<(AYvs#M4raNkz;=J_#qXi zif=wWC%+ADG7D-grZNTzT~Q#akOymX@E2&1T8Y3kB0`2VBYnZj&?IWm#vxC&NiEO! z@$TUHc{X=sJFWh0ut44Kx6eoS)oE7C=ku6s>wPdqcr*Bizw2d>(QbHd_#bxSm5tSP z2j(Lyu*WzL-Rx)pwq>YTq$YOp%vMq|V%SsI2q~^8_wNr!%Vc1l0RKs+jTenq8QBG_ zWD*O7t&*U7tg3Q+A}{LNIW`Ul{7;2R$e=@`HKMj*~TT9m_TE+>gLx)##r! zZfUQOQT+^Nw@KV**@}A3y6=YH?dWLs?2^ru)|#Y)2G36Yw>Zi^FSN7!KXXN3vMpgz zk-}&~D%2=Vdk0GvjiKAvAi2ZfN70K9&UY8o-viFWWo|)VCxFo);oXd6NPw7awbZV4 znD(+Pq*{(`BFQ-%SAYn#x^~Q%Nid%{g^=XYqnubkyD-Br$NW=d z?oQB>Prj85*dEwsT3s`3I}S=27qyJ9Nv_=Ibhw17Fvv;okjU_pEc+|VUvu4k^y`-G zc$_>*$N%cml2Qis9(vWukmCj|)e#BMb=$yu?DR;O1AABqB7uF(3C^LhuqmSWQ)S{C z$>qZjV8#Om2f+-3)c{0ba}^@P67Y`Izi}F&Wfskb#(aJ4d632mhR3znPV|%y3^o#! z=~(9BlHG-B7((Srl|ovE9*1(b%M}b7gUupV?MN#Zb4l;28BU8 zm`VH+KRRRZRowMU?*_{hAIP>t^gfn;@wR`{dP|<+dxlJ6Q{i>>+2U;o7+GX*0rezI z)RlQaS~c%N#E_gsA&?U?2nCO~keiU3O0SQvQ*M`IyE$!t*bN@eZ!>P!Z~xi8-=|(C z5W=O&D+QTqe=wiQ4tmt|pFf%fzb)b$d!G5+=igrbx|_XMmY?=8TAbDE`N+#V@N%u= z`lCHqf4nI_EuGZX#l68}TgT5^<9&AXePhq_`Bs05baS4~S!6zud~vb09eJArqG#J@ zjWf|OirpHP!%%enhrG}Y;So-kURH=WT7o7j%t@F6oOLpdE|b4q4+*O7jHnE5-t`oLbq8f-gOcm9#S}!rr*x!* z-SzqS)+L|Meo-3Fr^(_9t#*t3Zi6W`=VXdE-`_?v%-oNexEf6 zypw`-iUM(ixnS>jEB33`C`EBbf5b6-+3dtk?ALZc24vYT3q_BzaSYWgFN?S%h$?+tLP)^hgTxf6d%f?z&3${mM511gY#&tLX=%Q%+4ElR;BB@Y=cZ~p zRJ|WU)A!j$8FpXQ2G{PyaU1?&XJ2b^yiY?>TwVD*}Ks zFwB_x3ViMGMM`zd(oYFX81$!N@)M(s=+T#Qi1;yOXyfu6TYMRNw0G8sUk}gueT15B zx=ZSPR}IiOJF5y$Po?PoVBDnw>EUL(GGG7MC>mQU^8?`}cNF(fvg<2Uh($YRb-2m# z@-=Xv;>Ek({h0J&YQioI9P`_wb2}f;zWvG?gIyqJLo^^ zFSice%qRsD8Gun7MVQSdRz#YOKrEzi@`ka-7)c0#_<-XnLT^RL6vagoSu$n_GTnEt z4a5kkiB}*@*KI+|NK_%eW`${?%nE*e76JJbvaBD?|@}e9)1>wC7)0PWD_XCl6-mA z8QGtfGKe9a*Vun`st{9ptgP#ZZLfVl65{t$@YrY_>y-4?!_r0;e>wTGDQ};L5u?0k5YwUn>vUwO6(IPBiL|!+zB3VRa zI?gnfIng?d2-2r98QT!DWK(A`_VaeP{_*G2P4DgLK^&b)j%L}RvF#@M-K z+f2;NrbR+xAdwW?^pMA?WjOY#ZOEoorGQGuw6;N{dPu4bJ3$zx*JDO^CP+Nblj<>J zy5!Om#T*6SIAV zrn8fk`&SY63%<1M_4I6=em!LvwERZ*eb{g2l>0VJ!zxr^0WKkJ%(Rgk1_8;Li)T1w{GdQbVUUh!bb+L9bmG!5g{1COdGSpUj^C%eKy7?&jU4cUVj^9~>`z z9CDKLq^HI9^8s(W9tQPZgn0%TcnA1Yu5sQqH~kr0re5 zuOr3xi2`ys{6PQBepLA9L|gUF_Rs$!idg@yV_y+7o9FUk<28f+O&8U{I#|EKOR(4`d9R_o z&$hFI!!zOU8<`G0TilpA8LFQeb($7;em;n~MAsmnVXz|7rFxm3xnM%hgV)^{Ue>|R zJr6pS?+?M{9O{LpSi|YPOAHI%1H%dSC*Xi;w87ZLAUHi21VQ;kg9Xfs%X8{@vd53r zbvp_U_n*y`a}=V`e4Qqv^%Wrm?ejR%`(=K`4`ig+j*qMp`CaHC(Sx6@HS6D%y~Dk9 z5=N7lJIM;i-Ir0l@v->Yl0<8tY0X5s!TFX)3+w1E3s>zjOn-xrTCU57-s*8`BY5g< za|MU!*%GoeBLt;DuUKjwfn1QQx9T-Qbw{p7cQE*&u?j+L$L`{>I{@tR>Gbyb#(i~6 zhQ1VCTVVg=>b%o8?6B{3;x;d`6Ih@xHO$$00u__T{aHnO%N4mS$TqS4$hrgAMlI-$ znXd*g{s`!w!#@i6xV?Ixw*lOLe8x#D zckg{5N(v6opmO@y?cok`P?sV^NjGf zWHTKB@lTN!x*`X9=}Pn1!1{6rAgRM^#WTb9O}Ud5FV3`tCoF-n9(avjXvhlVx7VNM z8A94x#Y>Qn%Ox)O=dh&?f1`V7D_xPKd;R4Ov=WD;e;H66m#uhdm}0ogR|XZ8m5`|f z`IbVt67W3~iLHbLNeU{;@nnO{=_W!G!JE0#2@8zUkwpOCJ`%v&6`-ZU^vJD3-ZK=a zg{BoqRCr;i`?T=fJq@P0+BywO@lu3rVFffIHw?vir(6J&#n_YsxkBgxlhxW<`?IpU-^-uqpUr6&>>qu{we2}SI7m*XRf8mX9QZ+ZPvU**Tw$=?F+k%1^Q`Q(d zD`BAn+|=BNZPLe6$GAY_=R*2Diu& z7!Zmq<%i%cSnm}1M}(}Y4EBbvZ(-&Pr(k571A@ej8D^11$i_y@luaGga{b1yRjqKMa=9&b%h?`B75094(0I}D?Eu0WZuwkjNN5ktp%&Vhuv zJXHiMLs4$O@=0{dp&6@GD2vLhLnr32Udn>dNlxi1Q+3 z?P?5Q(W+#$d0J&f$9@}b1FI;O6p5Qp2%nD)e4@&B>)*0dKjBShIr5^` z0MUQ?U8m^c9xK`u$y0`J+Nsa3sWf54m<2qQqTGcd1u4@DypqRxHS~>M3N%r@Yk=Y5 zl@Ja`W~quEEpf>r#1lok%q70xa*PY3m7+B}h*9@KUEd_alH6~$SW?%IC^7|QPF<{(iYIf~B#~dF< z)AZYW>a(x8+AOAt4U}C<{MOke#@^SM!e-s)uz0eS{_jjBIVyIJ=<2D6N-UAoHILG>L+T@_OWmIFr7RD$&=vOgS7kwLy z)Fq)K19vJ#&?bspDU0Po(|CEcMn>`{$@p2-!7(L^6d`-cMQKFrf@>j~p=uFn z3>r`|)-B2_)Hz{8>1tW+C<9;6zCvqU3(moP01H+dGuEJP4A05^bA{7+RMNRdkd3Au zf72qU9w-gfN$;@Qq9%&u6`@~{6b~qRAGV{wuzQXm}vBNH+!b2NoMd+>@I0U)Hq6G z;)E2)rpCS67>f`J8qE)$q{5k{3+(9J=Y8rBXA~zlVjV%H4O(jS8Y!C`muLrhm|*pS z)_0*`TNyrXM}r<2rtl%&rof_5ydy0(ZX@!ETInhs>Y_VdeHEpoIpRIvZ-&aKy9y&+ z5dD5@l=47YL_{SgWoxz(@g|Y%8eR#P~RX+*% zsm05E3lettvX-`r z+3}<8iaptfqF$R5J7&grn?_#UvA@qjt?&xJXMd_VD8^GPN9*5s=5E`gp8viohqbzT zbXdtz8eJ-_f=$4s#AB6f`91j%TgxuB2A2kJxfxk#QlTI z!z;5-YlS%#eGPjh0OArDG-&%~kqKY(MWT>AFWy%&Ib(e5(VQ`=$*7(WC2 zq`#qG5xFkZ2Z_3M+0w~9xIsW29R!S*Ha4I%FM_N&SQgKPm#n%^cU=i==^|u5nLnJ+ zLlc-lAEgWl!}CrZ!KFpnCkm;+`!SrhEy)I#9*PD#8^&MwyIp z@*A(MZ(e8j&R}0#cVBvIE$^8jOSEP@oK~g1otv^0S64roz86Bc<$Y!NnRhRd6u>5) z|9f(dbH(sro7o2}OG(^7g4`do_b;VBU{C*bJpxrzKO8G59Dm!QK)A|6<8ZD_Z(4mF zf#tcm8+*`Tyq3A^B%mH=$~nE(5oP>h-pJ^zeiBOI=N`4zvy~ge3$8&kD5-F&Y8PBp_KjgUXpADcCUpVz-$6#Z@TR{WL9a-&vRS)W96u zTrhNk36*dx?u~&tt>fc)G#0+3PYZutD_9DbhJ5u}YLB=L<~c*8>xz%}7(_ zbd}}0gsQ2MqNvoxqBD^T&g1o6l^cr6#Hwo2GsCLKa^O##)KU{^$z0TE62pIM3mep^ z+~{0afaW%&T2w%fotG30qHvc5Mvr$c#{fFz<0A&F36DKNBmuEnstrrayX`M@@o0mmPVuwYSqZTMb zQu-X5he}O=QUHVQm=Z(11q|60HkBz8`NKs2fn`b7VD%Jq2 zQBc#kQ8xTj5+8_851cESEdI;`iBCfyamkvRi{Lo-1Br(eb(HhyR#rGB{{vhfomIOg zFEwNkc*Tow61NsN6ps9vL^|{LAVkTJ4}l8>!k`G0hb)S&*9W{(;%H7;ZXPVAaa!S6 zC@Hiuhb1kj?m!wV`3Oc$9wjA^uk3!~z zZMB`58}bJDtAiRm_tz3gR z*k^-JsEjct%nboBQ%6-Yb;t43(J^!Ev9dHbh`foTMdYtzc{PYMxA@7dH+i}e$h>NT zytQ{}%OigN8Kj>_sCSO2uP~V(vZUUV#3;3gG+q+`37q(Gf!XH97wfM)^!PZswvf1& zcxbzaTc-ELu%uxA@uNY>BjAi|ed(RFas0T1*PR&Tolc>h7~shZVes6Z@iIcGHK=9I*XX#iJP5BleJDe5~(~qih*HKUw-Nx}?>oqiPwwl<|yP ztzhP)@m|p+b(4n&JV(z?Sq|EyG?Rw|u!leyU)rQoQ%5WP^f~gRBqk3zve}6vkUnlh z(pe12+qziDZl?F;`;>vY*aUssgE;&~$WisgL)V}57#`ZBvX}T=UD1IgCQhihBK0wP zz!k&{o_(^g?IZO4BZYrX(-~hnE$|6`3FCqpUo?ULzJRE8bJFeQcoCBaNIVZwl8>Ru z?O?`$UItILWCwuXDqh2Bf$;!d1`kNf^Bm*D9NAC*r|m!x^>~o0Z>vlXc@lX3cORo; zZ_E{t;T09pD`4xZ=C~a2Iv_6hmI*h6ZD)-4s!+?gNtMh^$~dn!%>Xacx)I@S!nj$6 z_ofn!cW3ApZIY~8V$ALaflcywD_cBl#8DQLCcfNFqGXuN%6Kua1er?&T; zL?HQ_00`uoN3YC3J#m(dcMWTxJ-nrD236Bad}>9pCYiONqX7M2ZYmO|cMJ)SuA58f3?#V}%t*X6Drnk2D7~5eV7!CI!T5 z8Wc&Ob6R_3rgK!>VmS51C|pwJ35iBg3P^%do*bRJqv+@v!A8)OH~R=pkyrad2@xpI zd&qMQyCx`C`$IcH?1GnMMRIN95_T8;uANzV^hq8916|Z6wK69%q#;a{0D$Oi<5$`4 zhA%`+(qzoc)dMmaNAyI@4Tm9^Q4)AO4w#6Ql8B3uW20gP$Z4<;J%M<$LGJWYWfC7#_v2Ge%IM7EPE`$&^hJ&4^mgjQURq z*wZB{Wt3#d2t~=pl|tjY0wgd=EDV-nWS;sW^vF6a3R#h3WJCaHCq(`t0Zk=P2M58` z#v2d-m?M~wwSjlGUJWh&{22FtV!AxT*Z?}yAcozh_R8ZXFtDzeD_LY1bPhltX>xeawrY!%|g~l#?f@wYj?(N z_d6J|pa90rl*wjbEQ$6Mx^+gP?m@X%00%(-oAR5x87g3@KvIL zTf-yth^e3GDeqTWf?)ocj+aXvk~89{nU%+Mn)U?wBdP~41Tm*Gq{zZ7cS!!e^WOIr zD9_kZC>3KWYo4;uiVG~7$tpK>WX~GI@)D+?l+8)%#G^HCg(cW@H8}HIaI3hvIJDHuL}#L73+M{$xSkZ4 zp510U@r2rHvTMsRP#jf)RVs{@fESs<(A6^g^NliSi5(*ZH76BjO7SENlp##U&7b!i zRcR*M6vI(+k(hP4$LW7w)04M0rlihQjC`0I=^E2)Hq--{L~Al1{F2|xY=adP?zrHu zVBjANXjHCd3%t;N&GzAIpJUP6QCr}*Ik}!F7B5^i94cW~v zG?VD}>(B6;KBmtqDA=@X%&t_P{&7tNooOP2eEkrh+kcOEdSz-km5Nx^UvmC=bfdq= zIedqc@5DB}>~&k5>b(~M5>_QSfs@RU2~s;O-MVtsb@B>T=P!FLp1*MA=-uWEn{ALh zfmgI&ng8$Q$oOBJ@cvVN^zuel%Fed*as*5a|1qv}baEzOWM|?0KNKYk2M5Q0t;%Vg z_1HrRSD)Luy-gBW3CvF;7O3=dAxzlWg>*Y$=9RMmTE;3<>R}s6P34!>&#mx$jA9HW z(-=bx3e@qnoAy&XK`BZ7`pC(N$jHt}YE?)*NJFXs=3A<9D$D!%6sAI@!UZk$Ox2Nb zsm=+^?950f7xNj zV98-p*@nSkK-r2>CCK2=hK36o%#fv=`HaFcz}P`B7}X0p000szI!Ta*>TnTYNg(8s z7({)gggyibMT*i$kkid12{^{2?ngjCC}a-qacU;Y0WPST;JF2;5CoQ5Nq;~qpmE## z0yp}{=M4U$p=-?g%froWa4>PF)(gPS4nR^IJBZrSwu6~*&h;CrUe8S#s$K8Jrg|D6 zGc~^ieqsIP`BGg>=z@^K6eBW39b`ENS{~0r1BuVw_xT zRwg8i3FzkNnlqr2BbX+bqIjdZnjM!y^NuHsDG>na9zg=l?8>8Cjpl_eWJfozjAruz^(2%AC@z#h_=`Z+89CsKFNgl4fwodtA z4-&+jOqZY3SP+Fl9t6;2-bBFi7)TVZ6hDN8qj&{741n^K>J4Ccj{67Bi%1Prwn&12 ziUTE}^)7yz0?rU!u05t-a!w3#I?;tE2QeZ0XpwS8XeWRHJ6n;c1(RVS|PLeGZD=mf~8QfLnu6y z(VT+W`^)Ai{Pw;K_>rti8$Z9V0LT1zr&}C9PUm#owa4?@;3s?>e{yno>lnWyv@^++SNEeo7_#sG?;}00KLIOI`zU-yS7ADqCLkFtEGg=lv>3& z2i64q51H?|E<3l=;rF$xmnhlSuLk?sZ2;03p)b9a#%86#l&TcGTJIX71GCRA?j7>Ht<=xjohHR8;>_#pG$`Ra=@{3H*MBdxSAc{TAP@78%~c4*=X80ue~fJ zzxx&3eC+M(wWDWe`0~>gx_85mWohL;wrg{AXuXl34c)b{_*%yY>KR(YbCqbll}lLb z?i;+S4ht^`hOgmU^rRuF92zv1ra3?2dmATJ#N`<`mpEf@jGW70_jEl z^*om|*LW@5zH-Ojwm;(*+TL!juyq!8pV>}13m*!cj~o9ljUA_i_XP^x5m(t z9*la+i()|9%UculM0c*fbr`i-hA8Ja|+Jh(lvi` zGrNy|;Nd?9qKSmCwI)HVZNJ6-QG{nZvkYS=uv`Q>k0IXdjcLsK7kTL!a4x8z^W0Pf z{7v2m^z2)SeG&GSf@a}uOFav<&x*}ny$37V*EANRc-6(}wYG?5=RrohqCZaKRv3hi zuv__pe1Udpqn8tzH`$}Mm8Dr{f3j-NZydJFtU8+UTGumg8b)nvOR;aX*L*^C%Q>%l zPW}w0!&aZaxNL!3yorbc{wD}JkyAk_5Ry>=L2qyE`o|71>qxKx;}V~>_qppTkdu+2 z<;%&ag18t}5|<+&<3fIjh#C}-L+kJV2u2|&KmCmy2+vgwDGHw#m9MmOAoA$R%-IJa zZp;2RVI_MMOb$8xpO7^MDUXCR`9A`s{GLWf)|zgp?l|Yw--yh&e;b!bPym!=RaE{h z%gY5q{@(yWqm!XMmjd);7iZ&TSFWKatR8H6KyDx>O9VJ{9uc@FEB^!x>sg4eA>p-v z10MIe0D0vU#N_|Q_gjZ3ImatWgMsr}z5#%wCnAA-?Si3Ho8jdafozTi;FP zB7K>*#)sO;I%%r!A|2(ZcynSjKG7JWEbUjc=}t1?*s3J0d4pqLsP?L{}x9qvl{E8A*+u{t!B|C9N{gv`uWRyRKy6GpP|MSXGFvNto7xqa$_{ ztvi}~C#~!10QaljwPm|!YHEx*o3?|}*_<@l08U-?IF{`yP0pmO-=4tauy0g%WOwf4 zVQZYaf!Z13x;CE*to~j?`FXacw;BtEe$ury&C-%`ye7`Ok~o1`z>X90!` z?XX@$Q((~;Dz`=+h`J8cMCsJ_CmF(n79AqhT&KEhsRq){1k{8~8xLDsMDgRC)TTAT zRNyTGbal1Ns_2G{?PzT#FXHu2?d3G2Bzi|9l-bu|_2cEnY7o6NprL{zb|Bj(&h7(k z6Vy8{0~D%Gx-_7T`rWlTik7Zs;`vF(mSrWn?HCe&EYitNFuI0^@XnIg>vL}?eqTua zK*dG*&c~kbmkJ+Gqo-w7WLmyxMq3Q#Tt;e4>w8A|dR@(I>!!m2gRb=h90YNpMT7sQ0DT=;{?5slooMax(T*ISo99BIBnX$(@sufN>6GrX0fyXcP8Eph>5gDW{lurDUmUFju0V|AjuwvEBFU%K9uf!l|-cP{fC=Vt85kJ9o69`!=wgV(M3j9DBO~7 z-FQCQ4E`OMq8_1c9-;E+5gvL5e6zK+3QWSmrkHva0pER&`XipLN}^3>Lrr5LRonx^ zypeX9YcmkBC~b(KA8=3}y4|)LqB@b&wj{ODBz0IbTY?MZdni>kvfegfyzAHBc(0}; z9+VC*aEa`sdtRcdf0-(~XgJ)!Ri%bD%o6?NI31HVY!E@|i^e7c9^Dky>Qg@U;8!vx z7aYe<*i0V{)*othlM_z7+-GkHTn>57_9(7*^N!l|w*KbQ6txSh-U_LiYiE+&DTROV zmP|Ny;+1y=8|BfoAbR@&qrmFJK;)b%WgIU^=;cXod(*jipgxvp12B)5c+A;=PuOF4 zJMSVMKM5V<78oUVH(Yz{lm0vo@)LB^FkaMr2ou39oRC1J{-in|GfO;X|+VN z%s%Pu3RW@|fB#6ux*Zv1v3Y*`Xslb*Mqj|0+80PaTdtDz_6{i^rcZeDWiY*W&G_h{ zdi$DuDUCNE=gGJ3Yr$yG{AJRw;PR{J}4HrgpRIvuubBFi3-!dH%tpCiK z&Dzst5Lu`$38b>#wS#@df_eB((C&=vW%7sV+3+v29(a@1;p8V*ZE)ci=-8`cV^ss*fj~;$$;#(S4~Sd z8iXut@dsSshar8WlMBkJ1)eD~9FP3mpI;TJ;-6@$`QoIbj|NwOm+t~7L<3s!9Vu{4 z{Ahq3nE8|BDR5Fff~h!yrFbJ#>5G*(sl33JFTqefqp3uuD5g-=PU0b$x}BzxE1hFb zsAet*>pab}hZd?A(|Ua@X3-BvdJPgDvXZ6A<8i{!6 z?Q(PiD|zFNwc76{X9H$<6W5t%?+ViNBGu0(+IYtERc>7$?XQ`+|MmTi0w{^x*kzi}libm`2`}>9T>13Th zp5H9>iDndkRUUE;dExh$_jkx+i6{5do2)nKdrbvfY>J}v4!$baNUwp%mvHAcYwsmr zorL}ewcn+v)_te(W_G7Be*1Zare9j&qH^<(=FV}JE}Ms^tf^#ZZ}@hP-NxbI>2=xm zu)q&5Gb#@mPDh$1AFv$Y3$g~(*m9^wh`y| z(!t{e!DdU`udCJXljqJY+#b=FBkxxMf6QgpXLxL|?iehN?`n3I&ufD3s%?#~ zU!xIqd7CS>lEd`7)cKuS3@bY|C{{hOCUkFLrL`r4sOk!Y=d8f7iMKqY4~|j47_0-aQ|D(GZy}`JWVEX~NIpBy3$-<9~L7|8HRc z)&>}$O&~Y`_2&Q)|4m93rvIyy|4SG7fA9qW0YoJE6#l!6|Akoa|KSCgnVH%C(;WQ& z;}>wUaxnbYj^IDKfQHIy``L!qHE-NB!xT&$pyC!xJ`y-XyaWjw+yKGY9fBB2%2*!^ z1Jsm>8NmFTg>9mieU&B8kcP6Pv19bLWcjnZ!~)xnw$ma`Qk`w#_4(?{2Fr`JQ|$Ek z^?g$XF)ijQr(qk0+Z)^*)0zrHoccc6?A1t3kphE4ee?d9%Y?7!WBV!i-* zsWbiYZ*K+loDhtZcjwm+Zm-{e27h@&5ITW(Zf|aIZ!$Y+O!oZ(LL&YoR5^t`|IFAy7mdQe(so5%Cc z6fF@Oa)RHDdaGt19|H3RJ+Z5Qg~Isv?)?r8R|4l+q=GqcjW~E4(eEMdNxzIO2$Mu_ z(yrgq%A;5TQy{6L8Pob4{X{+{Wi1XG;;GG?B$ilQ*SEt34~{1*Q7A(=^KXoI?8K*} zPk%zshL0FTEpT!|XMaV+=c%u#El^T~tcCcET156=i1!zB&T`Zw8C zDJuEuvgzE0+AGypbZB4q4Cu1&ZbVRP_iF(1LB9^n=Ldh2Z-zQ{3il{#x>~# zSk(_mT>V2j0d65U$1X%n@f;j^$}mY#Wr1P*XtibBf?744*JOsSLCzZq*31!#HHs8A zd_S3nt?rcJeTl*E1aoRR($dXpO3 zUw4T##zFVX@D7YM({S<6u5jfoBUVr1vBG=>GrFC4C^Pzujz+xA6x)d@c4H^UlOck+ z?;E(KNR8hwJ)kO|#xla%EE)-5G-``V>L>)WL17z=Y9q}(+Z5(ZHhZ>?GdESoUw|_O z>^J@-`Kpi#+(jkE7$xOD)cu(nC^Tc*^VWi7438P123YkMgqM&!s z$~IE6hRdF0qXRo0VHHn!BQ}Z^sy0?qT9Wqz3n8W4x9LI8Wq#+Hn=k!8%DrcLtvB}Y zT&^j#m)H<2z9r7rBY;1==k&wXBZ-|Z0_+oIewH9v;EO(7%xtjBTlh(f< z%W?_nLbnJaTl*qGj+(Yhm;YMj?qj0PKFVOaI#p-YDG|4-RW1AtAJkA_#){92H{ftO zN!~BEOqlN)v(OSL(U3`xMlES?TUN@4w8bM(%@;VdjLO%BTp9 zI-S*FpwlwZGGS5%qMKMF_MAdXKrAjlaBRSo!MjOMnyxmC?H_&K+lzmSkyfI8{LqdL zwKNmD)dizZ^QF!4lH_9X{x$143nDxbEPYI?3yg-a1uCgocI^yRCkP0qK0A9^#Lm$BtjRY>G{K0+x3?8k*Fsis8=w(elL3rax{{PB(yfznb? zh{hX(igX$aO~^7O|6tE0P^~C5yhw;DH4hbSariNrjhNK_{`~-+UPn^zO|l2Do|J>T zJ$PKQ^e7k4$dB7u>*M--8=13H{?VKquHi=dab2AZ4H4VA(EbRndj)bMano}YHR(|w$p9FBQvgMQ7IXuX7An%@3=duHnycw~rX=V+HO=LA=t z=eYatxp}YOL&Oe0{Lj<1bR3ha%t>oTDZSq#<9XNu_ijoozq12>LMNQjbXMP>PSdPf zr7;rnTlKo8mKgC}qq%tsB&22|C)sk+LT1m%SiYK_tX|Zg;Vv3OSE15O!3^f-i;Pqc z7VlghNu0DcI>Yk=%E3-QAM_!5X`Ns5Gpbg#$$A;upbZ-%Af6r=R=p&BTNJKFONHB=+7x{9g|P3-;I5wT))m??=SF zX*1}wZyDVeWB*TKUlkMw5N(MDcXu7!-Q8V+OM*KL8r&tgTW|{lg9l6S!QI{6-64eK zeQfQ%eQ$Tay1J`x_s^|U)zwF&9aav;OrM(053>y1ZBdQTnwMakL2{BteDY(7W(F!} z^(wMt&=rE@xxpcrBMy`o1%k4>k;zNT{V4rr%-jT{=s=b6P&X%^x({U(ug!opTjH?A zrQ{=sL?ev&$#ON@>p}1?cV#X^MT9SEnEc?McJ5Q+=n+pC-3F}QZ;y-u_Co~vqqsdU ztZ^Ibm9=5I5~^tR>08ur0bPY~;lAfJ$JWEmfr*?+SY?sHN)FUIk>0|FXK(V6g`8gj ze|*q&e5-wwV`$ue*+(Q~yA1Q4;uv_6hc(o(ksT7bH{9GA#?Aw;m#A20y|%~d0R})C zGhZyEh3>10TLN)fK1c6G8LK*mfnm_X{wm%kWhT6}IYLD2EP)MAX|3v)oO-GN>4Ag0 zaiX@_Z&tLpoY(o<1Dakl2kk1NFW|{o5y-~nnwql*45b5#Y2fF%?sF{`4$|<7 zLpZ4=6UXqUf!DahLJgakl1c=2O8kOU$+4O0DKYpzRMqwxgu}!7AX-h3d`0VMqx_aT z3SvD9!zH)N5(LssyHPv;pZ9BiMlAwC?_b}bFD7tM@YjCX&Ud*4cziM2jy^kc7Z1o7 zCb4xKfzE;PeKydbp(_!&YaHhkj>WUNrnB%Jh*Oym!SQA3HHUk&+<<%dlqVw!R^ExH zvoOHsibc;`4$(W}BU#9{29y)VDKhk@*{Do|S=_&$gT9|H&7H<84gloVyz=!i>hV(e zZQ!D1fAOcy%?3C>lxOuo!}dsF>hpt<(BAgKwVo`ft2<8g@A(1V#HQm~ zKwU-6Gk=4BYm{VxArFG6^Qf#CRTE#?#*qTSg`Qvoe|c>d^B$co)`FP9rm<0GCXFcLwnm!xZVv7Ul?E)N~IJqz0}U(nx=SjpNZzj8YNdl4sF z;U2VK>Im8Djs&xTQzw;K652H*C$U$RjAmX`aWYi|We@m0Dm*X|>>~ z`$#rCuA?Hx04w8r-_%1BG^J*uYjtfuSf*_Xg<5NbWQ{fPgJ=c#xpWr>u2 z_D!>Aq;62LT2UKLmgmd8JyaZ~$_vP(&1XEPw-YnWkMtprb3ME6)|BmgbVrT$S z;R0)s@&TBXaUO4!%VxkcnLbNbv4?TD$(zJ8+vfOA(i% z|H-2wGdSUpyQ29kvLe5~J$9|~-0^dtOkQMKxCkR&`dv!Tf~6iW=4K#?^+ePgVr*wm!Rt-L@D#h}D>3s8?BZ z@xJFb@?Pi_WG(duGP@`a7-Af|olkmsTq2@wyx;vh`y{v+9M~EqAx?B;V3b#t0OG^; z2}m(j_}U~SrdZ%;t{n&Dzfx3u;aY;Gk~>vc&TVANEG?VoqjOh5vX%xSec3vUN=&E)&`+3RkA(#dvsKKowaiwX`%1cT=5&%3Alt z;WzsTwA05oYQNE^+JW1Xe@?cWsfJ7$gRzy`d5@ic$NFfDU$Y!~k9vQrx|ztB^CX91 z-IT3cD|r^GM0s%=Cg;^GX5THPs4n&JP&;58H=iz?W*oIPXT{%fc0~+mje@M&tfC_v zb`>f02@|p{5ma&F7*kC2$47%~^=EvpyOrNHyGnP9dD`D%C*Kz{oA3Qsbw6{Rc5N() zOy6uJd{Y;r?C3h_Asah>OXR}46mOrL|NU1!X5-3L=`zsBJT&-ou4Xl_J@0Qi2IK^s zLCaNB;R}8~;$^;6W2a@0N;qCF^QgdIUO9gdkHl_?(E=>2;=xYbbM12AkRd26X|Up4 z{R>-9vomte6eIpfybS`(XT&h$eSWp_SCkj!`|_i_Mlfq4eisIpl|7ZMemRQ zM13l~wfyzg3 zyk}A!nVNilxTC$b=eht&xZm>_v6uRklfRZHmdlsh(|bWpGFunOUow%blb5TFyowno zY^{WWQSsT6`Ae3l*Ar5@{n1v{;04h;%wngF`JC2AOuKO1uJXZ*V{-t8d*WS}r8p_n zt8h;f?4*rTf`A^1a8ZJYF%}0+LMwIhat7|{ca;=!W7o)SmA_c(=UEB<06949UrjtX z6{LO>Dr0}2eBZD|Q9|7PQrM%NXeLND&$o=7XQg#sG(kW=9aBod60ZKnIN>xuEH5v=)2(NQLwdoLxdaTPjgDB2S zwZwmKolqUM=TCG%@OqCqFSuumuaZYBk=^QY&jE4vMh*l8;MJO7XBBKrBRw!2%|?bppfe$5p9vSqYu z)ek#d1`;l}0v?p2K7@Y{ZC&C8`VngyzXwen1lkmiPYLE4}%5RS0WesunYVcp2o`;%=SCBl8 zeTlWlSZhWnFJwJ8pJ#Ia;k7o{hK-++bkBWocq)5_pR%$yzu2T=82k_@)D?xY{ zS}DKW1gC}QATxyqOtl|6V)TeL=?^;nJm^0XDmGf$PI?+1+IlESX z51CMyMM;cVVa;t4!Ck93xF*nvN9P1@uw)$@YSZVZ?mn*}4c_=UjA4?583g=oFWW_u zW@lnqyCL$yz|G)8dx!qvTZ^yJEtXCwI@*}l&!D4NNdv$hLN{x^#MJ32K`e^0(ynGW z7OqNsa5sA^vXcpJtRpQ|e|WEl=ktr?0hI<-aU?DbH-oh7)EaV}WUwZpLjVvX*v^}w z9g4SDD)=;n7etSHlZl7-8~SKV!fc8k^XSgw8D>2n5{S`W6H`R#=wa5|HPbO9Y(7MO zf=d2%Au94K8|Rym#T48Omp3=6yYG<_d;6_+r_`L!_c<63cvpTHPhbiy{VkT~QiwoQ z2QfcPV}*C7Q!jjneuW8<5FAGYi3`LtqQr;-u0L^W8N~%|1!Wq`JR;!p0*Toe0`U`r zA)-w@t|>(X{yi6aSw&RmErY+OHp^SgLUqiBmDBK&B}wY}y3+BD=K167ePDm8)qlu= zwH(L5`XRB9BmgS|hjd!Z@WY(qA(n7jQ503uGS_(ntDh}plG7x%1pvQNuwg;<9rLmFlPPKG+coiCpH4}v1jm=GC3sUXBNz2?ABP9_|#opRINPpEkw zo>|2F`;;r24ot|7saS(;;f;cda_8Jp3LWtR>Rw~lQun!YI ze%(x`EIk3JaX6Zl|5XS&>P*}arI22=oZu*HiIszfY2#4SS~OI)kPrEcjEta(;;u<%A`XA;O*d-6v{Dt*>31x2sZ;zLb6PEUz{aM&*dy&4rK#){1TTCH~j#gE($W1eDPYG(6$wpmhgte_Uh$q?O3&8Gnw z(C&{dRTL2&h%I1VSuj9)!wAG*6Dk(66s)VI&lN}aL|12YoKO{`3%b9nz&}`oWocMQ z(A6gO3SK}>j$)T zq&XuQ!C~ce!C$J|SrL|aamkA|l}>49YW0rN0E;q3I7C=OaMth|dxh$j9)L9xGgIz# z8^L{ppUwF<8t|7^re|p|1~^=@ct97pHOm36!coOC2@b*ZY~4zEh&sSTy>4N~fXfOk zCL`yFjS{s?Be_fkAvs7H&YgRI6I!+OudrF4qNg_cRWGo&`B$72r3cDqVrIsm{m6Ji3-U>vsm@5KMAWpYxrPw7#wdjeO&lTuI`iUI8Y z$T!)zvEr3ly+)FsgNmHOi(dgv^ifh~?lQzTsN2NA{UxiY_65a9!6JpVgvqsf9g9Zd_-f&5 z&U(IP?4*(_E}<5enf4=4yHSd}u1777QJZR0FZyLdwX2Rx<4cl7OFMl`weNbPSf)ew z*HWhIX`v~C3Y8BCQ6F=b6%)ShKfgt^CK!KPK&%0>-SmGJbXM}L4P_OG;Hk|o3TO6; z4E%9v#UkBEp~Zv)*$n2&jC09vBtchMQI++iRI3Q%VAs|`ufM_22zX8JNXt~pnoEs9 zUX!r=f}f6*9PEFwz^{0!c}g=iQX`;)I2|LP^gCz7P-Ef>Q7vQud_}Zq6LjJM#^@1O zKa`YO^GSND$U{KV&PRwYxbaB>njA`Ar~BKWs`fBH5G{TS6`Dtiy~@sGj@HX%Mw&fT z;yhH6$`$|n{;h_#&uVG%!dUSsH=p^Vp82ExcM356HdOuaV{z$FX@}mehSqrB_}G5= z@uXb&=AUs5t(Z%>GNg1CaLp}Zf?Y#p!YLP8aH&lfvXb>AC}4#xHdw9#Db=RC<`(>z z+@vY~om0yWPjnrj4Ky!Tfk~G{kuXuKNG~%%zZCEIMPsIv7o=+=55cpM-?8!XqBXuh zQ}~NJneb8JMH^^sBfmZ5dmrbvADswFXn~P5Lj#cvy&%!Bi$P-?R!TB+T zcjd%Mj|S5(osW!FSu8$9-4#I7l^^?eOD&h+&btp?z1D@HOQSvE%Lrb~sBhGpsO0qO z;Ul~hdCL;s)qV6n^km@;O&tgN%V<0FbEZ$dEgV%$M?VfQn#(S^;1LOau^n!EAV``) z4RVHt%*Kfe{P^Xo>6V*bRQ^~;NR#4y)JH;e%2MDZDc&LMbnYsH)Yf8Q9N%vD1V>WKKr6CN&f=p4zn?Uj*e zy`dIDZC+HP28B(_47r1&x1gqkmym!zILRXpZlF_<$0bf$+!SWtRy*zU*2`Rk7KxJG&NcR%4O^ zbPD^1Nllf(l3&=b?JN0;X)~9UixHlbyo)#Ie^1Y&#f4Bjyuz7RQcQw&G$gxWuthse z!a??J`tur>xH%-1x!{qUGjr8nOG|T8TH1ECxUBo*SB~{DVEf#8H0C_&FzG^^(g_V`+8<#6%71#wBlknpYF+G$g z-&7egh}e%CTGz&<5)?UjQ^uP>Yy;K-Rk|*~s!-M_vJjAr=H&9?F_Z19n(vPM9Eh|Q z?gqit-Sgh-s0R0&+91$DX~;@jIB1VI*q7ts3z|(a3FM40pL_1BHtAvo^FocPQs-$Q zeuhDv-jKrQ*UJ!C4ed4lL}v7H;VP-i(J|7LC>hJA=c@bY;H5R&S`Zakl7(t&2Sm{(^h^>P zUCCKiI^b78zY<}vj~TA6nNCw)G1RA#?Ji^`BC9U)B>*rNO?3j15p4hCT(`cx;%ByP zX=MfU5a7iTRE%GTy{DL_S39NbAu~|Zh@K^@%Z#eKGD-$jmz@L+E45}^$M*VDEm2&? z(a6WH9VK9BrmS6_k8-HBL%_El1F(ske?Wk-Uwu*!+nbdbZ zjQo4BB({=2bdP-Ka1y_QD4EvR0`&RETuN4p4Hi8{ieGo)DdLuaaCESS0`c^mh zQSKP4w68rQM<8WV3THpN*E^H8P&^1?LM51Ma@g`}9$grmRmo_FJd?a>Jd-f1!}>_7 z!orzPDFH*@v=n-P6IsO)ACG*<_?(h?t1h+}MN3)56~;xknsdntjwmtO0TeL44=MJlzfaPPu~|cpAZ|bqHD>-{uClb z9Io0zyO?;G2WS;dF< z;`dipsjvOFIJ)fa8T#t}rJ^?rhPYl_0a?#`>EI^X$@3-t?xn($EqS0^V&dL*5NVJ4 z7l^tEBnt4?lIUM^cmcyeNz{+$X)J$GO|JM{T$fH9g?bNy{1rdEzXT*P`|4ly(=@^L z_wdJ_xB#PT8ti`qy`xVqj{O+yy?&3DH-3P2dYm8=$d}Zs_oORlq##c{{C6Fs%Mr*I z#sLh)r%^la^6)O&ZFVK^sPGnL@0{?Kg@bFO^`}527tWpWUiO!YczdQc&Hs|T}rfxGlKqBK3`=Z4p16UCLaXlxR z%T>lT$=VW%K)Y3Ixmd`h;^4Z8Z)Y3fx8wT3`1QIm(NJN)+V;#f8MfCk@bv|?b3J}> z(_w4TX3Gz)Rkizcf$rv%ww({FHU!T>4tQ!Wx+#QFyRfU12^<|Ec*aMn^=Q6k{?f<% z4LETivauYQ$5$hW!LR5oYeCf|1&NPnh5l}<&~uN}iVmt|9z<^yq&03^8(KWr-j_3` z**>w7>okOn#^*&M*U*$3x=J}%=Pb$;wrSW z7tF-W4hsqYXs`|BE}KTc9d2@HXxFCIRqjvpY*^kEpBpbn#qui+8$7rXUUyof_c!>7Rzz?!RiE z2ksZ0FJBkSC#?AY3HxTD6<6H}`3TkcdF|f(R`{u7I>!lrGrmkXHp&!uZWXkDv~MJ$ zI8vGQrE&0?;on{m{P>kFy2RmD-=6N< z72WdGcN}lrG(bMku7%hIcXsEol0h|pb(uCE>51QthmmtIPRS-Pe?XwLRx=~>8m~3B z2N4zcml0FnoYGK0@^FvMHy%TFA%dd@_)?kQ=@6J&TEDB?_9O3i?aZP5R&V=TzUZNa zN;gy5#$k&@JdH=V=xAYr-x0>`r9o)51q9?fc^e4)N4oK?z?uKkl;uEfGEwK(f&4t8 z5)5isUlbxaETaBAsV%f73vsR!O4iDs{byxmL=yl8QZLEvJ2;IWk%?w9{6y2`+%u<- zC~t4^RZFK1!bD9pIC_7S^3CIBZz>N zkjJ8RnZ95{8mVe;X*dG|nw^y@EKPG|2{>svj@hODEjvjj0aZyTTCN6HC(Rp4(oFxY z-x1*XP%tzX{nkwDynl(K{|eX3r=VoMKl;D~K@ctiwp|53S&8{e8B*MXA&TS?5@yldo&27$aWx>V8YsqD1$!X1N!DGQ^E+F>* z-(kY8<>KOj{2!R4#jfaV?Lzqs`DPxC52qF5A&2Ky;Ug zaq7^TWf7WtAC{nT>QORwy*ze!&f->qun*mqYoVI0NP0UGjvqdw%+4|dau&*GiOQ}B z4-l=mo(%z_fL3zh9Y+;eemXNGuioDR6ezA#13T2laiewgUj1BW;pBJb$X z)-g^S$TZOnXeEsW!t?d$2;kUkljcUD0J-`4&5h$7fUKW5Fc!^3_<9doQ7Cq4*5Y4* z7#ICC`XR5^P~?5m-h_$Unj*1-*KqlL+WOHt-o%qz0FkJ}YZ%kM9B-o9EuHqr#p_QS z{YKs-;A?cTK0j{?iY*fV1a?kP$`1#&oJl8@ceAl4$1#tk)f-a)^LW}>ZJLnZtQhF& zL%SQ)@b(^Gse|Ot-_d8&rVYrlQL0` em todas as requests +4. Token expira em 1h; refresh token expira em 7d +5. Frontend usa `/api/auth/refresh` para renovar automaticamente + +### 6.2 Guards NestJS + +```typescript +@UseGuards(JwtAuthGuard, RolesGuard) +@Roles('admin', 'gestor_facilities') +@Get('demandas') +findAll() { ... } +``` + +- **JwtAuthGuard**: valida o token JWT +- **RolesGuard**: verifica se o perfil do usuário está na lista de roles permitidas +- **@CurrentUser()**: decorator customizado que injeta o usuário logado + +## 7. Workflow de Aprovação + +### 7.1 Máquina de Estados + +``` +RASCUNHO → EM_ESCOPO → EM_COTAÇÃO → PROPOSTAS_RECEBIDAS + → EM_COMPARAÇÃO → AGUARDANDO_APROVAÇÃO → APROVADA + → OS_EMITIDA → EM_EXECUÇÃO → CONCLUÍDA → AVALIADA + +Estados alternativos: + AGUARDANDO_APROVAÇÃO → REJEITADA + AGUARDANDO_APROVAÇÃO → DEVOLVIDA → EM_ESCOPO + Qualquer estado → CANCELADA +``` + +### 7.2 Alçadas de Aprovação + +| Faixa de Valor | Aprovador | +|---|---| +| Até R$ 5.000 | Gestor Facilities | +| R$ 5.001 — R$ 50.000 | Gestor Facilities + Aprovador Financeiro | +| R$ 50.001 — R$ 200.000 | Gestor + Financeiro + Diretoria | +| Acima de R$ 200.000 | Gestor + Financeiro + Diretoria + CEO | + +Cada etapa gera um registro em `workflow_aprovacao` com timestamp, aprovador e comentário. + +## 8. Como Rodar Localmente + +### 8.1 Pré-requisitos + +- Node.js 22.x +- npm 10.x +- Git + +### 8.2 Backend + +```bash +cd backend +cp .env.example .env # Ajustar variáveis +npm install +npm run build +npm run migration:run # Criar tabelas +npm run seed # Dados iniciais +npm start # Porta 3000 +``` + +### 8.3 Frontend + +```bash +cd frontend +cp .env.example .env # VITE_API_URL=http://localhost:3000/api +npm install +npm run dev # Porta 5173 +``` + +### 8.4 Acesso Inicial + +- **Admin:** admin@hefesto.com.br / admin123 +- **Swagger:** http://localhost:3000/api/docs + +## 9. Deploy em Produção + +### 9.1 Infraestrutura + +- **Servidor:** DigitalOcean Droplet (Ubuntu 24.04, 2 vCPU, 4GB RAM) +- **Proxy reverso:** Nginx +- **SSL:** Let's Encrypt (Certbot) +- **Processo:** PM2 (backend) / Nginx serve build estático (frontend) +- **BD:** PostgreSQL 16 + +### 9.2 Nginx Config + +```nginx +server { + listen 443 ssl; + server_name hefesto.exemplo.com.br; + + ssl_certificate /etc/letsencrypt/live/hefesto.exemplo.com.br/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/hefesto.exemplo.com.br/privkey.pem; + + # Frontend (build estático) + location / { + root /var/www/hefesto/frontend/dist; + try_files $uri $uri/ /index.html; + } + + # API Backend + location /api { + proxy_pass http://127.0.0.1:3000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } +} +``` + +### 9.3 PM2 + +```bash +cd /var/www/hefesto/backend +pm2 start dist/main.js --name hefesto-api +pm2 save +pm2 startup +``` + +## 10. Variáveis de Ambiente + +### Backend (`.env`) + +| Variável | Descrição | Exemplo | +|---|---|---| +| `NODE_ENV` | Ambiente | `production` | +| `PORT` | Porta da API | `3000` | +| `DB_TYPE` | Tipo de banco | `postgres` | +| `DB_HOST` | Host do banco | `localhost` | +| `DB_PORT` | Porta do banco | `5432` | +| `DB_USERNAME` | Usuário do banco | `hefesto` | +| `DB_PASSWORD` | Senha do banco | `***` | +| `DB_DATABASE` | Nome do banco | `hefesto_prod` | +| `JWT_SECRET` | Chave secreta JWT | `minha-chave-secreta-256bits` | +| `JWT_EXPIRATION` | Tempo de expiração do access token | `3600s` | +| `JWT_REFRESH_EXPIRATION` | Tempo de expiração do refresh token | `7d` | +| `CORS_ORIGIN` | Origem permitida | `https://hefesto.exemplo.com.br` | +| `OCR_API_KEY` | Chave da API de OCR | `***` | +| `SMTP_HOST` | Servidor SMTP | `smtp.gmail.com` | +| `SMTP_PORT` | Porta SMTP | `587` | +| `SMTP_USER` | Usuário SMTP | `noreply@hefesto.com.br` | +| `SMTP_PASS` | Senha SMTP | `***` | + +### Frontend (`.env`) + +| Variável | Descrição | Exemplo | +|---|---|---| +| `VITE_API_URL` | URL base da API | `https://hefesto.exemplo.com.br/api` | +| `VITE_APP_NAME` | Nome da aplicação | `HEFESTO` | + +--- + +*Documento gerado automaticamente — HEFESTO v1.0* diff --git a/docs/MANUAL-TECNICO.pdf b/docs/MANUAL-TECNICO.pdf new file mode 100644 index 0000000000000000000000000000000000000000..eb2ea1058f04c4ff7ea2940ab2217b58c21ee86d GIT binary patch literal 104621 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

OFCJ6KGn9irXI~ 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 KK#Z)7+5QHoJ_^GC literal 0 HcmV?d00001 diff --git a/docs/PESQUISA-MERCADO.md b/docs/PESQUISA-MERCADO.md new file mode 100644 index 0000000..c32ed34 --- /dev/null +++ b/docs/PESQUISA-MERCADO.md @@ -0,0 +1,105 @@ +# PESQUISA DE MERCADO: HEFESTO (Facilities Management System) + +> **Nota:** Este documento foi gerado com base em conhecimento de mercado pré-existente e análise estratégica interna. Dados numéricos específicos em tempo real (2024-2025) podem requerer validação adicional, pois o acesso à pesquisa web estava indisponível no momento da criação. + +## 1. Visão Geral do Mercado + +O mercado de **Facilities Management (FM)** está em expansão acelerada, impulsionado pela necessidade de eficiência operacional, redução de custos e adaptação aos novos modelos de trabalho híbrido. + +### Tamanho e Crescimento +* **Global:** O mercado global de FM foi avaliado em aproximadamente **USD 1,2 trilhão em 2022** e projeta-se que alcance cerca de **USD 1,8 trilhão até 2028-2030**, com um CAGR (Taxa de Crescimento Anual Composta) estimado entre **5% e 7%**. +* **Brasil:** O Brasil representa o maior mercado da América Latina. O setor de serviços e terceirização (onde o FM se insere fortemente) continua sendo um dos pilares do PIB. A demanda por soluções de software (IWMS - Integrated Workplace Management Systems) está crescendo à medida que empresas buscam digitalizar processos manuais (planilhas/papel). + +### Tendências Principais +1. **Digitalização e IoT:** Uso de sensores para manutenção preditiva e gestão de energia. +2. **Sustentabilidade (ESG):** Pressão para que edifícios sejam "verdes" e eficientes energeticamente. +3. **Experiência do Ocupante:** O foco mudou da simples manutenção do prédio para o bem-estar e produtividade dos usuários (UX). +4. **Trabalho Híbrido:** Gestão flexível de espaços (hot-desking, reserva de salas) tornou-se crítica pós-pandemia. + +--- + +## 2. Análise da Concorrência + +O mercado possui players consolidados (Enterprise) e soluções de nicho. + +### Principais Concorrentes + +| Software | Perfil | Pontos Fortes | Pontos Fracos / Gaps | +| :--- | :--- | :--- | :--- | +| **IBM Tririga** | Enterprise / Global | Robustez, integração com IoT/Watson, gestão imobiliária completa. | Custo proibitivo para médias empresas; implementação complexa e longa; curva de aprendizado alta. | +| **Archibus** | Enterprise / Global | Líder tradicional em gestão de espaço e ativos; muito completo. | Interface pode parecer datada; excesso de funcionalidades que poluem a usabilidade (bloatware); alto custo. | +| **Planon** | Enterprise / Europeu | Forte em sustentabilidade e compliance; boa interface web. | Preço elevado; customização pode ser rígida dependendo do módulo. | +| **TrackVia** | Low-code / Flexível | Plataforma "faça você mesmo"; rapidez para criar formulários. | Não é um FM nativo; requer construção da lógica de facilities do zero; falta de "best practices" embutidas. | +| **Optii** | Nicho (Hotelaria) | Otimização de housekeeping; muito focado em operações de limpeza. | Muito específico para hotéis; não atende bem escritórios corporativos ou indústrias com manutenção técnica complexa. | +| **Software Local (BR)** | Pequenos Players | Preço em Reais; suporte local. | Geralmente limitados a gestão de ordens de serviço simples; falta de inteligência (IA/OCR) e workflows financeiros robustos. | + +### Gaps Identificados no Mercado +* **Complexidade Excessiva:** As soluções Enterprise (IBM, Archibus) são "canhões para matar moscas" para muitas empresas brasileiras. +* **Falta de Inteligência Financeira:** Muitos softwares focam apenas na Ordem de Serviço (técnica) e esquecem a dor da **compra/cotação** (financeira). +* **Usabilidade:** Interfaces legadas que dificultam a adoção por equipes operacionais em campo. + +--- + +## 3. Diferenciais do HEFESTO + +O **HEFESTO** se posiciona para preencher o gap entre a "planilha de controle" e os "sistemas Enterprise caros", com foco em automação inteligente e controle financeiro. + +### 1. OCR Inteligente em Propostas (O "Game Changer") +* **O Problema:** O gestor de facilities recebe dezenas de orçamentos em PDF/Imagem de fornecedores (limpeza, elétrica, ar-condicionado). Digitar isso no sistema é lento e propenso a erros. +* **A Solução HEFESTO:** O sistema lê os PDFs dos fornecedores, extrai os itens, valores unitários e totais automaticamente, populando o comparativo. + +### 2. Equalização Automática de Propostas +* **Funcionalidade:** Após o OCR ler 3 orçamentos diferentes, o sistema gera um mapa de equalização (Mapa Comparativo) lado a lado, destacando o menor preço, o melhor prazo e discrepâncias técnicas. +* **Benefício:** Redução de 80% no tempo de análise de compras. + +### 3. Workflow de Alçadas Dinâmico +* **Funcionalidade:** Aprovações configuráveis por valor, centro de custo ou categoria. (Ex: "Manutenção acima de R$ 5k precisa do Gerente; acima de R$ 50k precisa do Diretor"). +* **Benefício:** Compliance e agilidade, tudo via mobile ou web, sem depender de trocas de e-mail. + +### 4. Controle Orçamentário Integrado (Budget vs. Realizado) +* **Funcionalidade:** Cada aprovação ou OS executada desconta em tempo real do orçamento daquela conta (ex: Manutenção Predial). +* **Benefício:** O gestor sabe se tem verba *antes* de aprovar o serviço, evitando estouros de budget no fim do mês. + +--- + +## 4. Modelo de Negócio + +**Formato:** SaaS (Software as a Service) B2B. + +### Estratégia de Pricing +A precificação será híbrida para garantir escalabilidade e receita recorrente previsível. + +1. **Por Unidade/Site (Predominante):** Valor base por prédio/escritório gerenciado. Incentiva o cliente a colocar todos os usuários do prédio no sistema sem medo de "custo por assento". +2. **Por Usuário Admin (Opcional):** Cobrança apenas para usuários "Power" (Gestores, Compradores). Técnicos de campo e solicitantes (abertura de chamados) são **ilimitados/gratuitos** para reduzir barreira de entrada. + +### Tiers (Planos) Sugeridos + +* **IRON (Básico)** + * Gestão de Ordens de Serviço (Preventiva/Corretiva). + * App para Técnicos. + * Solicitantes ilimitados. + * *Ideal para: Pequenos escritórios, condomínios simples.* + +* **STEEL (Intermediário)** + * Tudo do IRON + + * Gestão de Ativos (QR Code). + * Controle de Estoque básico. + * Relatórios de SLA. + * *Ideal para: Médias empresas, redes de varejo.* + +* **TITANIUM (Avançado - O "Hefesto Completo")** + * Tudo do STEEL + + * **Módulo de Compras (OCR + Equalização).** + * Gestão Orçamentária (Budget Control). + * Workflows de Aprovação complexos. + * API para integração (ERP). + * *Ideal para: Grandes corporações, hospitais, indústrias.* + +--- + +## 5. Identidade do Projeto + +* **Nome:** **HEFESTO** +* **Origem:** Deus grego dos ferreiros, artesãos, escultores, metalurgia, fogo e vulcões. +* **Simbologia:** Representa a construção, a manutenção, a técnica e a habilidade de criar ferramentas funcionais. +* **Slogan Sugerido:** "Forjando a eficiência na gestão de facilities." ou "O controle total da sua operação." diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..18bc70e --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,16 @@ +# React + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## React Compiler + +The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and [`typescript-eslint`](https://typescript-eslint.io) in your project. diff --git a/frontend/eslint.config.js b/frontend/eslint.config.js new file mode 100644 index 0000000..4fa125d --- /dev/null +++ b/frontend/eslint.config.js @@ -0,0 +1,29 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{js,jsx}'], + extends: [ + js.configs.recommended, + reactHooks.configs.flat.recommended, + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + parserOptions: { + ecmaVersion: 'latest', + ecmaFeatures: { jsx: true }, + sourceType: 'module', + }, + }, + rules: { + 'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }], + }, + }, +]) diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..db43c33 --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,17 @@ + + + + + + + + HEFESTO - Controle Orçamentário + + + + + +

+ + + diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 0000000..8a8462d --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,4210 @@ +{ + "name": "frontend", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "frontend", + "version": "0.0.0", + "dependencies": { + "@tailwindcss/vite": "^4.1.18", + "axios": "^1.13.5", + "lucide-react": "^0.563.0", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "react-router-dom": "^7.13.0", + "recharts": "^3.7.0", + "tailwindcss": "^4.1.18" + }, + "devDependencies": { + "@eslint/js": "^9.39.1", + "@types/node": "^25.2.2", + "@types/react": "^19.2.7", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^5.1.1", + "eslint": "^9.39.1", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.4.24", + "globals": "^16.5.0", + "typescript": "^5.9.3", + "vite": "^7.3.1" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.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/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/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, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "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, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@reduxjs/toolkit": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.11.2.tgz", + "integrity": "sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@standard-schema/utils": "^0.3.0", + "immer": "^11.0.0", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.1.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/@reduxjs/toolkit/node_modules/immer": { + "version": "11.1.3", + "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.3.tgz", + "integrity": "sha512-6jQTc5z0KJFtr1UgFpIL3N9XSC3saRaI9PwWtzM2pSqkNGtiNkYY2OSwkOGDK2XcTRcLb1pi/aNkKZz0nxVH4Q==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.2.tgz", + "integrity": "sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", + "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", + "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", + "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", + "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", + "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", + "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", + "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", + "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", + "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", + "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", + "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", + "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", + "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", + "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", + "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", + "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", + "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", + "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", + "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", + "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", + "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", + "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", + "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", + "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", + "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "license": "MIT" + }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", + "license": "MIT" + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz", + "integrity": "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.1", + "lightningcss": "1.30.2", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz", + "integrity": "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==", + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-x64": "4.1.18", + "@tailwindcss/oxide-freebsd-x64": "4.1.18", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-x64-musl": "4.1.18", + "@tailwindcss/oxide-wasm32-wasi": "4.1.18", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz", + "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz", + "integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz", + "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz", + "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz", + "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz", + "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz", + "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", + "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz", + "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz", + "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.0", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", + "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz", + "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.18.tgz", + "integrity": "sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA==", + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.1.18", + "@tailwindcss/oxide": "4.1.18", + "tailwindcss": "4.1.18" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", + "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.2.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.2.tgz", + "integrity": "sha512-BkmoP5/FhRYek5izySdkOneRyXYN35I860MFAGupTdebyE66uZaR+bXLHq8k4DirE5DwQi3NuhvRU1jqTVwUrQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.13", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.13.tgz", + "integrity": "sha512-KkiJeU6VbYbUOp5ITMIc7kBfqlYkKA5KhEHVrGMmUUMt7NeaZg65ojdPk+FtNrBAOXNVM5QM72jnADjM+XVRAQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", + "license": "MIT" + }, + "node_modules/@vitejs/plugin-react": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.3.tgz", + "integrity": "sha512-NVUnA6gQCl8jfoYqKqQU5Clv0aPw14KkZYCsX6T9Lfu9slI0LOU10OTwFHS/WmptsMMpshNd/1tuWsHQ2Uk+cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.29.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-rc.2", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.18.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "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, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", + "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001769", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz", + "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==", + "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" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/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, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.286", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", + "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", + "dev": true, + "license": "ISC" + }, + "node_modules/enhanced-resolve": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", + "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-toolkit": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.44.0.tgz", + "integrity": "sha512-6penXeZalaV88MM3cGkFZZfOoLGWshWWfdy0tWw/RlVVyhvMaWSBTOvXNeiW3e5FwdS5ePW0LGEu17zT139ktg==", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks" + ] + }, + "node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.2", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", + "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.26", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.26.tgz", + "integrity": "sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "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, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "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, + "license": "BSD-2-Clause", + "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, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/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, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "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, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "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==", + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immer": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz", + "integrity": "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "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, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-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, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/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, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "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, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "MIT" + }, + "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, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.563.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.563.0.tgz", + "integrity": "sha512-8dXPB2GI4dI8jV4MgUDGBeLdGk8ekfqVZ0BdLcrRzocGgG75ltNEmWS+gE7uokKF/0oSUuczNDT+g9hFJ23FkA==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "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, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "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/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, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.4" + } + }, + "node_modules/react-is": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.4.tgz", + "integrity": "sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA==", + "license": "MIT", + "peer": true + }, + "node_modules/react-redux": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", + "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", + "license": "MIT", + "dependencies": { + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25 || ^19", + "react": "^18.0 || ^19", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, + "node_modules/react-refresh": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", + "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.13.0.tgz", + "integrity": "sha512-PZgus8ETambRT17BUm/LL8lX3Of+oiLaPuVTRH3l1eLvSPpKO3AvhAEb5N7ihAFZQrYDqkvvWfFh9p0z9VsjLw==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.13.0.tgz", + "integrity": "sha512-5CO/l5Yahi2SKC6rGZ+HDEjpjkGaG/ncEP7eWFTvFxbHP8yeeI0PxTDjimtpXYlR3b3i9/WIL4VJttPrESIf2g==", + "license": "MIT", + "dependencies": { + "react-router": "7.13.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/recharts": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.7.0.tgz", + "integrity": "sha512-l2VCsy3XXeraxIID9fx23eCb6iCBsxUQDnE8tWm6DFdszVAO7WVY/ChAD9wVit01y6B2PMupYiMmQwhgPHc9Ew==", + "license": "MIT", + "workspaces": [ + "www" + ], + "dependencies": { + "@reduxjs/toolkit": "1.x.x || 2.x.x", + "clsx": "^2.1.1", + "decimal.js-light": "^2.5.1", + "es-toolkit": "^1.39.3", + "eventemitter3": "^5.0.1", + "immer": "^10.1.1", + "react-redux": "8.x.x || 9.x.x", + "reselect": "5.1.1", + "tiny-invariant": "^1.3.3", + "use-sync-external-store": "^1.2.2", + "victory-vendor": "^37.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", + "license": "MIT" + }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "license": "MIT", + "peerDependencies": { + "redux": "^5.0.0" + } + }, + "node_modules/reselect": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", + "license": "MIT" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rollup": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", + "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.57.1", + "@rollup/rollup-android-arm64": "4.57.1", + "@rollup/rollup-darwin-arm64": "4.57.1", + "@rollup/rollup-darwin-x64": "4.57.1", + "@rollup/rollup-freebsd-arm64": "4.57.1", + "@rollup/rollup-freebsd-x64": "4.57.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", + "@rollup/rollup-linux-arm-musleabihf": "4.57.1", + "@rollup/rollup-linux-arm64-gnu": "4.57.1", + "@rollup/rollup-linux-arm64-musl": "4.57.1", + "@rollup/rollup-linux-loong64-gnu": "4.57.1", + "@rollup/rollup-linux-loong64-musl": "4.57.1", + "@rollup/rollup-linux-ppc64-gnu": "4.57.1", + "@rollup/rollup-linux-ppc64-musl": "4.57.1", + "@rollup/rollup-linux-riscv64-gnu": "4.57.1", + "@rollup/rollup-linux-riscv64-musl": "4.57.1", + "@rollup/rollup-linux-s390x-gnu": "4.57.1", + "@rollup/rollup-linux-x64-gnu": "4.57.1", + "@rollup/rollup-linux-x64-musl": "4.57.1", + "@rollup/rollup-openbsd-x64": "4.57.1", + "@rollup/rollup-openharmony-arm64": "4.57.1", + "@rollup/rollup-win32-arm64-msvc": "4.57.1", + "@rollup/rollup-win32-ia32-msvc": "4.57.1", + "@rollup/rollup-win32-x64-gnu": "4.57.1", + "@rollup/rollup-win32-x64-msvc": "4.57.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", + "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "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, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.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, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/victory-vendor": { + "version": "37.3.6", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz", + "integrity": "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==", + "license": "MIT AND ISC", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, + "node_modules/vite": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..1010c95 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,35 @@ +{ + "name": "frontend", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@tailwindcss/vite": "^4.1.18", + "axios": "^1.13.5", + "lucide-react": "^0.563.0", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "react-router-dom": "^7.13.0", + "recharts": "^3.7.0", + "tailwindcss": "^4.1.18" + }, + "devDependencies": { + "@eslint/js": "^9.39.1", + "@types/node": "^25.2.2", + "@types/react": "^19.2.7", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^5.1.1", + "eslint": "^9.39.1", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.4.24", + "globals": "^16.5.0", + "typescript": "^5.9.3", + "vite": "^7.3.1" + } +} diff --git a/frontend/public/favicon.svg b/frontend/public/favicon.svg new file mode 100644 index 0000000..8919cca --- /dev/null +++ b/frontend/public/favicon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/frontend/public/vite.svg b/frontend/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/frontend/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx new file mode 100644 index 0000000..9d7bd66 --- /dev/null +++ b/frontend/src/App.tsx @@ -0,0 +1,39 @@ +import { Routes, Route, Navigate } from 'react-router-dom' +import Landing from './pages/Landing' +import Login from './pages/Login' +import Layout from './components/Layout' +import Dashboard from './pages/Dashboard' +import Demandas from './pages/Demandas' +import Orcamentos from './pages/Orcamentos' +import OrdensServico from './pages/OrdensServico' +import Fornecedores from './pages/Fornecedores' +import Relatorios from './pages/Relatorios' +import Usuarios from './pages/Usuarios' + +interface PrivateRouteProps { + children: React.ReactNode; +} + +function PrivateRoute({ children }: PrivateRouteProps) { + const token = localStorage.getItem('token') + return token ? <>{children} : +} + +export default function App() { + return ( + + } /> + } /> + }> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + } /> + + ) +} diff --git a/frontend/src/assets/react.svg b/frontend/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/frontend/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/components/Layout.tsx b/frontend/src/components/Layout.tsx new file mode 100644 index 0000000..c71ccfc --- /dev/null +++ b/frontend/src/components/Layout.tsx @@ -0,0 +1,255 @@ +import { useState, useEffect } from 'react' +import { Outlet, NavLink, useNavigate, useLocation } from 'react-router-dom' +import { + LayoutDashboard, + FileText, + Wallet, + ClipboardList, + Building2, + BarChart3, + Users, + LogOut, + Menu, + X, + Flame, + ChevronLeft, + Bell, + Search +} from 'lucide-react' +import { User } from '../types' + +interface NavItem { + path: string; + label: string; + icon: React.ReactNode; + adminOnly?: boolean; +} + +const navItems: NavItem[] = [ + { path: '/app', label: 'Dashboard', icon: }, + { path: '/app/demandas', label: 'Demandas', icon: }, + { path: '/app/orcamentos', label: 'Orçamentos', icon: }, + { path: '/app/ordens-servico', label: 'Ordens de Serviço', icon: }, + { path: '/app/fornecedores', label: 'Fornecedores', icon: }, + { path: '/app/relatorios', label: 'Relatórios', icon: }, + { path: '/app/usuarios', label: 'Usuários', icon: , adminOnly: true }, +] + +export default function Layout() { + const [sidebarOpen, setSidebarOpen] = useState(true) + const [mobileMenuOpen, setMobileMenuOpen] = useState(false) + const [user, setUser] = useState(null) + const navigate = useNavigate() + const location = useLocation() + + useEffect(() => { + const userData = localStorage.getItem('user') + if (userData) { + setUser(JSON.parse(userData)) + } + }, []) + + const handleLogout = () => { + localStorage.removeItem('token') + localStorage.removeItem('user') + navigate('/login') + } + + const isAdmin = user?.perfil?.toLowerCase() === 'admin' || user?.perfil?.toLowerCase() === 'administrador' + + const filteredNavItems = navItems.filter(item => !item.adminOnly || isAdmin) + + return ( +
+ {/* Desktop Sidebar */} + + + {/* Mobile Menu Overlay */} + {mobileMenuOpen && ( +
setMobileMenuOpen(false)} + /> + )} + + {/* Mobile Sidebar */} + + + {/* Main Content */} +
+ {/* Header */} +
+
+
+ +
+ + +
+
+ +
+ +
+
+ + {user?.nome?.charAt(0).toUpperCase() || 'U'} + +
+ {user?.nome?.split(' ')[0] || 'Usuário'} +
+
+
+
+ + {/* Page Content */} +
+ +
+
+
+ ) +} diff --git a/frontend/src/index.css b/frontend/src/index.css new file mode 100644 index 0000000..0e2e7e9 --- /dev/null +++ b/frontend/src/index.css @@ -0,0 +1,282 @@ +@import "tailwindcss"; + +@theme { + --color-primary: #E65100; + --color-primary-dark: #BF360C; + --color-secondary: #1A237E; + --color-secondary-light: #3949AB; + --color-accent: #FF8F00; + --color-accent-light: #FFB300; + --color-text: #212121; + --color-gray: #757575; + --color-gray-light: #9E9E9E; + --color-card: #FAFAFA; + --color-border: #E0E0E0; + --font-family-sans: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; +} + +* { + box-sizing: border-box; +} + +html { + scroll-behavior: smooth; +} + +body { + font-family: var(--font-family-sans); + background-color: #FFFFFF; + color: var(--color-text); + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* Custom scrollbar */ +::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +::-webkit-scrollbar-track { + background: #F5F5F5; +} + +::-webkit-scrollbar-thumb { + background: #BDBDBD; + border-radius: 4px; +} + +::-webkit-scrollbar-thumb:hover { + background: #9E9E9E; +} + +/* Animations */ +@keyframes fade-in { + from { opacity: 0; transform: translateY(10px); } + to { opacity: 1; transform: translateY(0); } +} + +@keyframes slide-in-left { + from { opacity: 0; transform: translateX(-20px); } + to { opacity: 1; transform: translateX(0); } +} + +@keyframes pulse-glow { + 0%, 100% { box-shadow: 0 0 20px rgba(230, 81, 0, 0.3); } + 50% { box-shadow: 0 0 40px rgba(230, 81, 0, 0.5); } +} + +@keyframes shimmer { + 0% { background-position: -200% 0; } + 100% { background-position: 200% 0; } +} + +.animate-fade-in { + animation: fade-in 0.4s ease-out forwards; +} + +.animate-slide-in-left { + animation: slide-in-left 0.3s ease-out forwards; +} + +.animate-pulse-glow { + animation: pulse-glow 2s ease-in-out infinite; +} + +/* Button styles */ +.btn-primary { + background: linear-gradient(to right, var(--color-primary), var(--color-accent)); + color: white; + font-weight: 600; + border-radius: 0.75rem; + padding: 0.75rem 1.5rem; + transition: all 0.2s; +} + +.btn-primary:hover { + box-shadow: 0 10px 15px -3px rgba(230, 81, 0, 0.3); + transform: translateY(-2px); +} + +.btn-primary:active { + transform: translateY(0); +} + +.btn-primary:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.btn-secondary { + background-color: var(--color-secondary); + color: white; + font-weight: 600; + border-radius: 0.75rem; + padding: 0.75rem 1.5rem; + transition: all 0.2s; +} + +.btn-secondary:hover { + background-color: var(--color-secondary-light); + box-shadow: 0 10px 15px -3px rgba(26, 35, 126, 0.2); + transform: translateY(-2px); +} + +.btn-outline { + border: 2px solid var(--color-primary); + color: var(--color-primary); + font-weight: 600; + border-radius: 0.75rem; + padding: 0.75rem 1.5rem; + transition: all 0.2s; + background: transparent; +} + +.btn-outline:hover { + background-color: var(--color-primary); + color: white; +} + +.btn-ghost { + color: var(--color-gray); + font-weight: 500; + border-radius: 0.75rem; + padding: 0.5rem 1rem; + transition: all 0.2s; + background: transparent; +} + +.btn-ghost:hover { + background-color: #F5F5F5; + color: var(--color-text); +} + +/* Input styles */ +.input-field { + width: 100%; + padding: 0.75rem 1rem; + border-radius: 0.75rem; + border: 1px solid var(--color-border); + background-color: white; + color: var(--color-text); + transition: all 0.2s; +} + +.input-field::placeholder { + color: var(--color-gray-light); +} + +.input-field:focus { + outline: none; + ring: 2px; + ring-color: rgba(230, 81, 0, 0.2); + border-color: var(--color-primary); +} + +/* Card styles */ +.card { + background-color: white; + border-radius: 1rem; + border: 1px solid var(--color-border); + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); + padding: 1.5rem; + transition: all 0.2s; +} + +.card:hover { + box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1); +} + +.card-hover { + background-color: white; + border-radius: 1rem; + border: 1px solid var(--color-border); + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); + padding: 1.5rem; + transition: all 0.2s; + cursor: pointer; +} + +.card-hover:hover { + border-color: rgba(230, 81, 0, 0.3); + transform: translateY(-4px); + box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1); +} + +/* Badge styles */ +.badge { + display: inline-flex; + align-items: center; + padding: 0.25rem 0.75rem; + border-radius: 9999px; + font-size: 0.75rem; + font-weight: 600; +} + +.badge-success { + background-color: #DCFCE7; + color: #15803D; +} + +.badge-warning { + background-color: #FEF3C7; + color: #B45309; +} + +.badge-error { + background-color: #FEE2E2; + color: #DC2626; +} + +.badge-info { + background-color: #DBEAFE; + color: #1D4ED8; +} + +.badge-neutral { + background-color: #F3F4F6; + color: #4B5563; +} + +/* Table styles */ +.table-container { + overflow-x: auto; + border-radius: 0.75rem; + border: 1px solid var(--color-border); +} + +.table-header { + background-color: var(--color-card); + text-align: left; + font-size: 0.875rem; + font-weight: 600; + color: var(--color-gray); + text-transform: uppercase; + letter-spacing: 0.05em; +} + +.table-row { + border-bottom: 1px solid var(--color-border); + transition: background-color 0.15s; +} + +.table-row:last-child { + border-bottom: none; +} + +.table-row:hover { + background-color: rgba(250, 250, 250, 0.5); +} + +.table-cell { + padding: 0.75rem 1rem; + font-size: 0.875rem; + color: var(--color-text); +} + +/* Skeleton loading */ +.skeleton { + background: linear-gradient(to right, #E5E7EB, #F3F4F6, #E5E7EB); + background-size: 200% 100%; + animation: shimmer 1.5s infinite; +} diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx new file mode 100644 index 0000000..fa94fac --- /dev/null +++ b/frontend/src/main.tsx @@ -0,0 +1,13 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import { BrowserRouter } from 'react-router-dom' +import App from './App' +import './index.css' + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + + + , +) diff --git a/frontend/src/pages/Dashboard.tsx b/frontend/src/pages/Dashboard.tsx new file mode 100644 index 0000000..58bf14c --- /dev/null +++ b/frontend/src/pages/Dashboard.tsx @@ -0,0 +1,297 @@ +import { useState, useEffect } from 'react' +import { + Wallet, + TrendingUp, + TrendingDown, + Clock, + FileText, + Building2, + CheckCircle2, + AlertCircle, + ArrowUpRight, + Loader2 +} from 'lucide-react' +import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, PieChart, Pie, Cell, Legend } from 'recharts' +import api from '../services/api' +import { User } from '../types' + +interface StatsCard { + title: string; + value: string | number; + change?: string; + changeType?: 'positive' | 'negative' | 'neutral'; + icon: React.ReactNode; + color: string; +} + +const monthlyData = [ + { name: 'Jan', previsto: 4000, realizado: 3800 }, + { name: 'Fev', previsto: 3500, realizado: 3200 }, + { name: 'Mar', previsto: 4200, realizado: 4100 }, + { name: 'Abr', previsto: 3800, realizado: 3900 }, + { name: 'Mai', previsto: 4500, realizado: 4200 }, + { name: 'Jun', previsto: 4000, realizado: 3700 }, +] + +const categoryData = [ + { name: 'Manutenção', value: 35, color: '#E65100' }, + { name: 'Limpeza', value: 25, color: '#1A237E' }, + { name: 'Segurança', value: 20, color: '#FF8F00' }, + { name: 'Outros', value: 20, color: '#757575' }, +] + +const recentActivities = [ + { id: 1, action: 'Nova demanda criada', description: 'Manutenção ar condicionado - Bloco A', time: 'Há 2 horas', status: 'pending' }, + { id: 2, action: 'Ordem de serviço aprovada', description: 'OS-2024-0156 - Troca de lâmpadas', time: 'Há 4 horas', status: 'success' }, + { id: 3, action: 'Fornecedor cadastrado', description: 'Tech Solutions Ltda', time: 'Há 6 horas', status: 'info' }, + { id: 4, action: 'Orçamento atualizado', description: 'Categoria: Manutenção Predial', time: 'Há 8 horas', status: 'warning' }, +] + +export default function Dashboard() { + const [loading, setLoading] = useState(true) + const [stats, setStats] = useState(null) + const [user, setUser] = useState(null) + + useEffect(() => { + const userData = localStorage.getItem('user') + if (userData) { + setUser(JSON.parse(userData)) + } + fetchDashboard() + }, []) + + const fetchDashboard = async () => { + try { + const { data } = await api.get('/dashboard') + setStats(data) + } catch (err) { + console.error('Error fetching dashboard:', err) + } finally { + setLoading(false) + } + } + + const statsCards: StatsCard[] = [ + { + title: 'Orçamento Total', + value: stats?.total_orcamento ? `${(stats.total_orcamento / 1000).toFixed(0)}K` : '0', + change: '+12%', + changeType: 'positive', + icon: , + color: 'from-primary to-accent' + }, + { + title: 'Total Gasto', + value: stats?.total_gasto ? `${(stats.total_gasto / 1000).toFixed(0)}K` : '0', + change: '-5%', + changeType: 'positive', + icon: , + color: 'from-secondary to-secondary-light' + }, + { + title: 'Economia', + value: stats?.economia ? `${(stats.economia / 1000).toFixed(0)}K` : '0', + change: '+8%', + changeType: 'positive', + icon: , + color: 'from-green-500 to-emerald-500' + }, + { + title: 'Pendências', + value: stats?.pendencias || stats?.demandas_pendentes || '0', + change: '-3', + changeType: 'neutral', + icon: , + color: 'from-amber-500 to-orange-500' + }, + ] + + if (loading) { + return ( +
+ +
+ ) + } + + return ( +
+ {/* Welcome header */} +
+
+

+ Olá, {user?.nome?.split(' ')[0] || 'Usuário'}! 👋 +

+

Aqui está o resumo das suas operações de facilities.

+
+
+ Última atualização: + Agora +
+
+ + {/* Stats Cards */} +
+ {statsCards.map((card, index) => ( +
+
+
+ {card.icon} +
+ {card.change && ( + + {card.change} + + )} +
+

{card.title}

+

{card.value}

+
+ ))} +
+ + {/* Charts Row */} +
+ {/* Bar Chart */} +
+
+
+

Orçamento vs Realizado

+

Comparativo mensal

+
+ +
+
+ + + + + + + + + + +
+
+ + {/* Pie Chart */} +
+
+

Por Categoria

+

Distribuição de gastos

+
+
+ + + + {categoryData.map((entry, index) => ( + + ))} + + {value}} + /> + + +
+
+
+ + {/* Quick Stats & Activity */} +
+ {/* Quick Stats */} +
+

Resumo Rápido

+
+
+
+
+ +
+ Demandas Abertas +
+ {stats?.demandas_pendentes || 12} +
+
+
+
+ +
+ OS Concluídas +
+ {stats?.ordens_concluidas || 48} +
+
+
+
+ +
+ Fornecedores Ativos +
+ {stats?.fornecedores_ativos || 15} +
+
+
+ + {/* Recent Activity */} +
+
+

Atividade Recente

+ +
+
+ {recentActivities.map((activity) => ( +
+
+ {activity.status === 'success' ? : + activity.status === 'warning' ? : + activity.status === 'info' ? : + } +
+
+

{activity.action}

+

{activity.description}

+
+ {activity.time} +
+ ))} +
+
+
+
+ ) +} diff --git a/frontend/src/pages/Demandas.tsx b/frontend/src/pages/Demandas.tsx new file mode 100644 index 0000000..3661b34 --- /dev/null +++ b/frontend/src/pages/Demandas.tsx @@ -0,0 +1,310 @@ +import { useState, useEffect } from 'react' +import { + FileText, + Search, + Plus, + Filter, + Eye, + Edit2, + Trash2, + X, + Loader2, + AlertCircle, + Clock, + CheckCircle2, + ChevronDown +} from 'lucide-react' +import api from '../services/api' +import { Demanda } from '../types' + +const statusConfig: Record = { + 'pendente': { label: 'Pendente', class: 'badge-warning', icon: }, + 'em_analise': { label: 'Em Análise', class: 'badge-info', icon: }, + 'aprovada': { label: 'Aprovada', class: 'badge-success', icon: }, + 'rejeitada': { label: 'Rejeitada', class: 'badge-error', icon: }, + 'concluida': { label: 'Concluída', class: 'badge-neutral', icon: }, +} + +const prioridadeConfig: Record = { + 'baixa': { label: 'Baixa', class: 'text-gray bg-gray-100' }, + 'media': { label: 'Média', class: 'text-amber-700 bg-amber-100' }, + 'alta': { label: 'Alta', class: 'text-red-700 bg-red-100' }, + 'urgente': { label: 'Urgente', class: 'text-red-700 bg-red-200 animate-pulse' }, +} + +const mockDemandas: Demanda[] = [ + { id: 1, titulo: 'Manutenção Ar Condicionado', descricao: 'Ar condicionado do bloco A não está funcionando', status: 'pendente', prioridade: 'alta', solicitante_id: 1, solicitante_nome: 'Maria Silva', data_criacao: '2024-01-15' }, + { id: 2, titulo: 'Troca de Lâmpadas', descricao: 'Lâmpadas queimadas no corredor do 3º andar', status: 'em_analise', prioridade: 'media', solicitante_id: 2, solicitante_nome: 'João Santos', data_criacao: '2024-01-14' }, + { id: 3, titulo: 'Vazamento Banheiro', descricao: 'Vazamento na torneira do banheiro masculino', status: 'aprovada', prioridade: 'urgente', solicitante_id: 3, solicitante_nome: 'Ana Oliveira', data_criacao: '2024-01-13' }, + { id: 4, titulo: 'Pintura Sala Reunião', descricao: 'Paredes da sala de reunião precisam de pintura', status: 'concluida', prioridade: 'baixa', solicitante_id: 1, solicitante_nome: 'Maria Silva', data_criacao: '2024-01-10' }, + { id: 5, titulo: 'Reparo Elevador', descricao: 'Elevador social com barulho estranho', status: 'pendente', prioridade: 'alta', solicitante_id: 4, solicitante_nome: 'Carlos Lima', data_criacao: '2024-01-16' }, +] + +export default function Demandas() { + const [loading, setLoading] = useState(true) + const [demandas, setDemandas] = useState([]) + const [searchTerm, setSearchTerm] = useState('') + const [filterStatus, setFilterStatus] = useState('todos') + const [showModal, setShowModal] = useState(false) + const [selectedDemanda, setSelectedDemanda] = useState(null) + const [formData, setFormData] = useState({ titulo: '', descricao: '', prioridade: 'media' }) + + useEffect(() => { + fetchDemandas() + }, []) + + const fetchDemandas = async () => { + try { + const { data } = await api.get('/demandas') + setDemandas(data.length > 0 ? data : mockDemandas) + } catch (err) { + console.error('Error fetching demandas:', err) + setDemandas(mockDemandas) + } finally { + setLoading(false) + } + } + + const filteredDemandas = demandas.filter(demanda => { + const matchesSearch = demanda.titulo.toLowerCase().includes(searchTerm.toLowerCase()) || + demanda.descricao.toLowerCase().includes(searchTerm.toLowerCase()) + const matchesStatus = filterStatus === 'todos' || demanda.status === filterStatus + return matchesSearch && matchesStatus + }) + + const handleOpenModal = (demanda?: Demanda) => { + if (demanda) { + setSelectedDemanda(demanda) + setFormData({ titulo: demanda.titulo, descricao: demanda.descricao, prioridade: demanda.prioridade }) + } else { + setSelectedDemanda(null) + setFormData({ titulo: '', descricao: '', prioridade: 'media' }) + } + setShowModal(true) + } + + const handleCloseModal = () => { + setShowModal(false) + setSelectedDemanda(null) + setFormData({ titulo: '', descricao: '', prioridade: 'media' }) + } + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault() + // Mock save + if (selectedDemanda) { + setDemandas(demandas.map(d => d.id === selectedDemanda.id ? { ...d, ...formData } : d)) + } else { + const newDemanda: Demanda = { + id: Date.now(), + ...formData, + status: 'pendente', + solicitante_id: 1, + solicitante_nome: 'Usuário Atual', + data_criacao: new Date().toISOString().split('T')[0] + } + setDemandas([newDemanda, ...demandas]) + } + handleCloseModal() + } + + const formatDate = (dateStr: string) => { + return new Date(dateStr).toLocaleDateString('pt-BR') + } + + if (loading) { + return ( +
+ +
+ ) + } + + return ( +
+ {/* Header */} +
+
+

Demandas

+

Gerencie as solicitações de facilities

+
+ +
+ + {/* Stats */} +
+ {Object.entries(statusConfig).slice(0, 4).map(([key, config]) => { + const count = demandas.filter(d => d.status === key).length + return ( + + ) + })} +
+ + {/* Filters */} +
+
+
+ + setSearchTerm(e.target.value)} + className="input-field pl-12" + /> +
+
+ + +
+
+
+ + {/* Demandas List */} +
+ {filteredDemandas.map((demanda) => ( +
+
+
+
+
+ +
+
+
+

{demanda.titulo}

+ + {statusConfig[demanda.status]?.icon} + {statusConfig[demanda.status]?.label || demanda.status} + + + {prioridadeConfig[demanda.prioridade]?.label || demanda.prioridade} + +
+

{demanda.descricao}

+
+ Solicitante: {demanda.solicitante_nome} + + {formatDate(demanda.data_criacao)} +
+
+
+
+
+ + + +
+
+
+ ))} + + {filteredDemandas.length === 0 && ( +
+ +

Nenhuma demanda encontrada

+
+ )} +
+ + {/* Modal */} + {showModal && ( +
+
+
+

+ {selectedDemanda ? 'Editar Demanda' : 'Nova Demanda'} +

+ +
+
+
+ + setFormData({ ...formData, titulo: e.target.value })} + className="input-field" + placeholder="Título da demanda" + required + /> +
+
+ +