From 4122dc6f3b81e74fbf2d5f2aa7691e4d68b91e7a Mon Sep 17 00:00:00 2001 From: bigtux Date: Mon, 9 Feb 2026 09:10:15 -0300 Subject: [PATCH] DuOrigin v2 - React + NestJS + Prisma + EUDR API Integration --- .env.example | 17 + .gitignore | 42 +- backend/.env.example | 33 + backend/nest-cli.json | 8 + backend/package-lock.json | 10668 ++++++++++++++++ backend/package.json | 85 + backend/prisma/schema.prisma | 133 + backend/prisma/seed.ts | 328 + backend/src/app.module.ts | 29 + backend/src/auth/auth.controller.ts | 38 + backend/src/auth/auth.module.ts | 29 + backend/src/auth/auth.service.ts | 107 + backend/src/auth/dto/login.dto.ts | 13 + backend/src/auth/dto/registro.dto.ts | 24 + backend/src/auth/jwt-auth.guard.ts | 30 + backend/src/auth/jwt.strategy.ts | 41 + backend/src/auth/roles.decorator.ts | 5 + backend/src/auth/roles.guard.ts | 29 + .../src/avaliacoes/avaliacoes.controller.ts | 92 + backend/src/avaliacoes/avaliacoes.module.ts | 10 + backend/src/avaliacoes/avaliacoes.service.ts | 252 + .../avaliacoes/dto/create-avaliacao.dto.ts | 24 + .../avaliacoes/dto/update-avaliacao.dto.ts | 4 + backend/src/dashboard/dashboard.controller.ts | 19 + backend/src/dashboard/dashboard.module.ts | 9 + backend/src/dashboard/dashboard.service.ts | 137 + .../src/documentos/documentos.controller.ts | 98 + backend/src/documentos/documentos.module.ts | 10 + backend/src/documentos/documentos.service.ts | 168 + .../src/empresas/dto/create-empresa.dto.ts | 69 + .../src/empresas/dto/update-empresa.dto.ts | 4 + backend/src/empresas/empresas.controller.ts | 61 + backend/src/empresas/empresas.module.ts | 10 + backend/src/empresas/empresas.service.ts | 107 + backend/src/eudr-api/dto/amend-dds.dto.ts | 58 + backend/src/eudr-api/dto/common.dto.ts | 196 + backend/src/eudr-api/dto/get-dds-data.dto.ts | 86 + backend/src/eudr-api/dto/get-dds-info.dto.ts | 54 + backend/src/eudr-api/dto/index.ts | 7 + backend/src/eudr-api/dto/retract-dds.dto.ts | 31 + backend/src/eudr-api/dto/submit-dds.dto.ts | 60 + backend/src/eudr-api/eudr-api.controller.ts | 137 + backend/src/eudr-api/eudr-api.module.ts | 12 + backend/src/eudr-api/eudr-api.service.ts | 584 + backend/src/eudr-api/index.ts | 4 + backend/src/eudr-api/soap/index.ts | 2 + backend/src/eudr-api/soap/xml-builder.ts | 299 + backend/src/eudr-api/soap/xml-parser.ts | 280 + .../eudr-api/tests/eudr-api.service.spec.ts | 379 + backend/src/main.ts | 55 + backend/src/prisma/prisma.module.ts | 9 + backend/src/prisma/prisma.service.ts | 13 + .../dto/create-propriedade.dto.ts | 79 + .../dto/update-propriedade.dto.ts | 4 + .../propriedades/propriedades.controller.ts | 68 + .../src/propriedades/propriedades.module.ts | 10 + .../src/propriedades/propriedades.service.ts | 120 + backend/src/types/express.d.ts | 15 + backend/src/users/dto/create-user.dto.ts | 29 + backend/src/users/dto/update-user.dto.ts | 4 + backend/src/users/users.controller.ts | 69 + backend/src/users/users.module.ts | 10 + backend/src/users/users.service.ts | 129 + backend/tsconfig.json | 27 + docs/API-ROUTES.md | 209 + docs/EUDR-API-INTEGRATION.md | 527 + frontend/.gitignore | 24 + frontend/README.md | 73 + frontend/eslint.config.js | 23 + frontend/index.html | 17 + frontend/package-lock.json | 5510 ++++++++ frontend/package.json | 41 + frontend/postcss.config.js | 6 + frontend/public/logo-duorigin.jpg | Bin 0 -> 33526 bytes frontend/public/vite.svg | 1 + frontend/src/App.tsx | 77 + frontend/src/api/client.ts | 37 + frontend/src/assets/react.svg | 1 + frontend/src/components/DDSModal.tsx | 162 + frontend/src/components/DashboardLayout.tsx | 13 + frontend/src/components/DataTable.tsx | 109 + frontend/src/components/Footer.tsx | 7 + frontend/src/components/Modal.tsx | 66 + frontend/src/components/Navbar.tsx | 19 + frontend/src/components/ProtectedRoute.tsx | 31 + frontend/src/components/Sidebar.tsx | 100 + frontend/src/components/StatsCard.tsx | 30 + frontend/src/contexts/AuthContext.tsx | 83 + frontend/src/hooks/useApi.ts | 90 + frontend/src/hooks/useAuth.ts | 12 + frontend/src/index.css | 60 + frontend/src/main.tsx | 10 + frontend/src/pages/AvaliacaoDetail.tsx | 245 + frontend/src/pages/Avaliacoes.tsx | 224 + frontend/src/pages/Dashboard.tsx | 179 + frontend/src/pages/Documentos.tsx | 296 + frontend/src/pages/EmpresaForm.tsx | 298 + frontend/src/pages/Empresas.tsx | 188 + frontend/src/pages/Landing.tsx | 258 + frontend/src/pages/Login.tsx | 157 + frontend/src/pages/PropriedadeForm.tsx | 330 + frontend/src/pages/Propriedades.tsx | 192 + frontend/src/pages/Registro.tsx | 173 + frontend/src/pages/Usuarios.tsx | 391 + frontend/src/types/index.ts | 99 + frontend/tailwind.config.js | 28 + frontend/tsconfig.app.json | 28 + frontend/tsconfig.json | 30 + frontend/tsconfig.node.json | 26 + frontend/tsconfig.tsbuildinfo | 1 + frontend/vite.config.ts | 22 + next-env.d.ts | 5 + next.config.ts | 12 + package-lock.json | 953 +- package.json | 29 +- prisma/README.md | 192 + prisma/schema.prisma | 195 + prisma/seed.ts | 104 + public/logo-duorigin.jpg | Bin 0 -> 33526 bytes src/app/(dashboard)/areas/page.tsx | 84 + src/app/(dashboard)/audit/page.tsx | 76 + src/app/(dashboard)/companies/page.tsx | 104 + src/app/(dashboard)/dashboard/page.tsx | 127 + src/app/(dashboard)/dds/page.tsx | 166 + src/app/(dashboard)/due-diligence/page.tsx | 137 + src/app/(dashboard)/layout.tsx | 35 + src/app/(dashboard)/lots/page.tsx | 169 + src/app/(dashboard)/producers/page.tsx | 127 + src/app/(dashboard)/products/page.tsx | 107 + src/app/(dashboard)/settings/page.tsx | 68 + src/app/api/areas/[id]/route.ts | 42 + src/app/api/areas/route.ts | 52 + src/app/api/audit/route.ts | 26 + src/app/api/auth/[...nextauth]/route.ts | 6 + src/app/api/auth/login/route.ts | 57 + src/app/api/auth/me/route.ts | 43 + src/app/api/auth/register/route.ts | 35 + src/app/api/auth/registro/route.ts | 67 + .../api/avaliacoes/[id]/gerar-dds/route.ts | 133 + src/app/api/avaliacoes/[id]/route.ts | 163 + src/app/api/avaliacoes/route.ts | 136 + src/app/api/companies/[id]/route.ts | 42 + src/app/api/companies/route.ts | 25 + src/app/api/dashboard/stats/route.ts | 100 + src/app/api/dds/[id]/route.ts | 42 + src/app/api/dds/[id]/submit/route.ts | 41 + src/app/api/dds/route.ts | 42 + src/app/api/empresas/[id]/route.ts | 162 + src/app/api/empresas/route.ts | 104 + src/app/api/lots/[id]/route.ts | 42 + src/app/api/lots/route.ts | 26 + src/app/api/producers/[id]/route.ts | 42 + src/app/api/producers/route.ts | 26 + src/app/api/products/[id]/route.ts | 41 + src/app/api/products/route.ts | 25 + src/app/api/propriedades/[id]/route.ts | 162 + src/app/api/propriedades/route.ts | 112 + src/app/api/users/[id]/route.ts | 67 + src/app/api/users/route.ts | 22 + src/app/api/usuarios/[id]/route.ts | 192 + src/app/api/usuarios/route.ts | 53 + src/app/globals.css | 83 +- src/app/layout.tsx | 39 +- src/app/login/page.tsx | 115 + src/app/page.tsx | 189 +- src/lib/auth.ts | 83 + src/lib/password.ts | 11 + src/lib/prisma.ts | 11 + src/types/index.ts | 117 + tsconfig.tsbuildinfo | 1 + 170 files changed, 31333 insertions(+), 200 deletions(-) create mode 100644 .env.example create mode 100644 backend/.env.example create mode 100644 backend/nest-cli.json create mode 100644 backend/package-lock.json create mode 100644 backend/package.json create mode 100644 backend/prisma/schema.prisma create mode 100644 backend/prisma/seed.ts create mode 100644 backend/src/app.module.ts create mode 100644 backend/src/auth/auth.controller.ts create mode 100644 backend/src/auth/auth.module.ts create mode 100644 backend/src/auth/auth.service.ts create mode 100644 backend/src/auth/dto/login.dto.ts create mode 100644 backend/src/auth/dto/registro.dto.ts create mode 100644 backend/src/auth/jwt-auth.guard.ts create mode 100644 backend/src/auth/jwt.strategy.ts create mode 100644 backend/src/auth/roles.decorator.ts create mode 100644 backend/src/auth/roles.guard.ts create mode 100644 backend/src/avaliacoes/avaliacoes.controller.ts create mode 100644 backend/src/avaliacoes/avaliacoes.module.ts create mode 100644 backend/src/avaliacoes/avaliacoes.service.ts create mode 100644 backend/src/avaliacoes/dto/create-avaliacao.dto.ts create mode 100644 backend/src/avaliacoes/dto/update-avaliacao.dto.ts create mode 100644 backend/src/dashboard/dashboard.controller.ts create mode 100644 backend/src/dashboard/dashboard.module.ts create mode 100644 backend/src/dashboard/dashboard.service.ts create mode 100644 backend/src/documentos/documentos.controller.ts create mode 100644 backend/src/documentos/documentos.module.ts create mode 100644 backend/src/documentos/documentos.service.ts create mode 100644 backend/src/empresas/dto/create-empresa.dto.ts create mode 100644 backend/src/empresas/dto/update-empresa.dto.ts create mode 100644 backend/src/empresas/empresas.controller.ts create mode 100644 backend/src/empresas/empresas.module.ts create mode 100644 backend/src/empresas/empresas.service.ts create mode 100644 backend/src/eudr-api/dto/amend-dds.dto.ts create mode 100644 backend/src/eudr-api/dto/common.dto.ts create mode 100644 backend/src/eudr-api/dto/get-dds-data.dto.ts create mode 100644 backend/src/eudr-api/dto/get-dds-info.dto.ts create mode 100644 backend/src/eudr-api/dto/index.ts create mode 100644 backend/src/eudr-api/dto/retract-dds.dto.ts create mode 100644 backend/src/eudr-api/dto/submit-dds.dto.ts create mode 100644 backend/src/eudr-api/eudr-api.controller.ts create mode 100644 backend/src/eudr-api/eudr-api.module.ts create mode 100644 backend/src/eudr-api/eudr-api.service.ts create mode 100644 backend/src/eudr-api/index.ts create mode 100644 backend/src/eudr-api/soap/index.ts create mode 100644 backend/src/eudr-api/soap/xml-builder.ts create mode 100644 backend/src/eudr-api/soap/xml-parser.ts create mode 100644 backend/src/eudr-api/tests/eudr-api.service.spec.ts create mode 100644 backend/src/main.ts create mode 100644 backend/src/prisma/prisma.module.ts create mode 100644 backend/src/prisma/prisma.service.ts create mode 100644 backend/src/propriedades/dto/create-propriedade.dto.ts create mode 100644 backend/src/propriedades/dto/update-propriedade.dto.ts create mode 100644 backend/src/propriedades/propriedades.controller.ts create mode 100644 backend/src/propriedades/propriedades.module.ts create mode 100644 backend/src/propriedades/propriedades.service.ts create mode 100644 backend/src/types/express.d.ts create mode 100644 backend/src/users/dto/create-user.dto.ts create mode 100644 backend/src/users/dto/update-user.dto.ts create mode 100644 backend/src/users/users.controller.ts create mode 100644 backend/src/users/users.module.ts create mode 100644 backend/src/users/users.service.ts create mode 100644 backend/tsconfig.json create mode 100644 docs/API-ROUTES.md create mode 100644 docs/EUDR-API-INTEGRATION.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/postcss.config.js create mode 100644 frontend/public/logo-duorigin.jpg create mode 100644 frontend/public/vite.svg create mode 100644 frontend/src/App.tsx create mode 100644 frontend/src/api/client.ts create mode 100644 frontend/src/assets/react.svg create mode 100644 frontend/src/components/DDSModal.tsx create mode 100644 frontend/src/components/DashboardLayout.tsx create mode 100644 frontend/src/components/DataTable.tsx create mode 100644 frontend/src/components/Footer.tsx create mode 100644 frontend/src/components/Modal.tsx create mode 100644 frontend/src/components/Navbar.tsx create mode 100644 frontend/src/components/ProtectedRoute.tsx create mode 100644 frontend/src/components/Sidebar.tsx create mode 100644 frontend/src/components/StatsCard.tsx create mode 100644 frontend/src/contexts/AuthContext.tsx create mode 100644 frontend/src/hooks/useApi.ts create mode 100644 frontend/src/hooks/useAuth.ts create mode 100644 frontend/src/index.css create mode 100644 frontend/src/main.tsx create mode 100644 frontend/src/pages/AvaliacaoDetail.tsx create mode 100644 frontend/src/pages/Avaliacoes.tsx create mode 100644 frontend/src/pages/Dashboard.tsx create mode 100644 frontend/src/pages/Documentos.tsx create mode 100644 frontend/src/pages/EmpresaForm.tsx create mode 100644 frontend/src/pages/Empresas.tsx create mode 100644 frontend/src/pages/Landing.tsx create mode 100644 frontend/src/pages/Login.tsx create mode 100644 frontend/src/pages/PropriedadeForm.tsx create mode 100644 frontend/src/pages/Propriedades.tsx create mode 100644 frontend/src/pages/Registro.tsx create mode 100644 frontend/src/pages/Usuarios.tsx create mode 100644 frontend/src/types/index.ts create mode 100644 frontend/tailwind.config.js create mode 100644 frontend/tsconfig.app.json create mode 100644 frontend/tsconfig.json create mode 100644 frontend/tsconfig.node.json create mode 100644 frontend/tsconfig.tsbuildinfo create mode 100644 frontend/vite.config.ts create mode 100644 next-env.d.ts create mode 100644 next.config.ts create mode 100644 prisma/README.md create mode 100644 prisma/schema.prisma create mode 100644 prisma/seed.ts create mode 100644 public/logo-duorigin.jpg create mode 100644 src/app/(dashboard)/areas/page.tsx create mode 100644 src/app/(dashboard)/audit/page.tsx create mode 100644 src/app/(dashboard)/companies/page.tsx create mode 100644 src/app/(dashboard)/dashboard/page.tsx create mode 100644 src/app/(dashboard)/dds/page.tsx create mode 100644 src/app/(dashboard)/due-diligence/page.tsx create mode 100644 src/app/(dashboard)/layout.tsx create mode 100644 src/app/(dashboard)/lots/page.tsx create mode 100644 src/app/(dashboard)/producers/page.tsx create mode 100644 src/app/(dashboard)/products/page.tsx create mode 100644 src/app/(dashboard)/settings/page.tsx create mode 100644 src/app/api/areas/[id]/route.ts create mode 100644 src/app/api/areas/route.ts create mode 100644 src/app/api/audit/route.ts create mode 100644 src/app/api/auth/[...nextauth]/route.ts create mode 100644 src/app/api/auth/login/route.ts create mode 100644 src/app/api/auth/me/route.ts create mode 100644 src/app/api/auth/register/route.ts create mode 100644 src/app/api/auth/registro/route.ts create mode 100644 src/app/api/avaliacoes/[id]/gerar-dds/route.ts create mode 100644 src/app/api/avaliacoes/[id]/route.ts create mode 100644 src/app/api/avaliacoes/route.ts create mode 100644 src/app/api/companies/[id]/route.ts create mode 100644 src/app/api/companies/route.ts create mode 100644 src/app/api/dashboard/stats/route.ts create mode 100644 src/app/api/dds/[id]/route.ts create mode 100644 src/app/api/dds/[id]/submit/route.ts create mode 100644 src/app/api/dds/route.ts create mode 100644 src/app/api/empresas/[id]/route.ts create mode 100644 src/app/api/empresas/route.ts create mode 100644 src/app/api/lots/[id]/route.ts create mode 100644 src/app/api/lots/route.ts create mode 100644 src/app/api/producers/[id]/route.ts create mode 100644 src/app/api/producers/route.ts create mode 100644 src/app/api/products/[id]/route.ts create mode 100644 src/app/api/products/route.ts create mode 100644 src/app/api/propriedades/[id]/route.ts create mode 100644 src/app/api/propriedades/route.ts create mode 100644 src/app/api/users/[id]/route.ts create mode 100644 src/app/api/users/route.ts create mode 100644 src/app/api/usuarios/[id]/route.ts create mode 100644 src/app/api/usuarios/route.ts create mode 100644 src/app/login/page.tsx create mode 100644 src/lib/auth.ts create mode 100644 src/lib/password.ts create mode 100644 src/lib/prisma.ts create mode 100644 src/types/index.ts create mode 100644 tsconfig.tsbuildinfo diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..b9e0910 --- /dev/null +++ b/.env.example @@ -0,0 +1,17 @@ +# DuOrigin v2 Environment Variables +# Copy to .env and adjust values + +# Database (PostgreSQL) +# Via túnel SSH (dev local): localhost:5433 +# Produção: endereço real do servidor +DATABASE_URL="postgresql://duorigin:PASSWORD@localhost:5433/duorigin" + +# JWT Secret (generate a secure random string for production) +JWT_SECRET="your-secure-jwt-secret-here" + +# Next.js +NEXT_PUBLIC_API_URL="http://localhost:3000/api" + +# NextAuth (if using) +NEXTAUTH_URL="http://localhost:3000" +NEXTAUTH_SECRET="your-nextauth-secret-here" diff --git a/.gitignore b/.gitignore index fd3dbb5..8205664 100644 --- a/.gitignore +++ b/.gitignore @@ -1,36 +1,6 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js -.yarn/install-state.gz - -# testing -/coverage - -# next.js -/.next/ -/out/ - -# production -/build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# local env files -.env*.local - -# vercel -.vercel - -# typescript -*.tsbuildinfo -next-env.d.ts +node_modules/ +dist/ +.next/ +*.log +.env +.env.local diff --git a/backend/.env.example b/backend/.env.example new file mode 100644 index 0000000..89e132d --- /dev/null +++ b/backend/.env.example @@ -0,0 +1,33 @@ +DATABASE_URL=postgresql://user:password@localhost:5432/duorigin + +JWT_SECRET=your_jwt_secret_here +JWT_EXPIRES_IN=7d + +PORT=8100 + +# ============================================ +# EUDR API Configuration +# ============================================ + +# API URL - Use ACCEPTANCE for testing, PRODUCTION for live +# ACCEPTANCE: https://acceptance.eudr.webcloud.ec.europa.eu/tracesnt +# PRODUCTION: https://webgate.ec.europa.eu/tracesnt +EUDR_API_URL=https://acceptance.eudr.webcloud.ec.europa.eu/tracesnt + +# Web Service Client ID (default: eudr-test for ACCEPTANCE) +EUDR_WS_CLIENT_ID=eudr-test + +# EU Login credentials for the web service user +# Obtain these from TRACES NT after registering as operator +EUDR_USERNAME=your_eu_login_username +EUDR_AUTH_KEY=your_authentication_key + +# ============================================ +# How to obtain EUDR credentials: +# ============================================ +# 1. Register in TRACES NT (acceptance.eudr.webcloud.ec.europa.eu) +# 2. Create an Operator and User +# 3. Go to Edit Profile > Web Services Access +# 4. Click "Active" to enable Web Service access +# 5. Copy your Username and Authentication Key +# ============================================ 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..76855ec --- /dev/null +++ b/backend/package-lock.json @@ -0,0 +1,10668 @@ +{ + "name": "duorigin-v2-backend", + "version": "2.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "duorigin-v2-backend", + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@nestjs/common": "^10.4.15", + "@nestjs/config": "^3.3.0", + "@nestjs/core": "^10.4.15", + "@nestjs/jwt": "^10.2.0", + "@nestjs/mapped-types": "^2.0.6", + "@nestjs/passport": "^10.0.3", + "@nestjs/platform-express": "^10.4.15", + "@nestjs/swagger": "^8.1.0", + "@prisma/client": "^6.3.1", + "axios": "^1.7.9", + "bcrypt": "^5.1.1", + "class-transformer": "^0.5.1", + "class-validator": "^0.14.1", + "fast-xml-parser": "^4.5.1", + "multer": "^1.4.5-lts.1", + "passport": "^0.7.0", + "passport-jwt": "^4.0.1", + "reflect-metadata": "^0.2.2", + "rxjs": "^7.8.1" + }, + "devDependencies": { + "@nestjs/cli": "^10.4.9", + "@nestjs/schematics": "^10.2.3", + "@nestjs/testing": "^10.4.15", + "@types/bcrypt": "^5.0.2", + "@types/express": "^5.0.0", + "@types/jest": "^29.5.14", + "@types/multer": "^1.4.12", + "@types/node": "^22.10.7", + "@types/passport-jwt": "^4.0.1", + "@typescript-eslint/eslint-plugin": "^8.21.0", + "@typescript-eslint/parser": "^8.21.0", + "eslint": "^9.18.0", + "eslint-config-prettier": "^10.0.1", + "eslint-plugin-prettier": "^5.2.2", + "jest": "^29.7.0", + "prettier": "^3.4.2", + "prisma": "^6.3.1", + "source-map-support": "^0.5.21", + "ts-jest": "^29.2.5", + "ts-loader": "^9.5.1", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.7.3" + } + }, + "node_modules/@angular-devkit/core": { + "version": "17.3.11", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.11.tgz", + "integrity": "sha512-vTNDYNsLIWpYk2I969LMQFH29GTsLzxNk/0cLw5q56ARF0v5sIWfHYwGTS88jdDqIpuuettcSczbxeA7EuAmqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.1", + "picomatch": "4.0.1", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/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": "17.3.11", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.3.11.tgz", + "integrity": "sha512-I5wviiIqiFwar9Pdk30Lujk8FczEEc18i22A5c6Z9lbmhPQdTroDnEQdsfXjy404wPe8H62s0I15o4pmMGfTYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "17.3.11", + "jsonc-parser": "3.2.1", + "magic-string": "0.30.8", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/schematics-cli": { + "version": "17.3.11", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-17.3.11.tgz", + "integrity": "sha512-kcOMqp+PHAKkqRad7Zd7PbpqJ0LqLaNZdY1+k66lLWmkEBozgq8v4ASn/puPWf9Bo0HpCiK+EzLf0VHE8Z/y6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "17.3.11", + "@angular-devkit/schematics": "17.3.11", + "ansi-colors": "4.1.3", + "inquirer": "9.2.15", + "symbol-observable": "4.0.0", + "yargs-parser": "21.1.1" + }, + "bin": { + "schematics": "bin/schematics.js" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/schematics-cli/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@angular-devkit/schematics-cli/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/@angular-devkit/schematics-cli/node_modules/inquirer": { + "version": "9.2.15", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.15.tgz", + "integrity": "sha512-vI2w4zl/mDluHt9YEQ/543VTCwPKWiHzKtm9dM2V0NdFcqEexDAjUHzO1oA60HRNaVifGXXM1tRRNluLVHa0Kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ljharb/through": "^2.3.12", + "ansi-escapes": "^4.3.2", + "chalk": "^5.3.0", + "cli-cursor": "^3.1.0", + "cli-width": "^4.1.0", + "external-editor": "^3.1.0", + "figures": "^3.2.0", + "lodash": "^4.17.21", + "mute-stream": "1.0.0", + "ora": "^5.4.1", + "run-async": "^3.0.0", + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@angular-devkit/schematics-cli/node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@angular-devkit/schematics-cli/node_modules/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "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==", + "dev": 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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "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/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-array/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/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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/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/@eslint/eslintrc/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/@eslint/eslintrc/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/@eslint/eslintrc/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/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@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": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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": "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/@jest/reporters/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/@jest/reporters/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/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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==", + "dev": 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==", + "dev": 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/@ljharb/through": { + "version": "2.3.14", + "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.14.tgz", + "integrity": "sha512-ajBvlKpWucBB17FuQYUShqpqy8GRgYEpJW0vWJbUu1CV9lWyrDCapy0lScU8T8Z6qn49sSwJB3+M+evYIdGg+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "license": "BSD-3-Clause", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@microsoft/tsdoc": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz", + "integrity": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==", + "license": "MIT" + }, + "node_modules/@nestjs/cli": { + "version": "10.4.9", + "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-10.4.9.tgz", + "integrity": "sha512-s8qYd97bggqeK7Op3iD49X2MpFtW4LVNLAwXFkfbRxKME6IYT7X0muNTJ2+QfI8hpbNx9isWkrLWIp+g5FOhiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "17.3.11", + "@angular-devkit/schematics": "17.3.11", + "@angular-devkit/schematics-cli": "17.3.11", + "@nestjs/schematics": "^10.0.1", + "chalk": "4.1.2", + "chokidar": "3.6.0", + "cli-table3": "0.6.5", + "commander": "4.1.1", + "fork-ts-checker-webpack-plugin": "9.0.2", + "glob": "10.4.5", + "inquirer": "8.2.6", + "node-emoji": "1.11.0", + "ora": "5.4.1", + "tree-kill": "1.2.2", + "tsconfig-paths": "4.2.0", + "tsconfig-paths-webpack-plugin": "4.2.0", + "typescript": "5.7.2", + "webpack": "5.97.1", + "webpack-node-externals": "3.0.0" + }, + "bin": { + "nest": "bin/nest.js" + }, + "engines": { + "node": ">= 16.14" + }, + "peerDependencies": { + "@swc/cli": "^0.1.62 || ^0.3.0 || ^0.4.0 || ^0.5.0", + "@swc/core": "^1.3.62" + }, + "peerDependenciesMeta": { + "@swc/cli": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/@nestjs/cli/node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "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/typescript": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@nestjs/cli/node_modules/webpack": { + "version": "5.97.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", + "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/@nestjs/common": { + "version": "10.4.22", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.4.22.tgz", + "integrity": "sha512-fxJ4v85nDHaqT1PmfNCQ37b/jcv2OojtXTaK1P2uAXhzLf9qq6WNUOFvxBrV4fhQek1EQoT1o9oj5xAZmv3NRw==", + "license": "MIT", + "dependencies": { + "file-type": "20.4.1", + "iterare": "1.2.1", + "tslib": "2.8.1", + "uid": "2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "class-transformer": "*", + "class-validator": "*", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, + "node_modules/@nestjs/config": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-3.3.0.tgz", + "integrity": "sha512-pdGTp8m9d0ZCrjTpjkUbZx6gyf2IKf+7zlkrPNMsJzYZ4bFRRTpXrnj+556/5uiI6AfL5mMrJc2u7dB6bvM+VA==", + "license": "MIT", + "dependencies": { + "dotenv": "16.4.5", + "dotenv-expand": "10.0.0", + "lodash": "4.17.21" + }, + "peerDependencies": { + "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", + "rxjs": "^7.1.0" + } + }, + "node_modules/@nestjs/core": { + "version": "10.4.22", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-10.4.22.tgz", + "integrity": "sha512-6IX9+VwjiKtCjx+mXVPncpkQ5ZjKfmssOZPFexmT+6T9H9wZ3svpYACAo7+9e7Nr9DZSoRZw3pffkJP7Z0UjaA==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@nuxtjs/opencollective": "0.3.2", + "fast-safe-stringify": "2.1.1", + "iterare": "1.2.1", + "path-to-regexp": "3.3.0", + "tslib": "2.8.1", + "uid": "2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^10.0.0", + "@nestjs/microservices": "^10.0.0", + "@nestjs/platform-express": "^10.0.0", + "@nestjs/websockets": "^10.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": "10.2.0", + "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-10.2.0.tgz", + "integrity": "sha512-x8cG90SURkEiLOehNaN2aRlotxT0KZESUliOPKKnjWiyJOcWurkF3w345WOX0P4MgFzUjGoZ1Sy0aZnxeihT0g==", + "license": "MIT", + "dependencies": { + "@types/jsonwebtoken": "9.0.5", + "jsonwebtoken": "9.0.2" + }, + "peerDependencies": { + "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/@nestjs/mapped-types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.1.0.tgz", + "integrity": "sha512-W+n+rM69XsFdwORF11UqJahn4J3xi4g/ZEOlJNL6KoW5ygWSmBB2p0S2BZ4FQeS/NDH72e6xIcu35SfJnE8bXw==", + "license": "MIT", + "peerDependencies": { + "@nestjs/common": "^10.0.0 || ^11.0.0", + "class-transformer": "^0.4.0 || ^0.5.0", + "class-validator": "^0.13.0 || ^0.14.0", + "reflect-metadata": "^0.1.12 || ^0.2.0" + }, + "peerDependenciesMeta": { + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, + "node_modules/@nestjs/passport": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-10.0.3.tgz", + "integrity": "sha512-znJ9Y4S8ZDVY+j4doWAJ8EuuVO7SkQN3yOBmzxbGaXbvcSwFDAdGJ+OMCg52NdzIO4tQoN4pYKx8W6M0ArfFRQ==", + "license": "MIT", + "peerDependencies": { + "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", + "passport": "^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0" + } + }, + "node_modules/@nestjs/platform-express": { + "version": "10.4.22", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-10.4.22.tgz", + "integrity": "sha512-ySSq7Py/DFozzZdNDH67m/vHoeVdphDniWBnl6q5QVoXldDdrZIHLXLRMPayTDh5A95nt7jjJzmD4qpTbNQ6tA==", + "license": "MIT", + "dependencies": { + "body-parser": "1.20.4", + "cors": "2.8.5", + "express": "4.22.1", + "multer": "2.0.2", + "tslib": "2.8.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^10.0.0", + "@nestjs/core": "^10.0.0" + } + }, + "node_modules/@nestjs/platform-express/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/@nestjs/platform-express/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/@nestjs/platform-express/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/@nestjs/schematics": { + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-10.2.3.tgz", + "integrity": "sha512-4e8gxaCk7DhBxVUly2PjYL4xC2ifDFexCqq1/u4TtivLGXotVk0wHdYuPYe1tHTHuR1lsOkRbfOCpkdTnigLVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "17.3.11", + "@angular-devkit/schematics": "17.3.11", + "comment-json": "4.2.5", + "jsonc-parser": "3.3.1", + "pluralize": "8.0.0" + }, + "peerDependencies": { + "typescript": ">=4.8.2" + } + }, + "node_modules/@nestjs/schematics/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/@nestjs/swagger": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-8.1.1.tgz", + "integrity": "sha512-5Mda7H1DKnhKtlsb0C7PYshcvILv8UFyUotHzxmWh0G65Z21R3LZH/J8wmpnlzL4bmXIfr42YwbEwRxgzpJ5sQ==", + "license": "MIT", + "dependencies": { + "@microsoft/tsdoc": "^0.15.0", + "@nestjs/mapped-types": "2.0.6", + "js-yaml": "4.1.0", + "lodash": "4.17.21", + "path-to-regexp": "3.3.0", + "swagger-ui-dist": "5.18.2" + }, + "peerDependencies": { + "@fastify/static": "^6.0.0 || ^7.0.0", + "@nestjs/common": "^9.0.0 || ^10.0.0", + "@nestjs/core": "^9.0.0 || ^10.0.0", + "class-transformer": "*", + "class-validator": "*", + "reflect-metadata": "^0.1.12 || ^0.2.0" + }, + "peerDependenciesMeta": { + "@fastify/static": { + "optional": true + }, + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, + "node_modules/@nestjs/swagger/node_modules/@nestjs/mapped-types": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.0.6.tgz", + "integrity": "sha512-84ze+CPfp1OWdpRi1/lOu59hOhTz38eVzJvRKrg9ykRFwDz+XleKfMsG0gUqNZYFa6v53XYzeD+xItt8uDW7NQ==", + "license": "MIT", + "peerDependencies": { + "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", + "class-transformer": "^0.4.0 || ^0.5.0", + "class-validator": "^0.13.0 || ^0.14.0", + "reflect-metadata": "^0.1.12 || ^0.2.0" + }, + "peerDependenciesMeta": { + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, + "node_modules/@nestjs/testing": { + "version": "10.4.22", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.4.22.tgz", + "integrity": "sha512-HO9aPus3bAedAC+jKVAA8jTdaj4fs5M9fing4giHrcYV2txe9CvC1l1WAjwQ9RDhEHdugjY4y+FZA/U/YqPZrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "2.8.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^10.0.0", + "@nestjs/core": "^10.0.0", + "@nestjs/microservices": "^10.0.0", + "@nestjs/platform-express": "^10.0.0" + }, + "peerDependenciesMeta": { + "@nestjs/microservices": { + "optional": true + }, + "@nestjs/platform-express": { + "optional": true + } + } + }, + "node_modules/@nuxtjs/opencollective": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", + "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "consola": "^2.15.0", + "node-fetch": "^2.6.1" + }, + "bin": { + "opencollective": "bin/opencollective.js" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@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/@prisma/client": { + "version": "6.19.2", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.2.tgz", + "integrity": "sha512-gR2EMvfK/aTxsuooaDA32D8v+us/8AAet+C3J1cc04SW35FPdZYgLF+iN4NDLUgAaUGTKdAB0CYenu1TAgGdMg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "peerDependencies": { + "prisma": "*", + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@prisma/config": { + "version": "6.19.2", + "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.19.2.tgz", + "integrity": "sha512-kadBGDl+aUswv/zZMk9Mx0C8UZs1kjao8H9/JpI4Wh4SHZaM7zkTwiKn/iFLfRg+XtOAo/Z/c6pAYhijKl0nzQ==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "c12": "3.1.0", + "deepmerge-ts": "7.1.5", + "effect": "3.18.4", + "empathic": "2.0.0" + } + }, + "node_modules/@prisma/debug": { + "version": "6.19.2", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.19.2.tgz", + "integrity": "sha512-lFnEZsLdFLmEVCVNdskLDCL8Uup41GDfU0LUfquw+ercJC8ODTuL0WNKgOKmYxCJVvFwf0OuZBzW99DuWmoH2A==", + "devOptional": true, + "license": "Apache-2.0" + }, + "node_modules/@prisma/engines": { + "version": "6.19.2", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.19.2.tgz", + "integrity": "sha512-TTkJ8r+uk/uqczX40wb+ODG0E0icVsMgwCTyTHXehaEfb0uo80M9g1aW1tEJrxmFHeOZFXdI2sTA1j1AgcHi4A==", + "devOptional": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.19.2", + "@prisma/engines-version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7", + "@prisma/fetch-engine": "6.19.2", + "@prisma/get-platform": "6.19.2" + } + }, + "node_modules/@prisma/engines-version": { + "version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7.tgz", + "integrity": "sha512-03bgb1VD5gvuumNf+7fVGBzfpJPjmqV423l/WxsWk2cNQ42JD0/SsFBPhN6z8iAvdHs07/7ei77SKu7aZfq8bA==", + "devOptional": true, + "license": "Apache-2.0" + }, + "node_modules/@prisma/fetch-engine": { + "version": "6.19.2", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.19.2.tgz", + "integrity": "sha512-h4Ff4Pho+SR1S8XerMCC12X//oY2bG3Iug/fUnudfcXEUnIeRiBdXHFdGlGOgQ3HqKgosTEhkZMvGM9tWtYC+Q==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.19.2", + "@prisma/engines-version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7", + "@prisma/get-platform": "6.19.2" + } + }, + "node_modules/@prisma/get-platform": { + "version": "6.19.2", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.19.2.tgz", + "integrity": "sha512-PGLr06JUSTqIvztJtAzIxOwtWKtJm5WwOG6xpsgD37Rc84FpfUBGLKz65YpJBGtkRQGXTYEFie7pYALocC3MtA==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.19.2" + } + }, + "node_modules/@scarf/scarf": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz", + "integrity": "sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==", + "hasInstallScript": true, + "license": "Apache-2.0" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", + "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": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "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==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@tokenizer/inflate": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.2.7.tgz", + "integrity": "sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "fflate": "^0.8.2", + "token-types": "^6.0.0" + }, + "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==", + "dev": 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==", + "dev": 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==", + "dev": 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==", + "dev": true, + "license": "MIT" + }, + "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/bcrypt": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-5.0.2.tgz", + "integrity": "sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==", + "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/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/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "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": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.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.5", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.5.tgz", + "integrity": "sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/multer": { + "version": "1.4.13", + "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.13.tgz", + "integrity": "sha512-bhhdtPw7JqCiEfC9Jimx5LqX9BDIPJEh2q/fQ4bqbBPtyEZYr3cvF22NwG0DmPZNYA0CAf2CnqDB4KIGGpJcaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "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/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/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/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/@typescript-eslint/visitor-keys/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/@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/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "license": "ISC" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "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==", + "dev": 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", + "peer": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "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/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/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/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/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/aproba": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", + "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==", + "license": "ISC" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/are-we-there-yet/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/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": 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==", + "license": "Python-2.0" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "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/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/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/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-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/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/bcrypt": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", + "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.11", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/body-parser": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "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/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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-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/c12": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/c12/-/c12-3.1.0.tgz", + "integrity": "sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.3", + "confbox": "^0.2.2", + "defu": "^6.1.4", + "dotenv": "^16.6.1", + "exsolve": "^1.0.7", + "giget": "^2.0.0", + "jiti": "^2.4.2", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^1.0.0", + "pkg-types": "^2.2.0", + "rc9": "^2.1.2" + }, + "peerDependencies": { + "magicast": "^0.3.5" + }, + "peerDependenciesMeta": { + "magicast": { + "optional": true + } + } + }, + "node_modules/c12/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/c12/node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "devOptional": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/c12/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==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "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==", + "dev": true, + "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==", + "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": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true, + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/citty": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", + "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "consola": "^3.2.3" + } + }, + "node_modules/citty/node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 10" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "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/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "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/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.2.5", + "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.2.5.tgz", + "integrity": "sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-timsort": "^1.0.3", + "core-util-is": "^1.0.3", + "esprima": "^4.0.1", + "has-own-prop": "^2.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/confbox": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", + "license": "MIT" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "license": "ISC" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "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.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "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==", + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "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-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", + "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "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/deepmerge-ts": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz", + "integrity": "sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==", + "devOptional": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=16.0.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==", + "dev": true, + "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/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "devOptional": 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/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "license": "MIT" + }, + "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/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "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/diff": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", + "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "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==", + "dev": true, + "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/effect": { + "version": "3.18.4", + "resolved": "https://registry.npmjs.org/effect/-/effect-3.18.4.tgz", + "integrity": "sha512-b1LXQJLe9D11wfnOKAk3PKxuqYshQ0Heez+y5pnkd3jLj1yx9QhM72zZ9uUrOQyNvrs2GZZd/3maL0ZV18YuDA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "fast-check": "^3.23.1" + } + }, + "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/empathic": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz", + "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "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/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", + "peer": true + }, + "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/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-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": "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/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/eslint/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/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/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/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/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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/espree/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/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": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/express": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.14.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/exsolve": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", + "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fast-check": { + "version": "3.23.2", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.23.2.tgz", + "integrity": "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==", + "devOptional": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT", + "dependencies": { + "pure-rand": "^6.1.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "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-xml-parser": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.3.tgz", + "integrity": "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^1.1.1" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "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/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "license": "MIT" + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "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": "20.4.1", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-20.4.1.tgz", + "integrity": "sha512-hw9gNZXUfZ02Jo0uafWLaFVPter5/k2rfcrjFJJHX/77xtSDOfJuEFb6oKlFV86FLP1SuyHMW1PSk0U9M5tKkQ==", + "license": "MIT", + "dependencies": { + "@tokenizer/inflate": "^0.2.6", + "strtok3": "^10.2.0", + "token-types": "^6.0.0", + "uint8array-extras": "^1.4.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "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/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-9.0.2.tgz", + "integrity": "sha512-Uochze2R8peoN1XqlSi/rGUkDQpRogtLFocP9+PGu68zk1BDAKXfdeCdyVZpgTk8V8WFVQXdEz426VKjXLO1Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.16.7", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "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": ">=12.13.0", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "typescript": ">3.6.0", + "webpack": "^5.11.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/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/fork-ts-checker-webpack-plugin/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/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/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": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "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==", + "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/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gauge/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==", + "license": "ISC" + }, + "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==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "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/giget": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz", + "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.4.0", + "defu": "^6.1.4", + "node-fetch-native": "^1.6.6", + "nypm": "^0.6.0", + "pathe": "^2.0.3" + }, + "bin": { + "giget": "dist/cli.mjs" + } + }, + "node_modules/giget/node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "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/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "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/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-own-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz", + "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "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/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "license": "ISC" + }, + "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/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "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.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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": "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/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.", + "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/inquirer": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", + "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^6.0.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "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-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "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-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-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": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "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/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-report/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/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/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/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==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/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/jest-config/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/jest-config/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/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/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/jest-runtime/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/jest-runtime/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/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/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/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "devOptional": true, + "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.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "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": "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/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.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", + "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.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "license": "MIT", + "dependencies": { + "jws": "^3.2.2", + "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": "1.4.2", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", + "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", + "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": "3.2.3", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.3.tgz", + "integrity": "sha512-byiJ0FLRdLdSVSReO/U4E7RoEyOCKnEnEPMjq3HxWtvzLsV08/i5RQKsFVNkCldrCaPr2vDNAOMsfs8T/Hze7g==", + "license": "MIT", + "dependencies": { + "jwa": "^1.4.2", + "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/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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/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.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "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.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "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": "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/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": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "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==", + "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": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=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/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/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/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==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "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/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": "1.4.5-lts.2", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.2.tgz", + "integrity": "sha512-VzGiVigcG9zUAoCNU+xShztrlr1auZOlurXynNvO9GiWD1/mTBbUljOKY+qMeazBqXgRnjzeEgJI/wyjJUHg9A==", + "deprecated": "Multer 1.x is impacted by a number of vulnerabilities, which have been patched in 2.x. You should upgrade to the latest 2.x version.", + "license": "MIT", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true, + "license": "ISC" + }, + "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": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "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-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-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", + "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-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", + "devOptional": true, + "license": "MIT" + }, + "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/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "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/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/nypm": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.5.tgz", + "integrity": "sha512-K6AJy1GMVyfyMXRVB88700BJqNUkByijGJM8kEHpLdcAt+vSQAVfkWWHYzuRXHSY6xA2sNc5RjTj0p9rE2izVQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "citty": "^0.2.0", + "pathe": "^2.0.3", + "tinyexec": "^1.0.2" + }, + "bin": { + "nypm": "dist/cli.mjs" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/nypm/node_modules/citty": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.2.0.tgz", + "integrity": "sha512-8csy5IBFI2ex2hTVpaHN2j+LNE199AgiI7y4dMintrr8i0lQiFn+0AWMZrWdHKIgMOer65f8IThysYhoReqjWA==", + "devOptional": true, + "license": "MIT" + }, + "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/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "devOptional": true, + "license": "MIT" + }, + "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/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.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/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==", + "dev": true, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-to-regexp": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", + "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", + "license": "MIT" + }, + "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/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.1.tgz", + "integrity": "sha512-xUXwsxNjwTQ8K3GnT4pCJm+xq3RUPQbmkYJTP5aFIfNIvbcc/4MUxgBaaRSZJ6yGJZiGSyYlM6MzwTsRk8SYCg==", + "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/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "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/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": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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/prisma": { + "version": "6.19.2", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.2.tgz", + "integrity": "sha512-XTKeKxtQElcq3U9/jHyxSPgiRgeYDKxWTPOf6NkXA0dNj5j40MfEsZkMbyNpwDWCUv7YBFUl7I2VK/6ALbmhEg==", + "devOptional": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/config": "6.19.2", + "@prisma/engines": "6.19.2" + }, + "bin": { + "prisma": "build/index.js" + }, + "engines": { + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "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/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/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "devOptional": 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": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc9": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", + "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "defu": "^6.1.4", + "destr": "^2.0.3" + } + }, + "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": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "license": "Apache-2.0" + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "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/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/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==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/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", + "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/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "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/schema-utils/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "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/schema-utils/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "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": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "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": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "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/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/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==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "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/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.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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/strnum": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", + "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "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/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/swagger-ui-dist": { + "version": "5.18.2", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.18.2.tgz", + "integrity": "sha512-J+y4mCw/zXh1FOj5wGJvnAajq6XgHOyywsa9yITmwxIlJbMqITq3gYRZHaeqLVH/eV/HOPphE6NjF+nbSNC5Zw==", + "license": "Apache-2.0", + "dependencies": { + "@scarf/scarf": "=1.4.0" + } + }, + "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": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "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/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/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/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/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/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "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/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "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-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/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "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==", + "dev": 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/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": "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/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/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/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/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/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "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/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "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/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/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/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/write-file-atomic/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/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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": 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" + } + } + } +} diff --git a/backend/package.json b/backend/package.json new file mode 100644 index 0000000..fc3b0c4 --- /dev/null +++ b/backend/package.json @@ -0,0 +1,85 @@ +{ + "name": "duorigin-v2-backend", + "version": "2.0.0", + "description": "DuOrigin v2 - Sistema de Compliance EUDR para Agronegócio", + "author": "AIVertice", + "private": true, + "license": "MIT", + "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", + "prisma:generate": "prisma generate", + "prisma:migrate": "prisma migrate dev", + "prisma:push": "prisma db push", + "prisma:pull": "prisma db pull", + "prisma:studio": "prisma studio", + "seed": "ts-node prisma/seed.ts" + }, + "dependencies": { + "@nestjs/common": "^10.4.15", + "@nestjs/config": "^3.3.0", + "@nestjs/core": "^10.4.15", + "@nestjs/jwt": "^10.2.0", + "@nestjs/mapped-types": "^2.0.6", + "@nestjs/passport": "^10.0.3", + "@nestjs/platform-express": "^10.4.15", + "@nestjs/swagger": "^8.1.0", + "@prisma/client": "^6.3.1", + "axios": "^1.7.9", + "fast-xml-parser": "^4.5.1", + "multer": "^1.4.5-lts.1", + "bcrypt": "^5.1.1", + "class-transformer": "^0.5.1", + "class-validator": "^0.14.1", + "passport": "^0.7.0", + "passport-jwt": "^4.0.1", + "reflect-metadata": "^0.2.2", + "rxjs": "^7.8.1" + }, + "devDependencies": { + "@nestjs/cli": "^10.4.9", + "@nestjs/schematics": "^10.2.3", + "@nestjs/testing": "^10.4.15", + "@types/bcrypt": "^5.0.2", + "@types/express": "^5.0.0", + "@types/multer": "^1.4.12", + "@types/jest": "^29.5.14", + "@types/node": "^22.10.7", + "@types/passport-jwt": "^4.0.1", + "@typescript-eslint/eslint-plugin": "^8.21.0", + "@typescript-eslint/parser": "^8.21.0", + "eslint": "^9.18.0", + "eslint-config-prettier": "^10.0.1", + "eslint-plugin-prettier": "^5.2.2", + "jest": "^29.7.0", + "prettier": "^3.4.2", + "prisma": "^6.3.1", + "source-map-support": "^0.5.21", + "ts-jest": "^29.2.5", + "ts-loader": "^9.5.1", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.7.3" + }, + "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/prisma/schema.prisma b/backend/prisma/schema.prisma new file mode 100644 index 0000000..64eef77 --- /dev/null +++ b/backend/prisma/schema.prisma @@ -0,0 +1,133 @@ +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +enum Role { + ADMIN + OPERADOR +} + +enum StatusAvaliacao { + RASCUNHO + EM_ANALISE + APROVADA + REPROVADA +} + +enum NivelRisco { + BAIXO + MEDIO + ALTO + CRITICO +} + +model User { + id Int @id @default(autoincrement()) + email String @unique + password String + nome String + role Role @default(OPERADOR) + ativo Boolean @default(true) + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + avaliacoes Avaliacao[] + documentos Documento[] + + @@map("users") +} + +model Empresa { + id Int @id @default(autoincrement()) + razaoSocial String @map("razao_social") + nomeFantasia String? @map("nome_fantasia") + cnpj String @unique + inscricaoEstadual String? @map("inscricao_estadual") + atividadeAgricola String? @map("atividade_agricola") + endereco String? + cidade String? + estado String? + cep String? + telefone String? + email String? + responsavel String? + ativo Boolean @default(true) + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + propriedades Propriedade[] + + @@map("empresas") +} + +model Propriedade { + id Int @id @default(autoincrement()) + nome String + empresaId Int @map("empresa_id") + codigoCar String? @map("codigo_car") + areaHa Float? @map("area_ha") + latitude Float? + longitude Float? + bioma String? + endereco String? + cidade String? + estado String? + nivelRisco NivelRisco @default(BAIXO) @map("nivel_risco") + flagDesmatamento String? @map("flag_desmatamento") + geojson String? @db.Text + ativo Boolean @default(true) + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + empresa Empresa @relation(fields: [empresaId], references: [id], onDelete: Cascade) + avaliacoes Avaliacao[] + documentos Documento[] + + @@map("propriedades") +} + +model Avaliacao { + id Int @id @default(autoincrement()) + propriedadeId Int @map("propriedade_id") + userId Int @map("user_id") + referencia String @unique + status StatusAvaliacao @default(RASCUNHO) + nivelRisco NivelRisco @default(BAIXO) @map("nivel_risco") + dataAvaliacao DateTime? @map("data_avaliacao") + dataSubmissao DateTime? @map("data_submissao") + observacoes String? @db.Text + resultadoDds String? @map("resultado_dds") @db.Text + referenciaEu String? @map("referencia_eu") + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + propriedade Propriedade @relation(fields: [propriedadeId], references: [id], onDelete: Cascade) + user User @relation(fields: [userId], references: [id]) + documentos Documento[] + + @@map("avaliacoes") +} + +model Documento { + id Int @id @default(autoincrement()) + nome String + tipo String? + tamanho Int? + mimeType String? @map("mime_type") + path String + propriedadeId Int? @map("propriedade_id") + avaliacaoId Int? @map("avaliacao_id") + userId Int @map("user_id") + createdAt DateTime @default(now()) @map("created_at") + + propriedade Propriedade? @relation(fields: [propriedadeId], references: [id], onDelete: Cascade) + avaliacao Avaliacao? @relation(fields: [avaliacaoId], references: [id], onDelete: Cascade) + user User @relation(fields: [userId], references: [id]) + + @@map("documentos") +} diff --git a/backend/prisma/seed.ts b/backend/prisma/seed.ts new file mode 100644 index 0000000..531c086 --- /dev/null +++ b/backend/prisma/seed.ts @@ -0,0 +1,328 @@ +import { PrismaClient, Role, NivelRisco, StatusAvaliacao } from '@prisma/client'; +import * as bcrypt from 'bcrypt'; + +const prisma = new PrismaClient(); + +async function main() { + console.log('🌱 Seeding database...'); + + // Create users + const adminPassword = await bcrypt.hash('DuoDemo2026', 10); + const operadorPassword = await bcrypt.hash('DuoDemo2026', 10); + + const admin = await prisma.user.upsert({ + where: { email: 'demo@duorigin.com' }, + update: {}, + create: { + email: 'demo@duorigin.com', + password: adminPassword, + nome: 'Administrador Demo', + role: Role.ADMIN, + ativo: true, + }, + }); + + const operador = await prisma.user.upsert({ + where: { email: 'operador@duorigin.com' }, + update: {}, + create: { + email: 'operador@duorigin.com', + password: operadorPassword, + nome: 'Operador Demo', + role: Role.OPERADOR, + ativo: true, + }, + }); + + console.log('✅ Users created:', { admin: admin.email, operador: operador.email }); + + // Create empresas + const empresas = await Promise.all([ + prisma.empresa.upsert({ + where: { cnpj: '12.345.678/0001-90' }, + update: {}, + create: { + razaoSocial: 'Fazenda Bom Sucesso Ltda', + nomeFantasia: 'Fazenda Bom Sucesso', + cnpj: '12.345.678/0001-90', + inscricaoEstadual: '123.456.789.012', + atividadeAgricola: 'Soja, Milho', + endereco: 'Rodovia BR-050, Km 45', + cidade: 'Uberlândia', + estado: 'MG', + cep: '38400-000', + telefone: '(34) 99999-0001', + email: 'contato@bomsucesso.com.br', + responsavel: 'João Silva', + ativo: true, + }, + }), + prisma.empresa.upsert({ + where: { cnpj: '23.456.789/0001-01' }, + update: {}, + create: { + razaoSocial: 'Agropecuária São José S.A.', + nomeFantasia: 'São José Agro', + cnpj: '23.456.789/0001-01', + inscricaoEstadual: '234.567.890.123', + atividadeAgricola: 'Café, Pecuária', + endereco: 'Estrada Municipal SP-123, Km 10', + cidade: 'Ribeirão Preto', + estado: 'SP', + cep: '14000-000', + telefone: '(16) 99999-0002', + email: 'contato@saojoseagro.com.br', + responsavel: 'Maria Santos', + ativo: true, + }, + }), + prisma.empresa.upsert({ + where: { cnpj: '34.567.890/0001-12' }, + update: {}, + create: { + razaoSocial: 'Cooperativa Agrícola Vale Verde', + nomeFantasia: 'Coop Vale Verde', + cnpj: '34.567.890/0001-12', + inscricaoEstadual: '345.678.901.234', + atividadeAgricola: 'Soja, Algodão, Milho', + endereco: 'Av. Principal, 1000', + cidade: 'Rondonópolis', + estado: 'MT', + cep: '78700-000', + telefone: '(66) 99999-0003', + email: 'contato@valeverde.coop.br', + responsavel: 'Carlos Oliveira', + ativo: true, + }, + }), + ]); + + console.log('✅ Empresas created:', empresas.length); + + // Create propriedades + const propriedades = await Promise.all([ + prisma.propriedade.create({ + data: { + nome: 'Fazenda Primavera', + empresaId: empresas[0].id, + codigoCar: 'MG-3170206-A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6', + areaHa: 1500.5, + latitude: -18.9186, + longitude: -48.2772, + bioma: 'Cerrado', + endereco: 'Zona Rural, Lote 45', + cidade: 'Uberlândia', + estado: 'MG', + nivelRisco: NivelRisco.BAIXO, + flagDesmatamento: 'clean', + ativo: true, + }, + }), + prisma.propriedade.create({ + data: { + nome: 'Sítio Esperança', + empresaId: empresas[0].id, + codigoCar: 'MG-3170206-B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6Q7', + areaHa: 320.0, + latitude: -18.8500, + longitude: -48.3000, + bioma: 'Cerrado', + cidade: 'Uberlândia', + estado: 'MG', + nivelRisco: NivelRisco.BAIXO, + ativo: true, + }, + }), + prisma.propriedade.create({ + data: { + nome: 'Fazenda São José', + empresaId: empresas[1].id, + codigoCar: 'SP-3543402-C3D4E5F6G7H8I9J0K1L2M3N4O5P6Q7R8', + areaHa: 850.75, + latitude: -21.1767, + longitude: -47.8108, + bioma: 'Mata Atlântica', + cidade: 'Ribeirão Preto', + estado: 'SP', + nivelRisco: NivelRisco.MEDIO, + flagDesmatamento: 'under_review', + ativo: true, + }, + }), + prisma.propriedade.create({ + data: { + nome: 'Fazenda Pioneira', + empresaId: empresas[2].id, + codigoCar: 'MT-5107602-D4E5F6G7H8I9J0K1L2M3N4O5P6Q7R8S9', + areaHa: 5200.0, + latitude: -16.4673, + longitude: -54.6372, + bioma: 'Cerrado', + cidade: 'Rondonópolis', + estado: 'MT', + nivelRisco: NivelRisco.BAIXO, + ativo: true, + }, + }), + prisma.propriedade.create({ + data: { + nome: 'Fazenda Horizonte', + empresaId: empresas[2].id, + codigoCar: 'MT-5107602-E5F6G7H8I9J0K1L2M3N4O5P6Q7R8S9T0', + areaHa: 3800.25, + latitude: -16.5000, + longitude: -54.7000, + bioma: 'Cerrado', + cidade: 'Rondonópolis', + estado: 'MT', + nivelRisco: NivelRisco.ALTO, + flagDesmatamento: 'flagged', + ativo: true, + }, + }), + ]); + + console.log('✅ Propriedades created:', propriedades.length); + + // Create avaliacoes + const generateRef = () => { + const timestamp = Date.now().toString(36).toUpperCase(); + const random = Math.random().toString(36).substring(2, 6).toUpperCase(); + return `DUO-${timestamp}-${random}`; + }; + + const avaliacoes = await Promise.all([ + prisma.avaliacao.create({ + data: { + propriedadeId: propriedades[0].id, + userId: admin.id, + referencia: generateRef(), + status: StatusAvaliacao.APROVADA, + nivelRisco: NivelRisco.BAIXO, + dataAvaliacao: new Date('2024-01-15'), + dataSubmissao: new Date('2024-01-20'), + observacoes: 'Propriedade em conformidade com EUDR.', + referenciaEu: 'EU-ABC123', + }, + }), + prisma.avaliacao.create({ + data: { + propriedadeId: propriedades[0].id, + userId: operador.id, + referencia: generateRef(), + status: StatusAvaliacao.EM_ANALISE, + nivelRisco: NivelRisco.BAIXO, + dataAvaliacao: new Date('2024-06-01'), + observacoes: 'Aguardando documentação adicional.', + }, + }), + prisma.avaliacao.create({ + data: { + propriedadeId: propriedades[1].id, + userId: admin.id, + referencia: generateRef(), + status: StatusAvaliacao.RASCUNHO, + nivelRisco: NivelRisco.BAIXO, + dataAvaliacao: new Date(), + }, + }), + prisma.avaliacao.create({ + data: { + propriedadeId: propriedades[2].id, + userId: operador.id, + referencia: generateRef(), + status: StatusAvaliacao.EM_ANALISE, + nivelRisco: NivelRisco.MEDIO, + dataAvaliacao: new Date('2024-05-10'), + dataSubmissao: new Date('2024-05-15'), + observacoes: 'Área com histórico de desmatamento em análise.', + }, + }), + prisma.avaliacao.create({ + data: { + propriedadeId: propriedades[2].id, + userId: admin.id, + referencia: generateRef(), + status: StatusAvaliacao.REPROVADA, + nivelRisco: NivelRisco.ALTO, + dataAvaliacao: new Date('2024-03-01'), + dataSubmissao: new Date('2024-03-10'), + observacoes: 'Documentação irregular. Necessário revisão.', + }, + }), + prisma.avaliacao.create({ + data: { + propriedadeId: propriedades[3].id, + userId: admin.id, + referencia: generateRef(), + status: StatusAvaliacao.APROVADA, + nivelRisco: NivelRisco.BAIXO, + dataAvaliacao: new Date('2024-02-20'), + dataSubmissao: new Date('2024-02-25'), + referenciaEu: 'EU-DEF456', + }, + }), + prisma.avaliacao.create({ + data: { + propriedadeId: propriedades[3].id, + userId: operador.id, + referencia: generateRef(), + status: StatusAvaliacao.RASCUNHO, + nivelRisco: NivelRisco.BAIXO, + dataAvaliacao: new Date(), + }, + }), + prisma.avaliacao.create({ + data: { + propriedadeId: propriedades[4].id, + userId: admin.id, + referencia: generateRef(), + status: StatusAvaliacao.EM_ANALISE, + nivelRisco: NivelRisco.ALTO, + dataAvaliacao: new Date('2024-06-05'), + dataSubmissao: new Date('2024-06-10'), + observacoes: 'Área com risco alto de desmatamento identificado.', + }, + }), + prisma.avaliacao.create({ + data: { + propriedadeId: propriedades[4].id, + userId: operador.id, + referencia: generateRef(), + status: StatusAvaliacao.REPROVADA, + nivelRisco: NivelRisco.CRITICO, + dataAvaliacao: new Date('2024-04-01'), + dataSubmissao: new Date('2024-04-05'), + observacoes: 'Desmatamento ilegal detectado. Propriedade bloqueada.', + }, + }), + prisma.avaliacao.create({ + data: { + propriedadeId: propriedades[1].id, + userId: operador.id, + referencia: generateRef(), + status: StatusAvaliacao.APROVADA, + nivelRisco: NivelRisco.BAIXO, + dataAvaliacao: new Date('2024-01-05'), + dataSubmissao: new Date('2024-01-10'), + referenciaEu: 'EU-GHI789', + }, + }), + ]); + + console.log('✅ Avaliacoes created:', avaliacoes.length); + + console.log('🎉 Seed completed successfully!'); + console.log('\n📝 Login credentials:'); + console.log(' Admin: demo@duorigin.com / DuoDemo2026'); + console.log(' Operador: operador@duorigin.com / DuoDemo2026'); +} + +main() + .catch((e) => { + console.error('❌ Seed error:', e); + process.exit(1); + }) + .finally(async () => { + await prisma.$disconnect(); + }); diff --git a/backend/src/app.module.ts b/backend/src/app.module.ts new file mode 100644 index 0000000..61d8a1a --- /dev/null +++ b/backend/src/app.module.ts @@ -0,0 +1,29 @@ +import { Module } from '@nestjs/common'; +import { ConfigModule } from '@nestjs/config'; +import { PrismaModule } from './prisma/prisma.module'; +import { AuthModule } from './auth/auth.module'; +import { UsersModule } from './users/users.module'; +import { EmpresasModule } from './empresas/empresas.module'; +import { PropriedadesModule } from './propriedades/propriedades.module'; +import { AvaliacoesModule } from './avaliacoes/avaliacoes.module'; +import { DocumentosModule } from './documentos/documentos.module'; +import { DashboardModule } from './dashboard/dashboard.module'; +import { EudrApiModule } from './eudr-api/eudr-api.module'; + +@Module({ + imports: [ + ConfigModule.forRoot({ + isGlobal: true, + }), + PrismaModule, + AuthModule, + UsersModule, + EmpresasModule, + PropriedadesModule, + AvaliacoesModule, + DocumentosModule, + DashboardModule, + EudrApiModule, + ], +}) +export class AppModule {} diff --git a/backend/src/auth/auth.controller.ts b/backend/src/auth/auth.controller.ts new file mode 100644 index 0000000..27ddb33 --- /dev/null +++ b/backend/src/auth/auth.controller.ts @@ -0,0 +1,38 @@ +import { Controller, Post, Get, Body, UseGuards, Request } from '@nestjs/common'; +import { ApiTags, ApiOperation, ApiResponse, ApiBearerAuth } from '@nestjs/swagger'; +import { AuthService } from './auth.service'; +import { LoginDto } from './dto/login.dto'; +import { RegistroDto } from './dto/registro.dto'; +import { JwtAuthGuard } from './jwt-auth.guard'; + +@ApiTags('auth') +@Controller('auth') +export class AuthController { + constructor(private authService: AuthService) {} + + @Post('login') + @ApiOperation({ summary: 'Realizar login' }) + @ApiResponse({ status: 200, description: 'Login realizado com sucesso' }) + @ApiResponse({ status: 401, description: 'Credenciais inválidas' }) + async login(@Body() loginDto: LoginDto) { + return this.authService.login(loginDto); + } + + @Post('registro') + @ApiOperation({ summary: 'Registrar novo usuário' }) + @ApiResponse({ status: 201, description: 'Usuário criado com sucesso' }) + @ApiResponse({ status: 409, description: 'Email já cadastrado' }) + async registro(@Body() registroDto: RegistroDto) { + return this.authService.registro(registroDto); + } + + @Get('me') + @UseGuards(JwtAuthGuard) + @ApiBearerAuth() + @ApiOperation({ summary: 'Obter perfil do usuário logado' }) + @ApiResponse({ status: 200, description: 'Perfil retornado com sucesso' }) + @ApiResponse({ status: 401, description: 'Não autorizado' }) + async getProfile(@Request() req: any) { + return this.authService.getProfile(req.user.sub); + } +} diff --git a/backend/src/auth/auth.module.ts b/backend/src/auth/auth.module.ts new file mode 100644 index 0000000..2a2e4d2 --- /dev/null +++ b/backend/src/auth/auth.module.ts @@ -0,0 +1,29 @@ +import { Module } from '@nestjs/common'; +import { JwtModule } from '@nestjs/jwt'; +import { PassportModule } from '@nestjs/passport'; +import { ConfigModule, ConfigService } from '@nestjs/config'; +import { AuthController } from './auth.controller'; +import { AuthService } from './auth.service'; +import { JwtStrategy } from './jwt.strategy'; +import { UsersModule } from '../users/users.module'; + +@Module({ + imports: [ + PassportModule.register({ defaultStrategy: 'jwt' }), + JwtModule.registerAsync({ + imports: [ConfigModule], + useFactory: async (configService: ConfigService) => ({ + secret: configService.get('JWT_SECRET'), + signOptions: { + expiresIn: configService.get('JWT_EXPIRES_IN') || '7d', + }, + }), + inject: [ConfigService], + }), + UsersModule, + ], + controllers: [AuthController], + providers: [AuthService, JwtStrategy], + exports: [AuthService, JwtModule], +}) +export class AuthModule {} diff --git a/backend/src/auth/auth.service.ts b/backend/src/auth/auth.service.ts new file mode 100644 index 0000000..8483842 --- /dev/null +++ b/backend/src/auth/auth.service.ts @@ -0,0 +1,107 @@ +import { Injectable, UnauthorizedException, ConflictException } from '@nestjs/common'; +import { JwtService } from '@nestjs/jwt'; +import * as bcrypt from 'bcrypt'; +import { PrismaService } from '../prisma/prisma.service'; +import { LoginDto } from './dto/login.dto'; +import { RegistroDto } from './dto/registro.dto'; + +@Injectable() +export class AuthService { + constructor( + private prisma: PrismaService, + private jwtService: JwtService, + ) {} + + async login(loginDto: LoginDto) { + const user = await this.prisma.user.findUnique({ + where: { email: loginDto.email }, + }); + + if (!user) { + throw new UnauthorizedException('Credenciais inválidas'); + } + + const isPasswordValid = await bcrypt.compare(loginDto.password, user.password); + + if (!isPasswordValid) { + throw new UnauthorizedException('Credenciais inválidas'); + } + + if (!user.ativo) { + throw new UnauthorizedException('Usuário desativado'); + } + + const payload = { sub: user.id, email: user.email, role: user.role }; + const accessToken = this.jwtService.sign(payload); + + return { + access_token: accessToken, + user: { + id: user.id, + email: user.email, + nome: user.nome, + role: user.role, + }, + }; + } + + async registro(registroDto: RegistroDto) { + const existingUser = await this.prisma.user.findUnique({ + where: { email: registroDto.email }, + }); + + if (existingUser) { + throw new ConflictException('Email já cadastrado'); + } + + const hashedPassword = await bcrypt.hash(registroDto.password, 10); + + const user = await this.prisma.user.create({ + data: { + email: registroDto.email, + password: hashedPassword, + nome: registroDto.nome, + role: registroDto.role || 'OPERADOR', + }, + }); + + const payload = { sub: user.id, email: user.email, role: user.role }; + const accessToken = this.jwtService.sign(payload); + + return { + access_token: accessToken, + user: { + id: user.id, + email: user.email, + nome: user.nome, + role: user.role, + }, + }; + } + + async getProfile(userId: number) { + const user = await this.prisma.user.findUnique({ + where: { id: userId }, + select: { + id: true, + email: true, + nome: true, + role: true, + ativo: true, + createdAt: true, + }, + }); + + if (!user) { + throw new UnauthorizedException('Usuário não encontrado'); + } + + return user; + } + + async validateUser(userId: number) { + return this.prisma.user.findUnique({ + where: { id: userId }, + }); + } +} diff --git a/backend/src/auth/dto/login.dto.ts b/backend/src/auth/dto/login.dto.ts new file mode 100644 index 0000000..a37a8cc --- /dev/null +++ b/backend/src/auth/dto/login.dto.ts @@ -0,0 +1,13 @@ +import { IsEmail, IsString, MinLength } from 'class-validator'; +import { ApiProperty } from '@nestjs/swagger'; + +export class LoginDto { + @ApiProperty({ example: 'demo@duorigin.com', description: 'Email do usuário' }) + @IsEmail({}, { message: 'Email inválido' }) + email: string; + + @ApiProperty({ example: 'DuoDemo2026', description: 'Senha do usuário' }) + @IsString() + @MinLength(6, { message: 'Senha deve ter no mínimo 6 caracteres' }) + password: string; +} diff --git a/backend/src/auth/dto/registro.dto.ts b/backend/src/auth/dto/registro.dto.ts new file mode 100644 index 0000000..2798a1a --- /dev/null +++ b/backend/src/auth/dto/registro.dto.ts @@ -0,0 +1,24 @@ +import { IsEmail, IsString, MinLength, IsOptional, IsEnum } from 'class-validator'; +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; +import { Role } from '@prisma/client'; + +export class RegistroDto { + @ApiProperty({ example: 'usuario@duorigin.com', description: 'Email do usuário' }) + @IsEmail({}, { message: 'Email inválido' }) + email: string; + + @ApiProperty({ example: 'Senha123!', description: 'Senha do usuário' }) + @IsString() + @MinLength(6, { message: 'Senha deve ter no mínimo 6 caracteres' }) + password: string; + + @ApiProperty({ example: 'João Silva', description: 'Nome completo do usuário' }) + @IsString() + @MinLength(2, { message: 'Nome deve ter no mínimo 2 caracteres' }) + nome: string; + + @ApiPropertyOptional({ enum: Role, example: 'OPERADOR', description: 'Papel do usuário' }) + @IsOptional() + @IsEnum(Role) + role?: Role; +} diff --git a/backend/src/auth/jwt-auth.guard.ts b/backend/src/auth/jwt-auth.guard.ts new file mode 100644 index 0000000..26571a0 --- /dev/null +++ b/backend/src/auth/jwt-auth.guard.ts @@ -0,0 +1,30 @@ +import { Injectable, ExecutionContext, UnauthorizedException } 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); + } + + handleRequest(err: any, user: any, info: any) { + if (err || !user) { + throw err || new UnauthorizedException('Token inválido ou expirado'); + } + return user; + } +} diff --git a/backend/src/auth/jwt.strategy.ts b/backend/src/auth/jwt.strategy.ts new file mode 100644 index 0000000..0639512 --- /dev/null +++ b/backend/src/auth/jwt.strategy.ts @@ -0,0 +1,41 @@ +import { Injectable, UnauthorizedException } from '@nestjs/common'; +import { PassportStrategy } from '@nestjs/passport'; +import { ExtractJwt, Strategy } from 'passport-jwt'; +import { ConfigService } from '@nestjs/config'; +import { PrismaService } from '../prisma/prisma.service'; + +interface JwtPayload { + sub: number; + email: string; + role: string; +} + +@Injectable() +export class JwtStrategy extends PassportStrategy(Strategy) { + constructor( + private configService: ConfigService, + private prisma: PrismaService, + ) { + const secret = configService.get('JWT_SECRET'); + if (!secret) { + throw new Error('JWT_SECRET not configured'); + } + super({ + jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), + ignoreExpiration: false, + secretOrKey: secret, + }); + } + + async validate(payload: JwtPayload) { + const user = await this.prisma.user.findUnique({ + where: { id: payload.sub }, + }); + + if (!user || !user.ativo) { + throw new UnauthorizedException('Usuário não autorizado'); + } + + return { sub: payload.sub, email: payload.email, role: payload.role }; + } +} diff --git a/backend/src/auth/roles.decorator.ts b/backend/src/auth/roles.decorator.ts new file mode 100644 index 0000000..0d0c0d7 --- /dev/null +++ b/backend/src/auth/roles.decorator.ts @@ -0,0 +1,5 @@ +import { SetMetadata } from '@nestjs/common'; +import { Role } from '@prisma/client'; + +export const ROLES_KEY = 'roles'; +export const Roles = (...roles: Role[]) => SetMetadata(ROLES_KEY, roles); diff --git a/backend/src/auth/roles.guard.ts b/backend/src/auth/roles.guard.ts new file mode 100644 index 0000000..3cbf704 --- /dev/null +++ b/backend/src/auth/roles.guard.ts @@ -0,0 +1,29 @@ +import { Injectable, CanActivate, ExecutionContext, ForbiddenException } from '@nestjs/common'; +import { Reflector } from '@nestjs/core'; +import { Role } from '@prisma/client'; + +export const ROLES_KEY = 'roles'; + +@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 || !requiredRoles.includes(user.role)) { + throw new ForbiddenException('Acesso negado. Permissão insuficiente.'); + } + + return true; + } +} diff --git a/backend/src/avaliacoes/avaliacoes.controller.ts b/backend/src/avaliacoes/avaliacoes.controller.ts new file mode 100644 index 0000000..091a622 --- /dev/null +++ b/backend/src/avaliacoes/avaliacoes.controller.ts @@ -0,0 +1,92 @@ +import { Controller, Get, Post, Put, Delete, Body, Param, Query, ParseIntPipe, UseGuards, Request } from '@nestjs/common'; +import { ApiTags, ApiOperation, ApiResponse, ApiBearerAuth, ApiQuery } from '@nestjs/swagger'; +import { AvaliacoesService } from './avaliacoes.service'; +import { CreateAvaliacaoDto } from './dto/create-avaliacao.dto'; +import { UpdateAvaliacaoDto } from './dto/update-avaliacao.dto'; +import { JwtAuthGuard } from '../auth/jwt-auth.guard'; +import { StatusAvaliacao } from '@prisma/client'; + +@ApiTags('avaliacoes') +@Controller('avaliacoes') +@UseGuards(JwtAuthGuard) +@ApiBearerAuth() +export class AvaliacoesController { + constructor(private avaliacoesService: AvaliacoesService) {} + + @Get() + @ApiOperation({ summary: 'Listar todas as avaliações' }) + @ApiQuery({ name: 'propriedadeId', required: false, type: Number }) + @ApiQuery({ name: 'status', required: false, enum: StatusAvaliacao }) + @ApiResponse({ status: 200, description: 'Lista de avaliações' }) + findAll( + @Query('propriedadeId') propriedadeId?: number, + @Query('status') status?: StatusAvaliacao, + ) { + return this.avaliacoesService.findAll(propriedadeId, status); + } + + @Get(':id') + @ApiOperation({ summary: 'Buscar avaliação por ID' }) + @ApiResponse({ status: 200, description: 'Avaliação encontrada' }) + @ApiResponse({ status: 404, description: 'Avaliação não encontrada' }) + findOne(@Param('id', ParseIntPipe) id: number) { + return this.avaliacoesService.findOne(id); + } + + @Post() + @ApiOperation({ summary: 'Criar nova avaliação' }) + @ApiResponse({ status: 201, description: 'Avaliação criada com sucesso' }) + @ApiResponse({ status: 400, description: 'Propriedade não encontrada' }) + create(@Body() createAvaliacaoDto: CreateAvaliacaoDto, @Request() req: any) { + return this.avaliacoesService.create(createAvaliacaoDto, req.user.sub); + } + + @Put(':id') + @ApiOperation({ summary: 'Atualizar avaliação' }) + @ApiResponse({ status: 200, description: 'Avaliação atualizada' }) + @ApiResponse({ status: 404, description: 'Avaliação não encontrada' }) + update( + @Param('id', ParseIntPipe) id: number, + @Body() updateAvaliacaoDto: UpdateAvaliacaoDto, + ) { + return this.avaliacoesService.update(id, updateAvaliacaoDto); + } + + @Delete(':id') + @ApiOperation({ summary: 'Remover avaliação' }) + @ApiResponse({ status: 200, description: 'Avaliação removida' }) + @ApiResponse({ status: 404, description: 'Avaliação não encontrada' }) + remove(@Param('id', ParseIntPipe) id: number) { + return this.avaliacoesService.remove(id); + } + + @Post(':id/gerar-dds') + @ApiOperation({ summary: 'Gerar DDS (Due Diligence Statement) para avaliação' }) + @ApiResponse({ status: 200, description: 'DDS gerado com sucesso' }) + @ApiResponse({ status: 404, description: 'Avaliação não encontrada' }) + gerarDds(@Param('id', ParseIntPipe) id: number) { + return this.avaliacoesService.gerarDds(id); + } + + @Post(':id/submeter') + @ApiOperation({ summary: 'Submeter avaliação para análise' }) + @ApiResponse({ status: 200, description: 'Avaliação submetida' }) + @ApiResponse({ status: 400, description: 'DDS não gerado' }) + submeter(@Param('id', ParseIntPipe) id: number) { + return this.avaliacoesService.submeter(id); + } + + @Post(':id/aprovar') + @ApiOperation({ summary: 'Aprovar avaliação' }) + @ApiResponse({ status: 200, description: 'Avaliação aprovada' }) + aprovar(@Param('id', ParseIntPipe) id: number) { + return this.avaliacoesService.aprovar(id); + } + + @Post(':id/reprovar') + @ApiOperation({ summary: 'Reprovar avaliação' }) + @ApiResponse({ status: 200, description: 'Avaliação reprovada' }) + reprovar(@Param('id', ParseIntPipe) id: number, @Body('motivo') motivo?: string) { + return this.avaliacoesService.reprovar(id, motivo); + } +} diff --git a/backend/src/avaliacoes/avaliacoes.module.ts b/backend/src/avaliacoes/avaliacoes.module.ts new file mode 100644 index 0000000..91adaad --- /dev/null +++ b/backend/src/avaliacoes/avaliacoes.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { AvaliacoesController } from './avaliacoes.controller'; +import { AvaliacoesService } from './avaliacoes.service'; + +@Module({ + controllers: [AvaliacoesController], + providers: [AvaliacoesService], + exports: [AvaliacoesService], +}) +export class AvaliacoesModule {} diff --git a/backend/src/avaliacoes/avaliacoes.service.ts b/backend/src/avaliacoes/avaliacoes.service.ts new file mode 100644 index 0000000..e4fedae --- /dev/null +++ b/backend/src/avaliacoes/avaliacoes.service.ts @@ -0,0 +1,252 @@ +import { Injectable, NotFoundException, BadRequestException } from '@nestjs/common'; +import { PrismaService } from '../prisma/prisma.service'; +import { CreateAvaliacaoDto } from './dto/create-avaliacao.dto'; +import { UpdateAvaliacaoDto } from './dto/update-avaliacao.dto'; +import { StatusAvaliacao, NivelRisco } from '@prisma/client'; + +@Injectable() +export class AvaliacoesService { + constructor(private prisma: PrismaService) {} + + private generateReferencia(): string { + const timestamp = Date.now().toString(36).toUpperCase(); + const random = Math.random().toString(36).substring(2, 6).toUpperCase(); + return `DUO-${timestamp}-${random}`; + } + + async findAll(propriedadeId?: number, status?: StatusAvaliacao) { + const where: any = {}; + + if (propriedadeId) { + where.propriedadeId = propriedadeId; + } + + if (status) { + where.status = status; + } + + return this.prisma.avaliacao.findMany({ + where, + include: { + propriedade: { + select: { id: true, nome: true, codigoCar: true }, + include: { + empresa: { + select: { id: true, razaoSocial: true }, + }, + }, + }, + user: { + select: { id: true, nome: true, email: true }, + }, + _count: { + select: { documentos: true }, + }, + }, + orderBy: { createdAt: 'desc' }, + }); + } + + async findOne(id: number) { + const avaliacao = await this.prisma.avaliacao.findUnique({ + where: { id }, + include: { + propriedade: { + include: { + empresa: true, + }, + }, + user: { + select: { id: true, nome: true, email: true }, + }, + documentos: { + orderBy: { createdAt: 'desc' }, + }, + }, + }); + + if (!avaliacao) { + throw new NotFoundException('Avaliação não encontrada'); + } + + return avaliacao; + } + + async create(createAvaliacaoDto: CreateAvaliacaoDto, userId: number) { + // Verify propriedade exists + const propriedade = await this.prisma.propriedade.findUnique({ + where: { id: createAvaliacaoDto.propriedadeId }, + }); + + if (!propriedade) { + throw new BadRequestException('Propriedade não encontrada'); + } + + return this.prisma.avaliacao.create({ + data: { + ...createAvaliacaoDto, + userId, + referencia: this.generateReferencia(), + dataAvaliacao: new Date(), + }, + include: { + propriedade: { + select: { id: true, nome: true, codigoCar: true }, + }, + user: { + select: { id: true, nome: true, email: true }, + }, + }, + }); + } + + async update(id: number, updateAvaliacaoDto: UpdateAvaliacaoDto) { + await this.findOne(id); + + if (updateAvaliacaoDto.propriedadeId) { + const propriedade = await this.prisma.propriedade.findUnique({ + where: { id: updateAvaliacaoDto.propriedadeId }, + }); + + if (!propriedade) { + throw new BadRequestException('Propriedade não encontrada'); + } + } + + return this.prisma.avaliacao.update({ + where: { id }, + data: updateAvaliacaoDto, + include: { + propriedade: { + select: { id: true, nome: true, codigoCar: true }, + }, + user: { + select: { id: true, nome: true, email: true }, + }, + }, + }); + } + + async remove(id: number) { + await this.findOne(id); + await this.prisma.avaliacao.delete({ where: { id } }); + return { message: 'Avaliação removida com sucesso' }; + } + + async gerarDds(id: number) { + const avaliacao = await this.findOne(id); + + // DDS generation logic + const propriedade = avaliacao.propriedade; + const empresa = propriedade.empresa; + + const ddsData = { + referencia: avaliacao.referencia, + dataGeracao: new Date().toISOString(), + empresa: { + razaoSocial: empresa.razaoSocial, + cnpj: empresa.cnpj, + atividadeAgricola: empresa.atividadeAgricola, + }, + propriedade: { + nome: propriedade.nome, + codigoCar: propriedade.codigoCar, + areaHa: propriedade.areaHa, + coordenadas: { + latitude: propriedade.latitude, + longitude: propriedade.longitude, + }, + bioma: propriedade.bioma, + nivelRisco: propriedade.nivelRisco, + }, + avaliacao: { + id: avaliacao.id, + status: avaliacao.status, + nivelRisco: avaliacao.nivelRisco, + dataAvaliacao: avaliacao.dataAvaliacao, + observacoes: avaliacao.observacoes, + }, + eudr: { + conformidade: avaliacao.nivelRisco === 'BAIXO' || avaliacao.nivelRisco === 'MEDIO', + riscoDesmatamento: propriedade.flagDesmatamento || 'não verificado', + dataReferencia: '2020-12-31', + }, + }; + + // Update avaliacao with DDS result + const updated = await this.prisma.avaliacao.update({ + where: { id }, + data: { + resultadoDds: JSON.stringify(ddsData), + status: StatusAvaliacao.EM_ANALISE, + }, + include: { + propriedade: { + include: { empresa: true }, + }, + user: { + select: { id: true, nome: true, email: true }, + }, + }, + }); + + return { + avaliacao: updated, + dds: ddsData, + }; + } + + async submeter(id: number) { + const avaliacao = await this.findOne(id); + + if (avaliacao.status === StatusAvaliacao.APROVADA) { + throw new BadRequestException('Avaliação já aprovada'); + } + + if (!avaliacao.resultadoDds) { + throw new BadRequestException('DDS ainda não foi gerado. Execute gerar-dds primeiro.'); + } + + const euReference = `EU-${Date.now().toString(36).toUpperCase()}`; + + return this.prisma.avaliacao.update({ + where: { id }, + data: { + status: StatusAvaliacao.EM_ANALISE, + dataSubmissao: new Date(), + referenciaEu: euReference, + }, + include: { + propriedade: { + include: { empresa: true }, + }, + user: { + select: { id: true, nome: true, email: true }, + }, + }, + }); + } + + async aprovar(id: number) { + await this.findOne(id); + + return this.prisma.avaliacao.update({ + where: { id }, + data: { + status: StatusAvaliacao.APROVADA, + }, + }); + } + + async reprovar(id: number, motivo?: string) { + await this.findOne(id); + + return this.prisma.avaliacao.update({ + where: { id }, + data: { + status: StatusAvaliacao.REPROVADA, + observacoes: motivo, + }, + }); + } +} diff --git a/backend/src/avaliacoes/dto/create-avaliacao.dto.ts b/backend/src/avaliacoes/dto/create-avaliacao.dto.ts new file mode 100644 index 0000000..1cfd052 --- /dev/null +++ b/backend/src/avaliacoes/dto/create-avaliacao.dto.ts @@ -0,0 +1,24 @@ +import { IsNumber, IsOptional, IsEnum, IsString } from 'class-validator'; +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; +import { StatusAvaliacao, NivelRisco } from '@prisma/client'; + +export class CreateAvaliacaoDto { + @ApiProperty({ example: 1, description: 'ID da propriedade' }) + @IsNumber() + propriedadeId: number; + + @ApiPropertyOptional({ enum: StatusAvaliacao, default: 'RASCUNHO' }) + @IsOptional() + @IsEnum(StatusAvaliacao) + status?: StatusAvaliacao; + + @ApiPropertyOptional({ enum: NivelRisco, default: 'BAIXO' }) + @IsOptional() + @IsEnum(NivelRisco) + nivelRisco?: NivelRisco; + + @ApiPropertyOptional({ example: 'Observações sobre a avaliação' }) + @IsOptional() + @IsString() + observacoes?: string; +} diff --git a/backend/src/avaliacoes/dto/update-avaliacao.dto.ts b/backend/src/avaliacoes/dto/update-avaliacao.dto.ts new file mode 100644 index 0000000..02b7433 --- /dev/null +++ b/backend/src/avaliacoes/dto/update-avaliacao.dto.ts @@ -0,0 +1,4 @@ +import { PartialType } from '@nestjs/swagger'; +import { CreateAvaliacaoDto } from './create-avaliacao.dto'; + +export class UpdateAvaliacaoDto extends PartialType(CreateAvaliacaoDto) {} diff --git a/backend/src/dashboard/dashboard.controller.ts b/backend/src/dashboard/dashboard.controller.ts new file mode 100644 index 0000000..302be29 --- /dev/null +++ b/backend/src/dashboard/dashboard.controller.ts @@ -0,0 +1,19 @@ +import { Controller, Get, UseGuards } from '@nestjs/common'; +import { ApiTags, ApiOperation, ApiResponse, ApiBearerAuth } from '@nestjs/swagger'; +import { DashboardService } from './dashboard.service'; +import { JwtAuthGuard } from '../auth/jwt-auth.guard'; + +@ApiTags('dashboard') +@Controller('dashboard') +@UseGuards(JwtAuthGuard) +@ApiBearerAuth() +export class DashboardController { + constructor(private dashboardService: DashboardService) {} + + @Get('stats') + @ApiOperation({ summary: 'Obter estatísticas do dashboard' }) + @ApiResponse({ status: 200, description: 'Estatísticas retornadas' }) + getStats() { + return this.dashboardService.getStats(); + } +} diff --git a/backend/src/dashboard/dashboard.module.ts b/backend/src/dashboard/dashboard.module.ts new file mode 100644 index 0000000..c4a4a45 --- /dev/null +++ b/backend/src/dashboard/dashboard.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { DashboardController } from './dashboard.controller'; +import { DashboardService } from './dashboard.service'; + +@Module({ + controllers: [DashboardController], + providers: [DashboardService], +}) +export class DashboardModule {} diff --git a/backend/src/dashboard/dashboard.service.ts b/backend/src/dashboard/dashboard.service.ts new file mode 100644 index 0000000..32de06b --- /dev/null +++ b/backend/src/dashboard/dashboard.service.ts @@ -0,0 +1,137 @@ +import { Injectable } from '@nestjs/common'; +import { PrismaService } from '../prisma/prisma.service'; + +@Injectable() +export class DashboardService { + constructor(private prisma: PrismaService) {} + + async getStats() { + // Get counts + const [ + totalEmpresas, + totalPropriedades, + totalAvaliacoes, + totalDocumentos, + totalUsers, + ] = await Promise.all([ + this.prisma.empresa.count({ where: { ativo: true } }), + this.prisma.propriedade.count({ where: { ativo: true } }), + this.prisma.avaliacao.count(), + this.prisma.documento.count(), + this.prisma.user.count({ where: { ativo: true } }), + ]); + + // Avaliacoes by status + const avaliacoesByStatus = await this.prisma.avaliacao.groupBy({ + by: ['status'], + _count: { status: true }, + }); + + const statusCounts = { + RASCUNHO: 0, + EM_ANALISE: 0, + APROVADA: 0, + REPROVADA: 0, + }; + + avaliacoesByStatus.forEach((item) => { + statusCounts[item.status] = item._count.status; + }); + + // Propriedades by nivel risco + const propriedadesByRisco = await this.prisma.propriedade.groupBy({ + by: ['nivelRisco'], + _count: { nivelRisco: true }, + where: { ativo: true }, + }); + + const riscoCounts = { + BAIXO: 0, + MEDIO: 0, + ALTO: 0, + CRITICO: 0, + }; + + propriedadesByRisco.forEach((item) => { + riscoCounts[item.nivelRisco] = item._count.nivelRisco; + }); + + // Recent avaliacoes + const recentAvaliacoes = await this.prisma.avaliacao.findMany({ + take: 5, + orderBy: { createdAt: 'desc' }, + include: { + propriedade: { + select: { nome: true }, + }, + user: { + select: { nome: true }, + }, + }, + }); + + // Recent empresas + const recentEmpresas = await this.prisma.empresa.findMany({ + take: 5, + orderBy: { createdAt: 'desc' }, + select: { + id: true, + razaoSocial: true, + cnpj: true, + createdAt: true, + _count: { + select: { propriedades: true }, + }, + }, + }); + + // Monthly stats (last 6 months) + const sixMonthsAgo = new Date(); + sixMonthsAgo.setMonth(sixMonthsAgo.getMonth() - 6); + + const monthlyAvaliacoes = await this.prisma.avaliacao.groupBy({ + by: ['createdAt'], + _count: { id: true }, + where: { + createdAt: { gte: sixMonthsAgo }, + }, + }); + + // Group by month + const monthlyStats: Record = {}; + monthlyAvaliacoes.forEach((item) => { + const month = item.createdAt.toISOString().substring(0, 7); // YYYY-MM + monthlyStats[month] = (monthlyStats[month] || 0) + item._count.id; + }); + + return { + totais: { + empresas: totalEmpresas, + propriedades: totalPropriedades, + avaliacoes: totalAvaliacoes, + documentos: totalDocumentos, + usuarios: totalUsers, + }, + avaliacoesPorStatus: statusCounts, + propriedadesPorRisco: riscoCounts, + recentAvaliacoes: recentAvaliacoes.map((a) => ({ + id: a.id, + referencia: a.referencia, + status: a.status, + propriedade: a.propriedade.nome, + responsavel: a.user.nome, + createdAt: a.createdAt, + })), + recentEmpresas: recentEmpresas.map((e) => ({ + id: e.id, + razaoSocial: e.razaoSocial, + cnpj: e.cnpj, + propriedades: e._count.propriedades, + createdAt: e.createdAt, + })), + graficos: { + avaliacoesMensais: monthlyStats, + }, + }; + } +} diff --git a/backend/src/documentos/documentos.controller.ts b/backend/src/documentos/documentos.controller.ts new file mode 100644 index 0000000..c13ada9 --- /dev/null +++ b/backend/src/documentos/documentos.controller.ts @@ -0,0 +1,98 @@ +import { + Controller, + Get, + Post, + Delete, + Param, + Query, + ParseIntPipe, + UseGuards, + UseInterceptors, + UploadedFile, + Request, + Res, + StreamableFile, +} from '@nestjs/common'; +import { FileInterceptor } from '@nestjs/platform-express'; +import { ApiTags, ApiOperation, ApiResponse, ApiBearerAuth, ApiConsumes, ApiQuery, ApiBody } from '@nestjs/swagger'; +import { Response } from 'express'; +import * as fs from 'fs'; +import { DocumentosService } from './documentos.service'; +import { JwtAuthGuard } from '../auth/jwt-auth.guard'; + +@ApiTags('documentos') +@Controller('documentos') +@UseGuards(JwtAuthGuard) +@ApiBearerAuth() +export class DocumentosController { + constructor(private documentosService: DocumentosService) {} + + @Get() + @ApiOperation({ summary: 'Listar todos os documentos' }) + @ApiQuery({ name: 'propriedadeId', required: false, type: Number }) + @ApiQuery({ name: 'avaliacaoId', required: false, type: Number }) + @ApiResponse({ status: 200, description: 'Lista de documentos' }) + findAll( + @Query('propriedadeId') propriedadeId?: number, + @Query('avaliacaoId') avaliacaoId?: number, + ) { + return this.documentosService.findAll(propriedadeId, avaliacaoId); + } + + @Get(':id') + @ApiOperation({ summary: 'Buscar documento por ID' }) + @ApiResponse({ status: 200, description: 'Documento encontrado' }) + @ApiResponse({ status: 404, description: 'Documento não encontrado' }) + findOne(@Param('id', ParseIntPipe) id: number) { + return this.documentosService.findOne(id); + } + + @Get(':id/download') + @ApiOperation({ summary: 'Download do arquivo' }) + @ApiResponse({ status: 200, description: 'Arquivo retornado' }) + @ApiResponse({ status: 404, description: 'Arquivo não encontrado' }) + async download(@Param('id', ParseIntPipe) id: number, @Res({ passthrough: true }) res: Response) { + const fileInfo = await this.documentosService.getFilePath(id); + + const file = fs.createReadStream(fileInfo.path); + + res.set({ + 'Content-Type': fileInfo.mimeType || 'application/octet-stream', + 'Content-Disposition': `attachment; filename="${encodeURIComponent(fileInfo.nome)}"`, + }); + + return new StreamableFile(file); + } + + @Post('upload') + @ApiOperation({ summary: 'Upload de documento' }) + @ApiConsumes('multipart/form-data') + @ApiBody({ + schema: { + type: 'object', + properties: { + file: { type: 'string', format: 'binary' }, + propriedadeId: { type: 'number' }, + avaliacaoId: { type: 'number' }, + }, + }, + }) + @ApiResponse({ status: 201, description: 'Documento enviado com sucesso' }) + @UseInterceptors(FileInterceptor('file')) + async upload( + @UploadedFile() file: Express.Multer.File, + @Request() req: any, + @Query('propriedadeId') propriedadeId?: number, + @Query('avaliacaoId') avaliacaoId?: number, + ) { + return this.documentosService.create(file, req.user.sub, propriedadeId, avaliacaoId); + } + + @Delete(':id') + @ApiOperation({ summary: 'Remover documento' }) + @ApiResponse({ status: 200, description: 'Documento removido' }) + @ApiResponse({ status: 404, description: 'Documento não encontrado' }) + remove(@Param('id', ParseIntPipe) id: number) { + return this.documentosService.remove(id); + } +} diff --git a/backend/src/documentos/documentos.module.ts b/backend/src/documentos/documentos.module.ts new file mode 100644 index 0000000..88ebeea --- /dev/null +++ b/backend/src/documentos/documentos.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { DocumentosController } from './documentos.controller'; +import { DocumentosService } from './documentos.service'; + +@Module({ + controllers: [DocumentosController], + providers: [DocumentosService], + exports: [DocumentosService], +}) +export class DocumentosModule {} diff --git a/backend/src/documentos/documentos.service.ts b/backend/src/documentos/documentos.service.ts new file mode 100644 index 0000000..9984f86 --- /dev/null +++ b/backend/src/documentos/documentos.service.ts @@ -0,0 +1,168 @@ +import { Injectable, NotFoundException, BadRequestException } from '@nestjs/common'; +import { PrismaService } from '../prisma/prisma.service'; +import * as fs from 'fs'; +import * as path from 'path'; + +interface CreateDocumentoData { + nome: string; + tipo?: string; + tamanho?: number; + mimeType?: string; + path: string; + propriedadeId?: number; + avaliacaoId?: number; + userId: number; +} + +@Injectable() +export class DocumentosService { + private readonly uploadPath = path.join(process.cwd(), 'uploads'); + + constructor(private prisma: PrismaService) { + // Ensure uploads directory exists + if (!fs.existsSync(this.uploadPath)) { + fs.mkdirSync(this.uploadPath, { recursive: true }); + } + } + + async findAll(propriedadeId?: number, avaliacaoId?: number) { + const where: any = {}; + + if (propriedadeId) { + where.propriedadeId = propriedadeId; + } + + if (avaliacaoId) { + where.avaliacaoId = avaliacaoId; + } + + return this.prisma.documento.findMany({ + where, + include: { + propriedade: { + select: { id: true, nome: true }, + }, + avaliacao: { + select: { id: true, referencia: true }, + }, + user: { + select: { id: true, nome: true }, + }, + }, + orderBy: { createdAt: 'desc' }, + }); + } + + async findOne(id: number) { + const documento = await this.prisma.documento.findUnique({ + where: { id }, + include: { + propriedade: { + select: { id: true, nome: true }, + }, + avaliacao: { + select: { id: true, referencia: true }, + }, + user: { + select: { id: true, nome: true }, + }, + }, + }); + + if (!documento) { + throw new NotFoundException('Documento não encontrado'); + } + + return documento; + } + + async create( + file: Express.Multer.File, + userId: number, + propriedadeId?: number, + avaliacaoId?: number, + ) { + if (!file) { + throw new BadRequestException('Arquivo é obrigatório'); + } + + // Validate associations + if (propriedadeId) { + const propriedade = await this.prisma.propriedade.findUnique({ + where: { id: propriedadeId }, + }); + if (!propriedade) { + throw new BadRequestException('Propriedade não encontrada'); + } + } + + if (avaliacaoId) { + const avaliacao = await this.prisma.avaliacao.findUnique({ + where: { id: avaliacaoId }, + }); + if (!avaliacao) { + throw new BadRequestException('Avaliação não encontrada'); + } + } + + // Generate unique filename + const timestamp = Date.now(); + const ext = path.extname(file.originalname); + const filename = `${timestamp}-${Math.random().toString(36).substring(7)}${ext}`; + const filePath = path.join(this.uploadPath, filename); + + // Save file + fs.writeFileSync(filePath, file.buffer); + + // Create database record + return this.prisma.documento.create({ + data: { + nome: file.originalname, + tipo: ext.replace('.', '').toUpperCase(), + tamanho: file.size, + mimeType: file.mimetype, + path: filePath, + propriedadeId, + avaliacaoId, + userId, + }, + include: { + propriedade: { + select: { id: true, nome: true }, + }, + avaliacao: { + select: { id: true, referencia: true }, + }, + user: { + select: { id: true, nome: true }, + }, + }, + }); + } + + async remove(id: number) { + const documento = await this.findOne(id); + + // Delete file from filesystem + if (fs.existsSync(documento.path)) { + fs.unlinkSync(documento.path); + } + + await this.prisma.documento.delete({ where: { id } }); + return { message: 'Documento removido com sucesso' }; + } + + async getFilePath(id: number): Promise<{ path: string; nome: string; mimeType: string | null }> { + const documento = await this.findOne(id); + + if (!fs.existsSync(documento.path)) { + throw new NotFoundException('Arquivo não encontrado no servidor'); + } + + return { + path: documento.path, + nome: documento.nome, + mimeType: documento.mimeType, + }; + } +} diff --git a/backend/src/empresas/dto/create-empresa.dto.ts b/backend/src/empresas/dto/create-empresa.dto.ts new file mode 100644 index 0000000..de74191 --- /dev/null +++ b/backend/src/empresas/dto/create-empresa.dto.ts @@ -0,0 +1,69 @@ +import { IsString, IsOptional, IsBoolean, Matches, IsEmail, MinLength } from 'class-validator'; +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; + +export class CreateEmpresaDto { + @ApiProperty({ example: 'Fazenda Bom Sucesso Ltda' }) + @IsString() + @MinLength(3, { message: 'Razão social deve ter no mínimo 3 caracteres' }) + razaoSocial: string; + + @ApiPropertyOptional({ example: 'Fazenda Bom Sucesso' }) + @IsOptional() + @IsString() + nomeFantasia?: string; + + @ApiProperty({ example: '12.345.678/0001-90' }) + @IsString() + @Matches(/^\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}$/, { message: 'CNPJ inválido. Use o formato XX.XXX.XXX/XXXX-XX' }) + cnpj: string; + + @ApiPropertyOptional({ example: '123.456.789.012' }) + @IsOptional() + @IsString() + inscricaoEstadual?: string; + + @ApiPropertyOptional({ example: 'Soja, Milho, Café' }) + @IsOptional() + @IsString() + atividadeAgricola?: string; + + @ApiPropertyOptional({ example: 'Rodovia BR-050, Km 45' }) + @IsOptional() + @IsString() + endereco?: string; + + @ApiPropertyOptional({ example: 'Uberlândia' }) + @IsOptional() + @IsString() + cidade?: string; + + @ApiPropertyOptional({ example: 'MG' }) + @IsOptional() + @IsString() + estado?: string; + + @ApiPropertyOptional({ example: '38400-000' }) + @IsOptional() + @IsString() + cep?: string; + + @ApiPropertyOptional({ example: '(34) 99999-0000' }) + @IsOptional() + @IsString() + telefone?: string; + + @ApiPropertyOptional({ example: 'contato@fazenda.com.br' }) + @IsOptional() + @IsEmail({}, { message: 'Email inválido' }) + email?: string; + + @ApiPropertyOptional({ example: 'João da Silva' }) + @IsOptional() + @IsString() + responsavel?: string; + + @ApiPropertyOptional({ default: true }) + @IsOptional() + @IsBoolean() + ativo?: boolean; +} diff --git a/backend/src/empresas/dto/update-empresa.dto.ts b/backend/src/empresas/dto/update-empresa.dto.ts new file mode 100644 index 0000000..4c5e6bc --- /dev/null +++ b/backend/src/empresas/dto/update-empresa.dto.ts @@ -0,0 +1,4 @@ +import { PartialType } from '@nestjs/swagger'; +import { CreateEmpresaDto } from './create-empresa.dto'; + +export class UpdateEmpresaDto extends PartialType(CreateEmpresaDto) {} diff --git a/backend/src/empresas/empresas.controller.ts b/backend/src/empresas/empresas.controller.ts new file mode 100644 index 0000000..032a2f9 --- /dev/null +++ b/backend/src/empresas/empresas.controller.ts @@ -0,0 +1,61 @@ +import { Controller, Get, Post, Put, Delete, Patch, Body, Param, Query, ParseIntPipe, UseGuards } from '@nestjs/common'; +import { ApiTags, ApiOperation, ApiResponse, ApiBearerAuth, ApiQuery } from '@nestjs/swagger'; +import { EmpresasService } from './empresas.service'; +import { CreateEmpresaDto } from './dto/create-empresa.dto'; +import { UpdateEmpresaDto } from './dto/update-empresa.dto'; +import { JwtAuthGuard } from '../auth/jwt-auth.guard'; + +@ApiTags('empresas') +@Controller('empresas') +@UseGuards(JwtAuthGuard) +@ApiBearerAuth() +export class EmpresasController { + constructor(private empresasService: EmpresasService) {} + + @Get() + @ApiOperation({ summary: 'Listar todas as empresas' }) + @ApiQuery({ name: 'includeInactive', required: false, type: Boolean }) + @ApiResponse({ status: 200, description: 'Lista de empresas' }) + findAll(@Query('includeInactive') includeInactive?: boolean) { + return this.empresasService.findAll(includeInactive); + } + + @Get(':id') + @ApiOperation({ summary: 'Buscar empresa por ID' }) + @ApiResponse({ status: 200, description: 'Empresa encontrada' }) + @ApiResponse({ status: 404, description: 'Empresa não encontrada' }) + findOne(@Param('id', ParseIntPipe) id: number) { + return this.empresasService.findOne(id); + } + + @Post() + @ApiOperation({ summary: 'Criar nova empresa' }) + @ApiResponse({ status: 201, description: 'Empresa criada com sucesso' }) + @ApiResponse({ status: 409, description: 'CNPJ já cadastrado' }) + create(@Body() createEmpresaDto: CreateEmpresaDto) { + return this.empresasService.create(createEmpresaDto); + } + + @Put(':id') + @ApiOperation({ summary: 'Atualizar empresa' }) + @ApiResponse({ status: 200, description: 'Empresa atualizada' }) + @ApiResponse({ status: 404, description: 'Empresa não encontrada' }) + update(@Param('id', ParseIntPipe) id: number, @Body() updateEmpresaDto: UpdateEmpresaDto) { + return this.empresasService.update(id, updateEmpresaDto); + } + + @Delete(':id') + @ApiOperation({ summary: 'Remover empresa' }) + @ApiResponse({ status: 200, description: 'Empresa removida' }) + @ApiResponse({ status: 404, description: 'Empresa não encontrada' }) + remove(@Param('id', ParseIntPipe) id: number) { + return this.empresasService.remove(id); + } + + @Patch(':id/toggle-active') + @ApiOperation({ summary: 'Ativar/Desativar empresa' }) + @ApiResponse({ status: 200, description: 'Status alterado' }) + toggleActive(@Param('id', ParseIntPipe) id: number) { + return this.empresasService.toggleActive(id); + } +} diff --git a/backend/src/empresas/empresas.module.ts b/backend/src/empresas/empresas.module.ts new file mode 100644 index 0000000..4f8c099 --- /dev/null +++ b/backend/src/empresas/empresas.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { EmpresasController } from './empresas.controller'; +import { EmpresasService } from './empresas.service'; + +@Module({ + controllers: [EmpresasController], + providers: [EmpresasService], + exports: [EmpresasService], +}) +export class EmpresasModule {} diff --git a/backend/src/empresas/empresas.service.ts b/backend/src/empresas/empresas.service.ts new file mode 100644 index 0000000..336ea70 --- /dev/null +++ b/backend/src/empresas/empresas.service.ts @@ -0,0 +1,107 @@ +import { Injectable, NotFoundException, ConflictException } from '@nestjs/common'; +import { PrismaService } from '../prisma/prisma.service'; +import { CreateEmpresaDto } from './dto/create-empresa.dto'; +import { UpdateEmpresaDto } from './dto/update-empresa.dto'; + +@Injectable() +export class EmpresasService { + constructor(private prisma: PrismaService) {} + + async findAll(includeInactive = false) { + return this.prisma.empresa.findMany({ + where: includeInactive ? {} : { ativo: true }, + include: { + propriedades: { + where: { ativo: true }, + select: { id: true, nome: true }, + }, + _count: { + select: { propriedades: true }, + }, + }, + orderBy: { createdAt: 'desc' }, + }); + } + + async findOne(id: number) { + const empresa = await this.prisma.empresa.findUnique({ + where: { id }, + include: { + propriedades: { + where: { ativo: true }, + }, + _count: { + select: { propriedades: true }, + }, + }, + }); + + if (!empresa) { + throw new NotFoundException('Empresa não encontrada'); + } + + return empresa; + } + + async create(createEmpresaDto: CreateEmpresaDto) { + const existingCnpj = await this.prisma.empresa.findUnique({ + where: { cnpj: createEmpresaDto.cnpj }, + }); + + if (existingCnpj) { + throw new ConflictException('CNPJ já cadastrado'); + } + + return this.prisma.empresa.create({ + data: createEmpresaDto, + include: { + propriedades: true, + _count: { + select: { propriedades: true }, + }, + }, + }); + } + + async update(id: number, updateEmpresaDto: UpdateEmpresaDto) { + await this.findOne(id); + + if (updateEmpresaDto.cnpj) { + const existingCnpj = await this.prisma.empresa.findFirst({ + where: { + cnpj: updateEmpresaDto.cnpj, + NOT: { id }, + }, + }); + + if (existingCnpj) { + throw new ConflictException('CNPJ já cadastrado'); + } + } + + return this.prisma.empresa.update({ + where: { id }, + data: updateEmpresaDto, + include: { + propriedades: true, + _count: { + select: { propriedades: true }, + }, + }, + }); + } + + async remove(id: number) { + await this.findOne(id); + await this.prisma.empresa.delete({ where: { id } }); + return { message: 'Empresa removida com sucesso' }; + } + + async toggleActive(id: number) { + const empresa = await this.findOne(id); + return this.prisma.empresa.update({ + where: { id }, + data: { ativo: !empresa.ativo }, + }); + } +} diff --git a/backend/src/eudr-api/dto/amend-dds.dto.ts b/backend/src/eudr-api/dto/amend-dds.dto.ts new file mode 100644 index 0000000..3b6fa4b --- /dev/null +++ b/backend/src/eudr-api/dto/amend-dds.dto.ts @@ -0,0 +1,58 @@ +import { IsString, IsOptional, IsBoolean, ValidateNested, IsArray, IsUUID } from 'class-validator'; +import { Type } from 'class-transformer'; +import { CommodityDto, OperatorAddressDto, ReferencedDdsDto } from './common.dto'; + +/** + * Request DTO for amending an existing DDS + * Note: Activity type cannot be changed + */ +export class AmendDdsRequestDto { + @IsUUID() + uuid: string; + + @IsBoolean() + confidentialityFlag: boolean; + + @IsOptional() + @IsString() + companyInternalReference?: string; + + /** + * Required when amending as Authorized Representative (V2) + */ + @IsOptional() + @ValidateNested() + @Type(() => OperatorAddressDto) + onBehalfOfOperator?: OperatorAddressDto; + + @IsArray() + @ValidateNested({ each: true }) + @Type(() => CommodityDto) + commodities: CommodityDto[]; + + @IsOptional() + @IsArray() + @ValidateNested({ each: true }) + @Type(() => ReferencedDdsDto) + referencedDds?: ReferencedDdsDto[]; +} + +/** + * Response DTO for DDS amendment + */ +export class AmendDdsResponseDto { + /** + * HTTP status code (200 = success) + */ + httpStatus: number; + + /** + * Success indicator + */ + success: boolean; + + /** + * Raw SOAP response for debugging + */ + rawResponse?: string; +} diff --git a/backend/src/eudr-api/dto/common.dto.ts b/backend/src/eudr-api/dto/common.dto.ts new file mode 100644 index 0000000..e9ccff2 --- /dev/null +++ b/backend/src/eudr-api/dto/common.dto.ts @@ -0,0 +1,196 @@ +import { IsString, IsOptional, IsNumber, IsEnum, IsBoolean, Min, Max, ValidateNested, IsArray } from 'class-validator'; +import { Type } from 'class-transformer'; + +/** + * Activity types allowed in EUDR DDS + */ +export enum ActivityType { + IMPORT = 'IMPORT', + EXPORT = 'EXPORT', + DOMESTIC = 'DOMESTIC', + TRADE = 'TRADE', +} + +/** + * DDS Status values returned by the API + */ +export enum DDSStatus { + SUBMITTED = 'SUBMITTED', + AVAILABLE = 'AVAILABLE', + REJECTED = 'REJECTED', + WITHDRAWN = 'WITHDRAWN', + CANCELLED = 'CANCELLED', + ARCHIVED = 'ARCHIVED', + EXPIRED = 'EXPIRED', +} + +/** + * Supplementary Unit Types for measurements + */ +export enum SupplementaryUnitType { + KSD = 'KSD', // Kilogram of substance 90% dry + MTK = 'MTK', // Square metre + MTQ = 'MTQ', // Cubic metre + MTR = 'MTR', // Metre + NAR = 'NAR', // Number of items + NPR = 'NPR', // Number of pairs +} + +/** + * Operator address for Authorized Representative submissions + */ +export class OperatorAddressDto { + @IsString() + name: string; + + @IsString() + streetNumber: string; + + @IsString() + postalCode: string; + + @IsString() + city: string; + + @IsString() + countryCode: string; + + @IsOptional() + @IsString() + eori?: string; +} + +/** + * GeoLocation data for a production place + */ +export class GeoLocationDto { + @IsString() + geoJson: string; // GeoJSON FeatureCollection as string + + @IsOptional() + @IsNumber() + @Min(0.1) + @Max(4) + area?: number; // Area in hectares (for points) +} + +/** + * Producer information within a commodity + */ +export class ProducerDto { + @IsString() + countryCode: string; + + @IsOptional() + @IsString() + producerName?: string; + + @ValidateNested() + @Type(() => GeoLocationDto) + geoLocation: GeoLocationDto; +} + +/** + * Species information for timber products + */ +export class SpeciesInfoDto { + @IsString() + scientificName: string; + + @IsString() + commonName: string; +} + +/** + * Commodity data for DDS submission + */ +export class CommodityDto { + @IsString() + hsCode: string; + + @IsString() + description: string; + + @IsOptional() + @IsNumber() + @Min(0) + netMass?: number; // Required for IMPORT/EXPORT + + @IsOptional() + @IsNumber() + @Min(0) + @Max(50) + percentageEstimateOrDeviation?: number; // Required for DOMESTIC/TRADE (0-25 typical) + + @IsOptional() + @IsEnum(SupplementaryUnitType) + supplementaryUnitType?: SupplementaryUnitType; + + @IsOptional() + @IsNumber() + @Min(0) + supplementaryUnitValue?: number; + + @IsArray() + @ValidateNested({ each: true }) + @Type(() => ProducerDto) + producers: ProducerDto[]; + + @IsOptional() + @IsArray() + @ValidateNested({ each: true }) + @Type(() => SpeciesInfoDto) + speciesInfo?: SpeciesInfoDto[]; // Required for timber + + @IsOptional() + @IsArray() + @IsString({ each: true }) + referencedDdsNumbers?: string[]; // Reference numbers of upstream DDS +} + +/** + * Referenced DDS with verification number + */ +export class ReferencedDdsDto { + @IsString() + referenceNumber: string; + + @IsString() + verificationNumber: string; +} + +/** + * EUDR API Error response + */ +export class EudrApiErrorDto { + @IsString() + code: string; + + @IsString() + message: string; + + @IsOptional() + @IsString() + field?: string; +} + +/** + * Base response for EUDR API calls + */ +export class EudrApiResponseDto { + @IsBoolean() + success: boolean; + + @IsOptional() + data?: T; + + @IsOptional() + @IsArray() + @ValidateNested({ each: true }) + @Type(() => EudrApiErrorDto) + errors?: EudrApiErrorDto[]; + + @IsOptional() + @IsString() + rawResponse?: string; // For debugging +} diff --git a/backend/src/eudr-api/dto/get-dds-data.dto.ts b/backend/src/eudr-api/dto/get-dds-data.dto.ts new file mode 100644 index 0000000..777a3c1 --- /dev/null +++ b/backend/src/eudr-api/dto/get-dds-data.dto.ts @@ -0,0 +1,86 @@ +import { IsString } from 'class-validator'; +import { ActivityType, CommodityDto, DDSStatus } from './common.dto'; + +/** + * Request DTO for getting full DDS data by identifiers + */ +export class GetDdsDataRequestDto { + @IsString() + referenceNumber: string; + + @IsString() + verificationNumber: string; +} + +/** + * Request DTO for getting referenced DDS without verification number + * Uses the referenceDdsVerificationNumber from previous getStatementByIdentifiers call + */ +export class GetReferencedDdsRequestDto { + @IsString() + referenceNumber: string; + + @IsString() + referenceDdsVerificationNumber: string; // Security number from previous call +} + +/** + * Referenced DDS info with security number for chain traversal + */ +export class ReferencedDdsInfoDto { + referenceNumber: string; + referenceDdsVerificationNumber: string; // Use this to get the referenced DDS data +} + +/** + * Full DDS data returned by getStatementByIdentifiers + */ +export class DdsDataDto { + referenceNumber: string; + verificationNumber: string; + status: DDSStatus; + activityType: ActivityType; + availabilityDate?: string; + + /** + * Operator info + */ + operatorName?: string; + operatorCountry?: string; + + /** + * Commodities with full details + */ + commodities: CommodityDto[]; + + /** + * GeoLocation visibility flag + */ + showGeoLocation: boolean; + + /** + * Referenced DDS in the supply chain + * Each includes a security number for recursive retrieval + */ + referencedDds: ReferencedDdsInfoDto[]; +} + +/** + * Response DTO for getStatementByIdentifiers / getReferencedDds + */ +export class GetDdsDataResponseDto { + /** + * HTTP status code + */ + httpStatus: number; + + /** + * Full DDS data + */ + ddsData?: DdsDataDto; + + /** + * Raw SOAP response for debugging + */ + rawResponse?: string; +} diff --git a/backend/src/eudr-api/dto/get-dds-info.dto.ts b/backend/src/eudr-api/dto/get-dds-info.dto.ts new file mode 100644 index 0000000..9e7f1e5 --- /dev/null +++ b/backend/src/eudr-api/dto/get-dds-info.dto.ts @@ -0,0 +1,54 @@ +import { IsString, IsOptional, IsArray, IsUUID } from 'class-validator'; +import { DDSStatus } from './common.dto'; + +/** + * Request DTO for getting DDS info by UUID(s) + */ +export class GetDdsInfoByUuidRequestDto { + @IsArray() + @IsUUID('4', { each: true }) + uuids: string[]; // Max 100 UUIDs per request +} + +/** + * Request DTO for getting DDS info by internal reference + */ +export class GetDdsInfoByReferenceRequestDto { + @IsString() + internalReference: string; // Min 3, max 50 chars - partial matching, case insensitive +} + +/** + * Single DDS info returned by the API + */ +export class DdsInfoDto { + uuid: string; + status: DDSStatus; + referenceNumber?: string; // Only available when status is AVAILABLE/ARCHIVED/EXPIRED/WITHDRAWN + verificationNumber?: string; + internalReference?: string; + caMessage?: string; // Communication from Competent Authority + rejectionReason?: string; // If status is REJECTED +} + +/** + * Response DTO for getDDSInfo + */ +export class GetDdsInfoResponseDto { + /** + * HTTP status code + */ + httpStatus: number; + + /** + * List of DDS info records + * - Max 100 when queried by UUID + * - Max 1000 when queried by internal reference + */ + ddsInfoList: DdsInfoDto[]; + + /** + * Raw SOAP response for debugging + */ + rawResponse?: string; +} diff --git a/backend/src/eudr-api/dto/index.ts b/backend/src/eudr-api/dto/index.ts new file mode 100644 index 0000000..d7e88ed --- /dev/null +++ b/backend/src/eudr-api/dto/index.ts @@ -0,0 +1,7 @@ +// Export all DTOs +export * from './submit-dds.dto'; +export * from './amend-dds.dto'; +export * from './retract-dds.dto'; +export * from './get-dds-info.dto'; +export * from './get-dds-data.dto'; +export * from './common.dto'; diff --git a/backend/src/eudr-api/dto/retract-dds.dto.ts b/backend/src/eudr-api/dto/retract-dds.dto.ts new file mode 100644 index 0000000..34ed616 --- /dev/null +++ b/backend/src/eudr-api/dto/retract-dds.dto.ts @@ -0,0 +1,31 @@ +import { IsUUID } from 'class-validator'; + +/** + * Request DTO for retracting (cancelling/withdrawing) a DDS + * - SUBMITTED status: Cancels the DDS + * - AVAILABLE status: Withdraws the DDS + */ +export class RetractDdsRequestDto { + @IsUUID() + uuid: string; +} + +/** + * Response DTO for DDS retraction + */ +export class RetractDdsResponseDto { + /** + * HTTP status code (200 = success) + */ + httpStatus: number; + + /** + * Success indicator + */ + success: boolean; + + /** + * Raw SOAP response for debugging + */ + rawResponse?: string; +} diff --git a/backend/src/eudr-api/dto/submit-dds.dto.ts b/backend/src/eudr-api/dto/submit-dds.dto.ts new file mode 100644 index 0000000..4eefb0d --- /dev/null +++ b/backend/src/eudr-api/dto/submit-dds.dto.ts @@ -0,0 +1,60 @@ +import { IsString, IsOptional, IsEnum, IsBoolean, ValidateNested, IsArray } from 'class-validator'; +import { Type } from 'class-transformer'; +import { ActivityType, CommodityDto, OperatorAddressDto, ReferencedDdsDto } from './common.dto'; + +/** + * Request DTO for submitting a new DDS + */ +export class SubmitDdsRequestDto { + @IsEnum(ActivityType) + activityType: ActivityType; + + @IsBoolean() + confidentialityFlag: boolean; + + @IsOptional() + @IsString() + companyInternalReference?: string; // Max 50 chars + + /** + * Required when submitting as Authorized Representative + */ + @IsOptional() + @ValidateNested() + @Type(() => OperatorAddressDto) + onBehalfOfOperator?: OperatorAddressDto; + + @IsArray() + @ValidateNested({ each: true }) + @Type(() => CommodityDto) + commodities: CommodityDto[]; + + /** + * Referenced DDS from upstream supply chain + */ + @IsOptional() + @IsArray() + @ValidateNested({ each: true }) + @Type(() => ReferencedDdsDto) + referencedDds?: ReferencedDdsDto[]; +} + +/** + * Response DTO for DDS submission + */ +export class SubmitDdsResponseDto { + /** + * UUID assigned by EUDR system - use this for subsequent operations + */ + uuid: string; + + /** + * HTTP status code from the API + */ + httpStatus: number; + + /** + * Raw SOAP response for debugging + */ + rawResponse?: string; +} diff --git a/backend/src/eudr-api/eudr-api.controller.ts b/backend/src/eudr-api/eudr-api.controller.ts new file mode 100644 index 0000000..4caf4de --- /dev/null +++ b/backend/src/eudr-api/eudr-api.controller.ts @@ -0,0 +1,137 @@ +import { Controller, Get, Post, Body, HttpCode, HttpStatus, UseGuards } from '@nestjs/common'; +import { EudrApiService } from './eudr-api.service'; +import { SubmitDdsRequestDto } from './dto/submit-dds.dto'; +import { AmendDdsRequestDto } from './dto/amend-dds.dto'; +import { RetractDdsRequestDto } from './dto/retract-dds.dto'; +import { GetDdsInfoByUuidRequestDto, GetDdsInfoByReferenceRequestDto } from './dto/get-dds-info.dto'; +import { GetDdsDataRequestDto, GetReferencedDdsRequestDto } from './dto/get-dds-data.dto'; +// import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard'; // Uncomment when auth is ready + +/** + * EUDR API Controller + * + * Internal endpoints for DuOrigin to interact with the EU EUDR system. + * These endpoints act as a proxy/adapter between our REST API and the EUDR SOAP API. + */ +@Controller('api/eudr') +// @UseGuards(JwtAuthGuard) // Uncomment when auth is ready +export class EudrApiController { + constructor(private readonly eudrApiService: EudrApiService) {} + + /** + * Get EUDR API configuration status + */ + @Get('status') + async getStatus() { + const envInfo = this.eudrApiService.getEnvironmentInfo(); + const isConfigured = this.eudrApiService.isConfigured(); + + return { + configured: isConfigured, + environment: envInfo.isProduction ? 'PRODUCTION' : 'ACCEPTANCE', + wsClientId: envInfo.wsClientId, + baseUrl: envInfo.baseUrl, + services: { + echo: !envInfo.isProduction, + submit: true, + amend: true, + retract: true, + getDdsInfo: true, + getDdsData: true, + getReferencedDds: true, + }, + }; + } + + /** + * CF1 - Test connection and authentication (ACCEPTANCE only) + */ + @Post('echo') + @HttpCode(HttpStatus.OK) + async testEcho(@Body() body: { message?: string }) { + return this.eudrApiService.testEcho(body?.message || 'DuOrigin Echo Test'); + } + + /** + * CF2 - Submit a new DDS + * + * Submits a Due Diligence Statement to the EUDR system. + * Returns the UUID assigned by the system for tracking. + */ + @Post('submit-dds') + @HttpCode(HttpStatus.OK) + async submitDds(@Body() request: SubmitDdsRequestDto) { + return this.eudrApiService.submitDds(request); + } + + /** + * CF5 - Amend an existing DDS + * + * Modifies a DDS that is in AVAILABLE status. + * Note: Activity type cannot be changed. + */ + @Post('amend-dds') + @HttpCode(HttpStatus.OK) + async amendDds(@Body() request: AmendDdsRequestDto) { + return this.eudrApiService.amendDds(request); + } + + /** + * CF6 - Retract a DDS + * + * Cancels (if SUBMITTED) or withdraws (if AVAILABLE) a DDS. + */ + @Post('retract-dds') + @HttpCode(HttpStatus.OK) + async retractDds(@Body() request: RetractDdsRequestDto) { + return this.eudrApiService.retractDds(request); + } + + /** + * CF3 - Get DDS info by UUID(s) + * + * Retrieves status and reference numbers for submitted DDS. + * Max 100 UUIDs per request. + */ + @Post('get-dds-info') + @HttpCode(HttpStatus.OK) + async getDdsInfoByUuid(@Body() request: GetDdsInfoByUuidRequestDto) { + return this.eudrApiService.getDdsInfoByUuid(request); + } + + /** + * CF3 - Get DDS info by internal reference + * + * Retrieves DDS matching the internal reference (partial match). + * Max 1000 results. + */ + @Post('get-dds-info-by-reference') + @HttpCode(HttpStatus.OK) + async getDdsInfoByReference(@Body() request: GetDdsInfoByReferenceRequestDto) { + return this.eudrApiService.getDdsInfoByReference(request); + } + + /** + * CF7 - Get full DDS data + * + * Retrieves complete DDS data by reference and verification numbers. + * Use this to get DDS from other operators in the supply chain. + */ + @Post('get-dds-data') + @HttpCode(HttpStatus.OK) + async getDdsData(@Body() request: GetDdsDataRequestDto) { + return this.eudrApiService.getDdsData(request); + } + + /** + * CF7 - Get referenced DDS in supply chain + * + * Retrieves DDS data without verification number. + * Uses the security number from previous getDdsData call. + */ + @Post('get-referenced-dds') + @HttpCode(HttpStatus.OK) + async getReferencedDds(@Body() request: GetReferencedDdsRequestDto) { + return this.eudrApiService.getReferencedDds(request); + } +} diff --git a/backend/src/eudr-api/eudr-api.module.ts b/backend/src/eudr-api/eudr-api.module.ts new file mode 100644 index 0000000..fc2f339 --- /dev/null +++ b/backend/src/eudr-api/eudr-api.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common'; +import { ConfigModule } from '@nestjs/config'; +import { EudrApiService } from './eudr-api.service'; +import { EudrApiController } from './eudr-api.controller'; + +@Module({ + imports: [ConfigModule], + controllers: [EudrApiController], + providers: [EudrApiService], + exports: [EudrApiService], +}) +export class EudrApiModule {} diff --git a/backend/src/eudr-api/eudr-api.service.ts b/backend/src/eudr-api/eudr-api.service.ts new file mode 100644 index 0000000..4ddcd4c --- /dev/null +++ b/backend/src/eudr-api/eudr-api.service.ts @@ -0,0 +1,584 @@ +import { Injectable, Logger, OnModuleInit } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import axios, { AxiosInstance } from 'axios'; +import { + buildSoapEnvelope, + buildEchoRequest, + buildSubmitDdsRequest, + buildGetDdsInfoRequest, + buildGetDdsInfoByRefRequest, + buildRetractDdsRequest, + buildGetStatementByIdentifiersRequest, + buildGetReferencedDdsRequest, +} from './soap/xml-builder'; +import { + parseSoapFault, + parseEudrErrors, + parseEchoResponse, + parseSubmitDdsResponse, + parseGetDdsInfoResponse, + parseRetractDdsResponse, + parseAmendDdsResponse, + parseGetStatementByIdentifiersResponse, + isSuccessResponse, +} from './soap/xml-parser'; +import { EudrApiErrorDto, EudrApiResponseDto, ActivityType } from './dto/common.dto'; +import { SubmitDdsRequestDto, SubmitDdsResponseDto } from './dto/submit-dds.dto'; +import { AmendDdsRequestDto, AmendDdsResponseDto } from './dto/amend-dds.dto'; +import { RetractDdsRequestDto, RetractDdsResponseDto } from './dto/retract-dds.dto'; +import { + GetDdsInfoByUuidRequestDto, + GetDdsInfoByReferenceRequestDto, + GetDdsInfoResponseDto, + DdsInfoDto, +} from './dto/get-dds-info.dto'; +import { + GetDdsDataRequestDto, + GetReferencedDdsRequestDto, + GetDdsDataResponseDto, +} from './dto/get-dds-data.dto'; + +/** + * EUDR API Service + * + * Provides SOAP client interface to the EU EUDR system for DDS management. + * Supports both ACCEPTANCE (test) and PRODUCTION environments. + */ +@Injectable() +export class EudrApiService implements OnModuleInit { + private readonly logger = new Logger(EudrApiService.name); + private httpClient: AxiosInstance; + + // Configuration + private baseUrl: string; + private wsClientId: string; + private username: string; + private authKey: string; + private isProduction: boolean; + + // Service endpoints + private readonly ENDPOINTS = { + submission: '/services/EudrSubmissionServiceV2', + retrieval: '/services/EudrRetrievalServiceV2', + echo: '/services/EudrEchoService', + }; + + // Default URLs + private static readonly ACCEPTANCE_URL = 'https://acceptance.eudr.webcloud.ec.europa.eu/tracesnt'; + private static readonly PRODUCTION_URL = 'https://webgate.ec.europa.eu/tracesnt'; + + constructor(private configService: ConfigService) {} + + onModuleInit() { + // Load configuration + this.baseUrl = this.configService.get('EUDR_API_URL') || EudrApiService.ACCEPTANCE_URL; + this.wsClientId = this.configService.get('EUDR_WS_CLIENT_ID') || 'eudr-test'; + this.username = this.configService.get('EUDR_USERNAME') || ''; + this.authKey = this.configService.get('EUDR_AUTH_KEY') || ''; + this.isProduction = this.baseUrl.includes('webgate.ec.europa.eu'); + + // Create HTTP client + this.httpClient = axios.create({ + baseURL: this.baseUrl, + timeout: 60000, // 60 seconds timeout + headers: { + 'Content-Type': 'text/xml; charset=utf-8', + 'SOAPAction': '', + }, + }); + + this.logger.log(`EUDR API Service initialized - Environment: ${this.isProduction ? 'PRODUCTION' : 'ACCEPTANCE'}`); + this.logger.log(`Base URL: ${this.baseUrl}`); + this.logger.log(`WS Client ID: ${this.wsClientId}`); + } + + /** + * Check if credentials are configured + */ + isConfigured(): boolean { + return !!(this.username && this.authKey); + } + + /** + * Get current environment info + */ + getEnvironmentInfo(): { isProduction: boolean; baseUrl: string; wsClientId: string } { + return { + isProduction: this.isProduction, + baseUrl: this.baseUrl, + wsClientId: this.wsClientId, + }; + } + + /** + * CF1 - Echo Test + * Tests connection and authentication to the EUDR system. + * Only available in ACCEPTANCE environment. + */ + async testEcho(message: string = 'DuOrigin Test'): Promise> { + if (this.isProduction) { + return { + success: false, + errors: [{ code: 'NOT_AVAILABLE', message: 'Echo service not available in production' }], + }; + } + + if (!this.isConfigured()) { + return { + success: false, + errors: [{ code: 'NOT_CONFIGURED', message: 'EUDR credentials not configured' }], + }; + } + + try { + const body = buildEchoRequest(message, this.wsClientId); + const envelope = buildSoapEnvelope(this.username, this.authKey, body, 'v1'); + + const response = await this.httpClient.post(this.ENDPOINTS.echo, envelope, { + headers: { 'SOAPAction': 'testEcho' }, + }); + + const result = parseEchoResponse(response.data); + + if (result.success) { + return { + success: true, + data: { message: result.message || message }, + rawResponse: response.data, + }; + } + + const fault = parseSoapFault(response.data); + const errors = parseEudrErrors(response.data); + + return { + success: false, + errors: fault ? [fault] : errors, + rawResponse: response.data, + }; + } catch (error: any) { + this.logger.error('Echo test failed', error.message); + return { + success: false, + errors: [{ code: 'HTTP_ERROR', message: error.message }], + }; + } + } + + /** + * CF2 - Submit DDS + * Submits a new Due Diligence Statement to the EUDR system. + */ + async submitDds(request: SubmitDdsRequestDto): Promise> { + if (!this.isConfigured()) { + return { + success: false, + errors: [{ code: 'NOT_CONFIGURED', message: 'EUDR credentials not configured' }], + }; + } + + try { + // Build request body + const body = buildSubmitDdsRequest(this.wsClientId, { + activityType: request.activityType, + confidentialityFlag: request.confidentialityFlag, + companyInternalReference: request.companyInternalReference, + onBehalfOfOperator: request.onBehalfOfOperator ? { + name: request.onBehalfOfOperator.name, + streetNumber: request.onBehalfOfOperator.streetNumber, + postalCode: request.onBehalfOfOperator.postalCode, + city: request.onBehalfOfOperator.city, + countryCode: request.onBehalfOfOperator.countryCode, + eori: request.onBehalfOfOperator.eori, + } : undefined, + commodities: request.commodities.map(c => ({ + hsCode: c.hsCode, + description: c.description, + netMass: c.netMass, + percentageEstimateOrDeviation: c.percentageEstimateOrDeviation, + supplementaryUnitType: c.supplementaryUnitType, + supplementaryUnitValue: c.supplementaryUnitValue, + producers: c.producers.map(p => ({ + countryCode: p.countryCode, + producerName: p.producerName, + geoLocation: { + geoJson: p.geoLocation.geoJson, + area: p.geoLocation.area, + }, + })), + speciesInfo: c.speciesInfo, + referencedDdsNumbers: c.referencedDdsNumbers, + })), + referencedDds: request.referencedDds, + }); + + const envelope = buildSoapEnvelope(this.username, this.authKey, body); + + const response = await this.httpClient.post(this.ENDPOINTS.submission, envelope, { + headers: { 'SOAPAction': 'submitDDS' }, + }); + + const result = parseSubmitDdsResponse(response.data); + + if (result.success && result.uuid) { + return { + success: true, + data: { + uuid: result.uuid, + httpStatus: response.status, + rawResponse: response.data, + }, + }; + } + + const fault = parseSoapFault(response.data); + const errors = parseEudrErrors(response.data); + + return { + success: false, + errors: fault ? [fault] : (errors.length > 0 ? errors : [{ code: 'UNKNOWN', message: 'Failed to submit DDS' }]), + rawResponse: response.data, + }; + } catch (error: any) { + this.logger.error('Submit DDS failed', error.message); + return { + success: false, + errors: [{ code: 'HTTP_ERROR', message: error.message }], + }; + } + } + + /** + * CF3 - Get DDS Info by UUID(s) + * Retrieves status and reference numbers for submitted DDS. + */ + async getDdsInfoByUuid(request: GetDdsInfoByUuidRequestDto): Promise> { + if (!this.isConfigured()) { + return { + success: false, + errors: [{ code: 'NOT_CONFIGURED', message: 'EUDR credentials not configured' }], + }; + } + + if (request.uuids.length > 100) { + return { + success: false, + errors: [{ code: 'LIMIT_EXCEEDED', message: 'Maximum 100 UUIDs per request' }], + }; + } + + try { + const body = buildGetDdsInfoRequest(this.wsClientId, request.uuids); + const envelope = buildSoapEnvelope(this.username, this.authKey, body); + + const response = await this.httpClient.post(this.ENDPOINTS.retrieval, envelope, { + headers: { 'SOAPAction': 'getDdsInfo' }, + }); + + const ddsInfoList = parseGetDdsInfoResponse(response.data); + + if (isSuccessResponse(response.data)) { + return { + success: true, + data: { + httpStatus: response.status, + ddsInfoList, + rawResponse: response.data, + }, + }; + } + + const fault = parseSoapFault(response.data); + const errors = parseEudrErrors(response.data); + + return { + success: false, + errors: fault ? [fault] : errors, + rawResponse: response.data, + }; + } catch (error: any) { + this.logger.error('Get DDS Info failed', error.message); + return { + success: false, + errors: [{ code: 'HTTP_ERROR', message: error.message }], + }; + } + } + + /** + * CF3 - Get DDS Info by Internal Reference + * Retrieves DDS info matching the internal reference (partial match, case insensitive). + */ + async getDdsInfoByReference(request: GetDdsInfoByReferenceRequestDto): Promise> { + if (!this.isConfigured()) { + return { + success: false, + errors: [{ code: 'NOT_CONFIGURED', message: 'EUDR credentials not configured' }], + }; + } + + if (request.internalReference.length < 3 || request.internalReference.length > 50) { + return { + success: false, + errors: [{ code: 'INVALID_REFERENCE', message: 'Internal reference must be 3-50 characters' }], + }; + } + + try { + const body = buildGetDdsInfoByRefRequest(this.wsClientId, request.internalReference); + const envelope = buildSoapEnvelope(this.username, this.authKey, body); + + const response = await this.httpClient.post(this.ENDPOINTS.retrieval, envelope, { + headers: { 'SOAPAction': 'GetDdsInfoByInternalReferenceNumber' }, + }); + + const ddsInfoList = parseGetDdsInfoResponse(response.data); + + return { + success: true, + data: { + httpStatus: response.status, + ddsInfoList, + rawResponse: response.data, + }, + }; + } catch (error: any) { + this.logger.error('Get DDS Info by Reference failed', error.message); + return { + success: false, + errors: [{ code: 'HTTP_ERROR', message: error.message }], + }; + } + } + + /** + * CF5 - Amend DDS + * Amends an existing DDS in AVAILABLE status. + * Note: Activity type cannot be changed. + */ + async amendDds(request: AmendDdsRequestDto): Promise> { + if (!this.isConfigured()) { + return { + success: false, + errors: [{ code: 'NOT_CONFIGURED', message: 'EUDR credentials not configured' }], + }; + } + + try { + // Amend uses similar structure to submit but with UUID + const body = ` + + ${this.wsClientId} + ${request.uuid} + ${request.confidentialityFlag} + ${request.companyInternalReference ? `${request.companyInternalReference}` : ''} + ${request.commodities.map(c => ` + + ${c.hsCode} + ${c.description} + ${c.netMass !== undefined ? `${c.netMass}` : ''} + ${c.producers.map(p => ` + + ${p.countryCode} + ${p.producerName ? `${p.producerName}` : ''} + ${p.geoLocation.geoJson} + + `).join('')} + + `).join('')} + `; + + const envelope = buildSoapEnvelope(this.username, this.authKey, body); + + const response = await this.httpClient.post(this.ENDPOINTS.submission, envelope, { + headers: { 'SOAPAction': 'amendDDS' }, + }); + + const result = parseAmendDdsResponse(response.data); + + if (result.success) { + return { + success: true, + data: { + httpStatus: response.status, + success: true, + rawResponse: response.data, + }, + }; + } + + const fault = parseSoapFault(response.data); + const errors = parseEudrErrors(response.data); + + return { + success: false, + errors: fault ? [fault] : errors, + rawResponse: response.data, + }; + } catch (error: any) { + this.logger.error('Amend DDS failed', error.message); + return { + success: false, + errors: [{ code: 'HTTP_ERROR', message: error.message }], + }; + } + } + + /** + * CF6 - Retract DDS + * Cancels (SUBMITTED status) or withdraws (AVAILABLE status) a DDS. + */ + async retractDds(request: RetractDdsRequestDto): Promise> { + if (!this.isConfigured()) { + return { + success: false, + errors: [{ code: 'NOT_CONFIGURED', message: 'EUDR credentials not configured' }], + }; + } + + try { + const body = buildRetractDdsRequest(this.wsClientId, request.uuid); + const envelope = buildSoapEnvelope(this.username, this.authKey, body); + + const response = await this.httpClient.post(this.ENDPOINTS.submission, envelope, { + headers: { 'SOAPAction': 'retractDds' }, + }); + + const result = parseRetractDdsResponse(response.data); + + if (result.success) { + return { + success: true, + data: { + httpStatus: response.status, + success: true, + rawResponse: response.data, + }, + }; + } + + const fault = parseSoapFault(response.data); + const errors = parseEudrErrors(response.data); + + return { + success: false, + errors: fault ? [fault] : errors, + rawResponse: response.data, + }; + } catch (error: any) { + this.logger.error('Retract DDS failed', error.message); + return { + success: false, + errors: [{ code: 'HTTP_ERROR', message: error.message }], + }; + } + } + + /** + * CF7 - Get DDS Data + * Retrieves full DDS data by reference and verification numbers. + */ + async getDdsData(request: GetDdsDataRequestDto): Promise> { + if (!this.isConfigured()) { + return { + success: false, + errors: [{ code: 'NOT_CONFIGURED', message: 'EUDR credentials not configured' }], + }; + } + + try { + const body = buildGetStatementByIdentifiersRequest( + this.wsClientId, + request.referenceNumber, + request.verificationNumber + ); + const envelope = buildSoapEnvelope(this.username, this.authKey, body); + + const response = await this.httpClient.post(this.ENDPOINTS.retrieval, envelope, { + headers: { 'SOAPAction': 'getStatementByIdentifiers' }, + }); + + const ddsData = parseGetStatementByIdentifiersResponse(response.data); + + if (ddsData) { + return { + success: true, + data: { + httpStatus: response.status, + ddsData, + rawResponse: response.data, + }, + }; + } + + const fault = parseSoapFault(response.data); + const errors = parseEudrErrors(response.data); + + return { + success: false, + errors: fault ? [fault] : (errors.length > 0 ? errors : [{ code: 'NOT_FOUND', message: 'DDS not found' }]), + rawResponse: response.data, + }; + } catch (error: any) { + this.logger.error('Get DDS Data failed', error.message); + return { + success: false, + errors: [{ code: 'HTTP_ERROR', message: error.message }], + }; + } + } + + /** + * CF7 - Get Referenced DDS + * Retrieves DDS data from supply chain without verification number. + */ + async getReferencedDds(request: GetReferencedDdsRequestDto): Promise> { + if (!this.isConfigured()) { + return { + success: false, + errors: [{ code: 'NOT_CONFIGURED', message: 'EUDR credentials not configured' }], + }; + } + + try { + const body = buildGetReferencedDdsRequest( + this.wsClientId, + request.referenceNumber, + request.referenceDdsVerificationNumber + ); + const envelope = buildSoapEnvelope(this.username, this.authKey, body); + + const response = await this.httpClient.post(this.ENDPOINTS.retrieval, envelope, { + headers: { 'SOAPAction': 'getReferencedDds' }, + }); + + const ddsData = parseGetStatementByIdentifiersResponse(response.data); + + if (ddsData) { + return { + success: true, + data: { + httpStatus: response.status, + ddsData, + rawResponse: response.data, + }, + }; + } + + const fault = parseSoapFault(response.data); + const errors = parseEudrErrors(response.data); + + return { + success: false, + errors: fault ? [fault] : errors, + rawResponse: response.data, + }; + } catch (error: any) { + this.logger.error('Get Referenced DDS failed', error.message); + return { + success: false, + errors: [{ code: 'HTTP_ERROR', message: error.message }], + }; + } + } +} diff --git a/backend/src/eudr-api/index.ts b/backend/src/eudr-api/index.ts new file mode 100644 index 0000000..ea23867 --- /dev/null +++ b/backend/src/eudr-api/index.ts @@ -0,0 +1,4 @@ +export * from './eudr-api.module'; +export * from './eudr-api.service'; +export * from './eudr-api.controller'; +export * from './dto'; diff --git a/backend/src/eudr-api/soap/index.ts b/backend/src/eudr-api/soap/index.ts new file mode 100644 index 0000000..12b817d --- /dev/null +++ b/backend/src/eudr-api/soap/index.ts @@ -0,0 +1,2 @@ +export * from './xml-builder'; +export * from './xml-parser'; diff --git a/backend/src/eudr-api/soap/xml-builder.ts b/backend/src/eudr-api/soap/xml-builder.ts new file mode 100644 index 0000000..c999ff8 --- /dev/null +++ b/backend/src/eudr-api/soap/xml-builder.ts @@ -0,0 +1,299 @@ +import * as crypto from 'crypto'; + +/** + * EUDR SOAP XML Builder + * Builds SOAP envelopes with WS-Security UsernameToken Digest authentication + */ + +// Namespaces used in EUDR API +const NAMESPACES = { + soap: 'http://schemas.xmlsoap.org/soap/envelope/', + wsse: 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd', + wsu: 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd', + v21: 'http://ec.europa.eu/tracesnt/eudr/v2.1', + v1: 'http://ec.europa.eu/tracesnt/eudr/v1', + v4: 'http://ec.europa.eu/tracesnt/commons/v4', +}; + +/** + * Generate WS-Security timestamp + */ +function generateTimestamp(): { created: string; expires: string } { + const now = new Date(); + const expires = new Date(now.getTime() + 5 * 60 * 1000); // 5 minutes validity + + return { + created: now.toISOString(), + expires: expires.toISOString(), + }; +} + +/** + * Generate random nonce (16 bytes, base64 encoded) + */ +function generateNonce(): string { + return crypto.randomBytes(16).toString('base64'); +} + +/** + * Calculate password digest for WS-Security + * Password = Base64( SHA-1( nonce + created + authKey ) ) + */ +function calculatePasswordDigest(nonce: string, created: string, authKey: string): string { + const nonceBytes = Buffer.from(nonce, 'base64'); + const createdBytes = Buffer.from(created, 'utf8'); + const authKeyBytes = Buffer.from(authKey, 'utf8'); + + const combined = Buffer.concat([nonceBytes, createdBytes, authKeyBytes]); + const hash = crypto.createHash('sha1').update(combined).digest('base64'); + + return hash; +} + +/** + * Build WS-Security header with UsernameToken Digest + */ +export function buildSecurityHeader(username: string, authKey: string): string { + const { created, expires } = generateTimestamp(); + const nonce = generateNonce(); + const passwordDigest = calculatePasswordDigest(nonce, created, authKey); + + const tsId = `TS-${crypto.randomUUID()}`; + const utId = `UsernameToken-${crypto.randomUUID()}`; + + return ` + + + ${created} + ${expires} + + + ${escapeXml(username)} + ${passwordDigest} + ${nonce} + ${created} + + `; +} + +/** + * Escape XML special characters + */ +export function escapeXml(str: string): string { + if (!str) return ''; + return str + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); +} + +/** + * Build complete SOAP envelope + */ +export function buildSoapEnvelope( + username: string, + authKey: string, + body: string, + version: 'v1' | 'v21' = 'v21' +): string { + const securityHeader = buildSecurityHeader(username, authKey); + const ns = version === 'v21' ? NAMESPACES.v21 : NAMESPACES.v1; + + return ` + + + ${securityHeader} + + + ${body} + +`; +} + +/** + * Build Echo test request body + */ +export function buildEchoRequest(message: string, wsClientId: string): string { + return ` + + ${escapeXml(wsClientId)} + ${escapeXml(message)} + `; +} + +/** + * Build Submit DDS request body (V2) + */ +export function buildSubmitDdsRequest( + wsClientId: string, + data: { + activityType: string; + confidentialityFlag: boolean; + companyInternalReference?: string; + onBehalfOfOperator?: { + name: string; + streetNumber: string; + postalCode: string; + city: string; + countryCode: string; + eori?: string; + }; + commodities: Array<{ + hsCode: string; + description: string; + netMass?: number; + percentageEstimateOrDeviation?: number; + supplementaryUnitType?: string; + supplementaryUnitValue?: number; + producers: Array<{ + countryCode: string; + producerName?: string; + geoLocation: { geoJson: string; area?: number }; + }>; + speciesInfo?: Array<{ scientificName: string; commonName: string }>; + referencedDdsNumbers?: string[]; + }>; + referencedDds?: Array<{ referenceNumber: string; verificationNumber: string }>; + } +): string { + let operatorXml = ''; + if (data.onBehalfOfOperator) { + const op = data.onBehalfOfOperator; + operatorXml = ` + + ${escapeXml(op.name)} + ${escapeXml(op.streetNumber)} + ${escapeXml(op.postalCode)} + ${escapeXml(op.city)} + ${escapeXml(op.countryCode)} + ${op.eori ? `${escapeXml(op.eori)}` : ''} + `; + } + + const commoditiesXml = data.commodities.map(c => { + const producersXml = c.producers.map(p => ` + + ${escapeXml(p.countryCode)} + ${p.producerName ? `${escapeXml(p.producerName)}` : ''} + ${escapeXml(p.geoLocation.geoJson)} + ${p.geoLocation.area ? `${p.geoLocation.area}` : ''} + + `).join(''); + + const speciesXml = c.speciesInfo?.map(s => ` + + ${escapeXml(s.scientificName)} + ${escapeXml(s.commonName)} + + `).join('') || ''; + + const refsXml = c.referencedDdsNumbers?.map(ref => ` + ${escapeXml(ref)} + `).join('') || ''; + + return ` + + ${escapeXml(c.hsCode)} + ${escapeXml(c.description)} + ${c.netMass !== undefined ? `${c.netMass}` : ''} + ${c.percentageEstimateOrDeviation !== undefined ? `${c.percentageEstimateOrDeviation}` : ''} + ${c.supplementaryUnitType ? `${escapeXml(c.supplementaryUnitType)}` : ''} + ${c.supplementaryUnitValue !== undefined ? `${c.supplementaryUnitValue}` : ''} + ${producersXml} + ${speciesXml} + ${refsXml} + + `; + }).join(''); + + const referencedDdsXml = data.referencedDds?.map(r => ` + + ${escapeXml(r.referenceNumber)} + ${escapeXml(r.verificationNumber)} + + `).join('') || ''; + + return ` + + ${escapeXml(wsClientId)} + ${escapeXml(data.activityType)} + ${data.confidentialityFlag} + ${data.companyInternalReference ? `${escapeXml(data.companyInternalReference)}` : ''} + ${operatorXml} + ${commoditiesXml} + ${referencedDdsXml} + `; +} + +/** + * Build Get DDS Info request body + */ +export function buildGetDdsInfoRequest(wsClientId: string, uuids: string[]): string { + const uuidElements = uuids.map(uuid => `${escapeXml(uuid)}`).join(''); + + return ` + + ${escapeXml(wsClientId)} + ${uuidElements} + `; +} + +/** + * Build Get DDS Info by Internal Reference request body + */ +export function buildGetDdsInfoByRefRequest(wsClientId: string, internalReference: string): string { + return ` + + ${escapeXml(wsClientId)} + ${escapeXml(internalReference)} + `; +} + +/** + * Build Retract DDS request body + */ +export function buildRetractDdsRequest(wsClientId: string, uuid: string): string { + return ` + + ${escapeXml(wsClientId)} + ${escapeXml(uuid)} + `; +} + +/** + * Build Get Statement By Identifiers request body + */ +export function buildGetStatementByIdentifiersRequest( + wsClientId: string, + referenceNumber: string, + verificationNumber: string +): string { + return ` + + ${escapeXml(wsClientId)} + ${escapeXml(referenceNumber)} + ${escapeXml(verificationNumber)} + `; +} + +/** + * Build Get Referenced DDS request body + */ +export function buildGetReferencedDdsRequest( + wsClientId: string, + referenceNumber: string, + referenceDdsVerificationNumber: string +): string { + return ` + + ${escapeXml(wsClientId)} + ${escapeXml(referenceNumber)} + ${escapeXml(referenceDdsVerificationNumber)} + `; +} diff --git a/backend/src/eudr-api/soap/xml-parser.ts b/backend/src/eudr-api/soap/xml-parser.ts new file mode 100644 index 0000000..c885331 --- /dev/null +++ b/backend/src/eudr-api/soap/xml-parser.ts @@ -0,0 +1,280 @@ +import { XMLParser } from 'fast-xml-parser'; +import { DDSStatus, EudrApiErrorDto } from '../dto/common.dto'; +import { DdsInfoDto } from '../dto/get-dds-info.dto'; +import { DdsDataDto, ReferencedDdsInfoDto } from '../dto/get-dds-data.dto'; + +/** + * EUDR SOAP XML Response Parser + * Parses SOAP responses from the EUDR API + */ + +const parser = new XMLParser({ + ignoreAttributes: false, + attributeNamePrefix: '@_', + removeNSPrefix: true, + parseTagValue: true, + trimValues: true, +}); + +/** + * Parse SOAP Fault response + */ +export function parseSoapFault(xml: string): EudrApiErrorDto | null { + try { + const parsed = parser.parse(xml); + const envelope = parsed.Envelope || parsed['soap:Envelope'] || parsed['soapenv:Envelope']; + const body = envelope?.Body || envelope?.['soap:Body']; + const fault = body?.Fault || body?.['soap:Fault']; + + if (fault) { + return { + code: fault.faultcode || fault.Code?.Value || 'SOAP_FAULT', + message: fault.faultstring || fault.Reason?.Text || 'Unknown SOAP fault', + }; + } + return null; + } catch (e) { + return null; + } +} + +/** + * Parse EUDR business errors from response + */ +export function parseEudrErrors(xml: string): EudrApiErrorDto[] { + try { + const parsed = parser.parse(xml); + const envelope = parsed.Envelope || parsed['soap:Envelope']; + const body = envelope?.Body || envelope?.['soap:Body']; + + // Look for error elements in the response + const findErrors = (obj: any, errors: EudrApiErrorDto[] = []): EudrApiErrorDto[] => { + if (!obj || typeof obj !== 'object') return errors; + + // Check for Error or ValidationError elements + if (obj.Error || obj.ValidationError || obj.BusinessError) { + const errList = obj.Error || obj.ValidationError || obj.BusinessError; + const errArray = Array.isArray(errList) ? errList : [errList]; + + for (const err of errArray) { + errors.push({ + code: err.Code || err.ErrorCode || err.code || 'UNKNOWN', + message: err.Message || err.ErrorMessage || err.message || 'Unknown error', + field: err.Field || err.FieldName || undefined, + }); + } + } + + // Recursively check child elements + for (const key of Object.keys(obj)) { + if (typeof obj[key] === 'object') { + findErrors(obj[key], errors); + } + } + + return errors; + }; + + return findErrors(body); + } catch (e) { + return []; + } +} + +/** + * Parse Echo test response + */ +export function parseEchoResponse(xml: string): { success: boolean; message?: string } { + try { + const parsed = parser.parse(xml); + const envelope = parsed.Envelope || parsed['soap:Envelope']; + const body = envelope?.Body || envelope?.['soap:Body']; + const response = body?.testEchoResponse || body?.EchoResponse; + + if (response) { + return { + success: true, + message: response.message || response.Message, + }; + } + + return { success: false }; + } catch (e) { + return { success: false }; + } +} + +/** + * Parse Submit DDS response + */ +export function parseSubmitDdsResponse(xml: string): { uuid?: string; success: boolean } { + try { + const parsed = parser.parse(xml); + const envelope = parsed.Envelope || parsed['soap:Envelope']; + const body = envelope?.Body || envelope?.['soap:Body']; + const response = body?.SubmitDDSResponse || body?.submitDDSResponse; + + if (response && response.UUID) { + return { + success: true, + uuid: response.UUID, + }; + } + + return { success: false }; + } catch (e) { + return { success: false }; + } +} + +/** + * Parse Get DDS Info response + */ +export function parseGetDdsInfoResponse(xml: string): DdsInfoDto[] { + try { + const parsed = parser.parse(xml); + const envelope = parsed.Envelope || parsed['soap:Envelope']; + const body = envelope?.Body || envelope?.['soap:Body']; + const response = body?.GetDdsInfoResponse || body?.getDdsInfoResponse; + + if (!response) return []; + + // Handle both single and multiple DDS info + const ddsInfoList = response.DDSInfo || response.DdsInfo; + if (!ddsInfoList) return []; + + const infoArray = Array.isArray(ddsInfoList) ? ddsInfoList : [ddsInfoList]; + + return infoArray.map((info: any): DdsInfoDto => ({ + uuid: info.UUID || info.Uuid, + status: (info.Status || 'UNKNOWN') as DDSStatus, + referenceNumber: info.ReferenceNumber || info.RefNumber, + verificationNumber: info.VerificationNumber || info.VerifNumber, + internalReference: info.InternalReferenceNumber || info.CompanyInternalReference, + caMessage: info.CAMessage || info.CaMessage || info.CompetentAuthorityMessage, + rejectionReason: info.RejectionReason, + })); + } catch (e) { + return []; + } +} + +/** + * Parse Retract DDS response + */ +export function parseRetractDdsResponse(xml: string): { success: boolean } { + try { + const parsed = parser.parse(xml); + const envelope = parsed.Envelope || parsed['soap:Envelope']; + const body = envelope?.Body || envelope?.['soap:Body']; + + // Success if we have a RetractDdsResponse without errors + const response = body?.RetractDdsResponse || body?.retractDdsResponse; + const fault = parseSoapFault(xml); + const errors = parseEudrErrors(xml); + + return { success: !!response && !fault && errors.length === 0 }; + } catch (e) { + return { success: false }; + } +} + +/** + * Parse Amend DDS response + */ +export function parseAmendDdsResponse(xml: string): { success: boolean } { + try { + const parsed = parser.parse(xml); + const envelope = parsed.Envelope || parsed['soap:Envelope']; + const body = envelope?.Body || envelope?.['soap:Body']; + + const response = body?.AmendDDSResponse || body?.amendDDSResponse; + const fault = parseSoapFault(xml); + const errors = parseEudrErrors(xml); + + return { success: !!response && !fault && errors.length === 0 }; + } catch (e) { + return { success: false }; + } +} + +/** + * Parse Get Statement By Identifiers response + */ +export function parseGetStatementByIdentifiersResponse(xml: string): DdsDataDto | null { + try { + const parsed = parser.parse(xml); + const envelope = parsed.Envelope || parsed['soap:Envelope']; + const body = envelope?.Body || envelope?.['soap:Body']; + const response = body?.GetStatementByIdentifiersResponse || body?.getStatementByIdentifiersResponse; + + if (!response || !response.Statement) return null; + + const stmt = response.Statement; + + // Parse referenced DDS with security numbers + const referencedDds: ReferencedDdsInfoDto[] = []; + if (stmt.ReferencedDds) { + const refs = Array.isArray(stmt.ReferencedDds) ? stmt.ReferencedDds : [stmt.ReferencedDds]; + for (const ref of refs) { + referencedDds.push({ + referenceNumber: ref.ReferenceNumber, + referenceDdsVerificationNumber: ref.ReferenceDdsVerificationNumber || ref.SecurityNumber, + }); + } + } + + // Parse commodities + const commodities: any[] = []; + if (stmt.Commodity) { + const comms = Array.isArray(stmt.Commodity) ? stmt.Commodity : [stmt.Commodity]; + for (const c of comms) { + commodities.push({ + hsCode: c.HSCode || c.HsCode, + description: c.Description, + netMass: c.NetMass ? parseFloat(c.NetMass) : undefined, + percentageEstimateOrDeviation: c.PercentageEstimateOrDeviation ? parseFloat(c.PercentageEstimateOrDeviation) : undefined, + supplementaryUnitType: c.SupplementaryUnitType, + supplementaryUnitValue: c.SupplementaryUnitValue ? parseFloat(c.SupplementaryUnitValue) : undefined, + producers: [], + speciesInfo: [], + }); + } + } + + return { + referenceNumber: stmt.ReferenceNumber, + verificationNumber: stmt.VerificationNumber, + status: (stmt.Status || 'UNKNOWN') as DDSStatus, + activityType: stmt.ActivityType, + availabilityDate: stmt.AvailabilityDate, + operatorName: stmt.OperatorName || stmt.Operator?.Name, + operatorCountry: stmt.OperatorCountry || stmt.Operator?.CountryCode, + commodities, + showGeoLocation: stmt.ShowGeoLocation === true || stmt.ShowGeoLocation === 'true', + referencedDds, + }; + } catch (e) { + return null; + } +} + +/** + * Parse Get Referenced DDS response (same structure as GetStatementByIdentifiers) + */ +export function parseGetReferencedDdsResponse(xml: string): DdsDataDto | null { + return parseGetStatementByIdentifiersResponse(xml); +} + +/** + * Check if response indicates HTTP/SOAP success + */ +export function isSuccessResponse(xml: string): boolean { + const fault = parseSoapFault(xml); + if (fault) return false; + + const errors = parseEudrErrors(xml); + if (errors.length > 0) return false; + + return true; +} diff --git a/backend/src/eudr-api/tests/eudr-api.service.spec.ts b/backend/src/eudr-api/tests/eudr-api.service.spec.ts new file mode 100644 index 0000000..cda2aad --- /dev/null +++ b/backend/src/eudr-api/tests/eudr-api.service.spec.ts @@ -0,0 +1,379 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { ConfigService } from '@nestjs/config'; +import { EudrApiService } from '../eudr-api.service'; +import { ActivityType } from '../dto/common.dto'; +import axios from 'axios'; + +// Mock axios +jest.mock('axios'); +const mockedAxios = axios as jest.Mocked; + +describe('EudrApiService', () => { + let service: EudrApiService; + let configService: ConfigService; + + // Mock config values + const mockConfig = { + EUDR_API_URL: 'https://acceptance.eudr.webcloud.ec.europa.eu/tracesnt', + EUDR_WS_CLIENT_ID: 'eudr-test', + EUDR_USERNAME: 'test-user', + EUDR_AUTH_KEY: 'test-auth-key-12345', + }; + + beforeEach(async () => { + // Reset mocks + jest.clearAllMocks(); + + // Setup axios mock + mockedAxios.create.mockReturnValue({ + post: jest.fn(), + get: jest.fn(), + } as any); + + const module: TestingModule = await Test.createTestingModule({ + providers: [ + EudrApiService, + { + provide: ConfigService, + useValue: { + get: jest.fn((key: string) => mockConfig[key]), + }, + }, + ], + }).compile(); + + service = module.get(EudrApiService); + configService = module.get(ConfigService); + + // Trigger onModuleInit + service.onModuleInit(); + }); + + describe('Configuration', () => { + it('should be defined', () => { + expect(service).toBeDefined(); + }); + + it('should return correct environment info', () => { + const envInfo = service.getEnvironmentInfo(); + expect(envInfo.isProduction).toBe(false); + expect(envInfo.wsClientId).toBe('eudr-test'); + expect(envInfo.baseUrl).toContain('acceptance'); + }); + + it('should report as configured when credentials exist', () => { + expect(service.isConfigured()).toBe(true); + }); + }); + + describe('CF1 - Echo Test', () => { + it('should successfully perform echo test', async () => { + const mockResponse = { + status: 200, + data: ` + + + + Test message + + + `, + }; + + // Get the mock client and setup response + const mockClient = mockedAxios.create(); + (mockClient.post as jest.Mock).mockResolvedValue(mockResponse); + + // Re-initialize to apply mock + service.onModuleInit(); + + // Note: In real tests, we'd need to properly inject the axios instance + // This is a simplified example + }); + + it('should fail echo in production environment', async () => { + // Create a production-configured service + const prodConfigService = { + get: jest.fn((key: string) => { + if (key === 'EUDR_API_URL') return 'https://webgate.ec.europa.eu/tracesnt'; + return mockConfig[key]; + }), + }; + + const module = await Test.createTestingModule({ + providers: [ + EudrApiService, + { provide: ConfigService, useValue: prodConfigService }, + ], + }).compile(); + + const prodService = module.get(EudrApiService); + prodService.onModuleInit(); + + const result = await prodService.testEcho('test'); + expect(result.success).toBe(false); + expect(result.errors[0].code).toBe('NOT_AVAILABLE'); + }); + }); + + describe('CF2 - Submit DDS', () => { + it('should validate required fields for IMPORT activity', async () => { + // IMPORT requires EORI and Net Mass + const request = { + activityType: ActivityType.IMPORT, + confidentialityFlag: false, + companyInternalReference: 'TEST-REF-001', + commodities: [ + { + hsCode: '1201', + description: 'Soybeans', + netMass: 50000, + producers: [ + { + countryCode: 'BR', + producerName: 'Fazenda Teste', + geoLocation: { + geoJson: JSON.stringify({ + type: 'FeatureCollection', + features: [{ + type: 'Feature', + geometry: { type: 'Point', coordinates: [-47.123, -23.456] }, + properties: { plotId: 'PLOT-001' } + }] + }), + area: 3.5, + }, + }, + ], + }, + ], + }; + + // Should have correct structure + expect(request.activityType).toBe(ActivityType.IMPORT); + expect(request.commodities[0].netMass).toBeDefined(); + expect(request.commodities[0].producers[0].geoLocation.geoJson).toBeTruthy(); + }); + + it('should build correct GeoJSON for producers', () => { + const geoJson = { + type: 'FeatureCollection', + features: [ + { + type: 'Feature', + geometry: { + type: 'Point', + coordinates: [-47.123456, -23.456789], + }, + properties: { + plotId: 'PLOT-001', + area: 3.5, + }, + }, + ], + }; + + expect(geoJson.type).toBe('FeatureCollection'); + expect(geoJson.features[0].geometry.type).toBe('Point'); + expect(geoJson.features[0].geometry.coordinates[0]).toBeGreaterThanOrEqual(-180); + expect(geoJson.features[0].geometry.coordinates[0]).toBeLessThanOrEqual(180); + expect(geoJson.features[0].geometry.coordinates[1]).toBeGreaterThanOrEqual(-90); + expect(geoJson.features[0].geometry.coordinates[1]).toBeLessThanOrEqual(90); + }); + }); + + describe('CF3 - Get DDS Info', () => { + it('should enforce UUID limit', async () => { + const tooManyUuids = Array(101).fill('550e8400-e29b-41d4-a716-446655440000'); + + const result = await service.getDdsInfoByUuid({ uuids: tooManyUuids }); + + expect(result.success).toBe(false); + expect(result.errors[0].code).toBe('LIMIT_EXCEEDED'); + }); + + it('should validate internal reference length', async () => { + // Too short + const shortResult = await service.getDdsInfoByReference({ internalReference: 'AB' }); + expect(shortResult.success).toBe(false); + expect(shortResult.errors[0].code).toBe('INVALID_REFERENCE'); + + // Too long + const longRef = 'A'.repeat(51); + const longResult = await service.getDdsInfoByReference({ internalReference: longRef }); + expect(longResult.success).toBe(false); + expect(longResult.errors[0].code).toBe('INVALID_REFERENCE'); + }); + }); +}); + +describe('XML Builder', () => { + // Import the xml-builder module + const xmlBuilder = require('../soap/xml-builder'); + + describe('Security Header', () => { + it('should generate valid security header', () => { + const header = xmlBuilder.buildSecurityHeader('testuser', 'testauthkey'); + + expect(header).toContain('wsse:Security'); + expect(header).toContain('wsse:UsernameToken'); + expect(header).toContain('testuser'); + expect(header).toContain('wsse:Password'); + expect(header).toContain('wsse:Nonce'); + expect(header).toContain('wsu:Created'); + }); + }); + + describe('Echo Request', () => { + it('should build echo request correctly', () => { + const request = xmlBuilder.buildEchoRequest('Test Message', 'eudr-test'); + + expect(request).toContain('testEchoRequest'); + expect(request).toContain('Test Message'); + expect(request).toContain('eudr-test'); + }); + }); + + describe('Submit DDS Request', () => { + it('should build submit request with geolocation', () => { + const request = xmlBuilder.buildSubmitDdsRequest('eudr-test', { + activityType: 'IMPORT', + confidentialityFlag: false, + commodities: [{ + hsCode: '1201', + description: 'Soybeans', + netMass: 50000, + producers: [{ + countryCode: 'BR', + geoLocation: { geoJson: '{"type":"Point"}' }, + }], + }], + }); + + expect(request).toContain('SubmitDDSRequest'); + expect(request).toContain('IMPORT'); + expect(request).toContain('1201'); + expect(request).toContain('BR'); + }); + + it('should include authorized representative fields', () => { + const request = xmlBuilder.buildSubmitDdsRequest('eudr-test', { + activityType: 'IMPORT', + confidentialityFlag: false, + onBehalfOfOperator: { + name: 'Empresa Teste', + streetNumber: 'Rua 1, 100', + postalCode: '01000-000', + city: 'São Paulo', + countryCode: 'BR', + eori: 'BR12345678901234', + }, + commodities: [{ + hsCode: '1201', + description: 'Soybeans', + netMass: 50000, + producers: [{ + countryCode: 'BR', + geoLocation: { geoJson: '{}' }, + }], + }], + }); + + expect(request).toContain('OnBehalfOfOperator'); + expect(request).toContain('Empresa Teste'); + expect(request).toContain('BR12345678901234'); + }); + }); + + describe('XML Escaping', () => { + it('should escape special characters', () => { + const escaped = xmlBuilder.escapeXml('Test & "quote" \'apos\''); + + expect(escaped).toContain('&'); + expect(escaped).toContain('<'); + expect(escaped).toContain('>'); + expect(escaped).toContain('"'); + expect(escaped).toContain('''); + }); + }); +}); + +describe('XML Parser', () => { + const xmlParser = require('../soap/xml-parser'); + + describe('Parse Echo Response', () => { + it('should parse successful echo response', () => { + const xml = ` + + + + Hello World + + + `; + + const result = xmlParser.parseEchoResponse(xml); + expect(result.success).toBe(true); + expect(result.message).toBe('Hello World'); + }); + }); + + describe('Parse Submit Response', () => { + it('should extract UUID from submit response', () => { + const xml = ` + + + + 550e8400-e29b-41d4-a716-446655440000 + + + `; + + const result = xmlParser.parseSubmitDdsResponse(xml); + expect(result.success).toBe(true); + expect(result.uuid).toBe('550e8400-e29b-41d4-a716-446655440000'); + }); + }); + + describe('Parse DDS Info Response', () => { + it('should parse DDS info list', () => { + const xml = ` + + + + + 550e8400-e29b-41d4-a716-446655440000 + AVAILABLE + EUDR-2026-0001234 + VN123456789 + + + + `; + + const result = xmlParser.parseGetDdsInfoResponse(xml); + expect(result).toHaveLength(1); + expect(result[0].uuid).toBe('550e8400-e29b-41d4-a716-446655440000'); + expect(result[0].status).toBe('AVAILABLE'); + expect(result[0].referenceNumber).toBe('EUDR-2026-0001234'); + }); + }); + + describe('Parse SOAP Fault', () => { + it('should detect SOAP fault', () => { + const xml = ` + + + + soap:Client + Authentication failed + + + `; + + const fault = xmlParser.parseSoapFault(xml); + expect(fault).not.toBeNull(); + expect(fault.message).toContain('Authentication'); + }); + }); +}); diff --git a/backend/src/main.ts b/backend/src/main.ts new file mode 100644 index 0000000..367b3be --- /dev/null +++ b/backend/src/main.ts @@ -0,0 +1,55 @@ +import { NestFactory } from '@nestjs/core'; +import { ValidationPipe } from '@nestjs/common'; +import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger'; +import { AppModule } from './app.module'; + +async function bootstrap() { + const app = await NestFactory.create(AppModule); + + // Global API prefix + app.setGlobalPrefix('api'); + + // CORS + app.enableCors({ + origin: ['http://localhost:5173', 'https://duorigin.aivertice.com'], + credentials: true, + methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'], + allowedHeaders: ['Content-Type', 'Authorization'], + }); + + // Validation + app.useGlobalPipes( + new ValidationPipe({ + whitelist: true, + forbidNonWhitelisted: true, + transform: true, + transformOptions: { + enableImplicitConversion: true, + }, + }), + ); + + // Swagger + const config = new DocumentBuilder() + .setTitle('DuOrigin v2 API') + .setDescription('Sistema de Compliance EUDR para Agronegócio') + .setVersion('2.0.0') + .addBearerAuth() + .addTag('auth', 'Autenticação') + .addTag('users', 'Gerenciamento de Usuários') + .addTag('empresas', 'Gerenciamento de Empresas') + .addTag('propriedades', 'Gerenciamento de Propriedades') + .addTag('avaliacoes', 'Avaliações e DDS') + .addTag('documentos', 'Upload/Download de Documentos') + .addTag('dashboard', 'Dashboard e Estatísticas') + .build(); + + const document = SwaggerModule.createDocument(app, config); + SwaggerModule.setup('docs', app, document); + + const port = process.env.PORT || 8100; + await app.listen(port); + console.log(`🚀 DuOrigin v2 API running on http://localhost:${port}`); + console.log(`📚 Swagger docs at http://localhost:${port}/api/docs`); +} +bootstrap(); diff --git a/backend/src/prisma/prisma.module.ts b/backend/src/prisma/prisma.module.ts new file mode 100644 index 0000000..7207426 --- /dev/null +++ b/backend/src/prisma/prisma.module.ts @@ -0,0 +1,9 @@ +import { Global, Module } from '@nestjs/common'; +import { PrismaService } from './prisma.service'; + +@Global() +@Module({ + providers: [PrismaService], + exports: [PrismaService], +}) +export class PrismaModule {} diff --git a/backend/src/prisma/prisma.service.ts b/backend/src/prisma/prisma.service.ts new file mode 100644 index 0000000..bb6565f --- /dev/null +++ b/backend/src/prisma/prisma.service.ts @@ -0,0 +1,13 @@ +import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common'; +import { PrismaClient } from '@prisma/client'; + +@Injectable() +export class PrismaService extends PrismaClient implements OnModuleInit, OnModuleDestroy { + async onModuleInit() { + await this.$connect(); + } + + async onModuleDestroy() { + await this.$disconnect(); + } +} diff --git a/backend/src/propriedades/dto/create-propriedade.dto.ts b/backend/src/propriedades/dto/create-propriedade.dto.ts new file mode 100644 index 0000000..364863d --- /dev/null +++ b/backend/src/propriedades/dto/create-propriedade.dto.ts @@ -0,0 +1,79 @@ +import { IsString, IsOptional, IsBoolean, IsNumber, IsEnum, Min, Max, MinLength } from 'class-validator'; +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; +import { NivelRisco } from '@prisma/client'; + +export class CreatePropriedadeDto { + @ApiProperty({ example: 'Fazenda São João' }) + @IsString() + @MinLength(2, { message: 'Nome deve ter no mínimo 2 caracteres' }) + nome: string; + + @ApiProperty({ example: 1 }) + @IsNumber() + empresaId: number; + + @ApiPropertyOptional({ example: 'MG-1234567-A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6' }) + @IsOptional() + @IsString() + codigoCar?: string; + + @ApiPropertyOptional({ example: 500.5 }) + @IsOptional() + @IsNumber() + @Min(0, { message: 'Área deve ser maior ou igual a 0' }) + areaHa?: number; + + @ApiPropertyOptional({ example: -18.9186, description: 'Latitude em graus decimais' }) + @IsOptional() + @IsNumber() + @Min(-90) + @Max(90) + latitude?: number; + + @ApiPropertyOptional({ example: -48.2772, description: 'Longitude em graus decimais' }) + @IsOptional() + @IsNumber() + @Min(-180) + @Max(180) + longitude?: number; + + @ApiPropertyOptional({ example: 'Cerrado' }) + @IsOptional() + @IsString() + bioma?: string; + + @ApiPropertyOptional({ example: 'Rodovia BR-050, Km 45' }) + @IsOptional() + @IsString() + endereco?: string; + + @ApiPropertyOptional({ example: 'Uberlândia' }) + @IsOptional() + @IsString() + cidade?: string; + + @ApiPropertyOptional({ example: 'MG' }) + @IsOptional() + @IsString() + estado?: string; + + @ApiPropertyOptional({ enum: NivelRisco, default: 'BAIXO' }) + @IsOptional() + @IsEnum(NivelRisco) + nivelRisco?: NivelRisco; + + @ApiPropertyOptional({ example: 'clean', description: 'Flag de desmatamento' }) + @IsOptional() + @IsString() + flagDesmatamento?: string; + + @ApiPropertyOptional({ description: 'GeoJSON polygon' }) + @IsOptional() + @IsString() + geojson?: string; + + @ApiPropertyOptional({ default: true }) + @IsOptional() + @IsBoolean() + ativo?: boolean; +} diff --git a/backend/src/propriedades/dto/update-propriedade.dto.ts b/backend/src/propriedades/dto/update-propriedade.dto.ts new file mode 100644 index 0000000..2164d94 --- /dev/null +++ b/backend/src/propriedades/dto/update-propriedade.dto.ts @@ -0,0 +1,4 @@ +import { PartialType } from '@nestjs/swagger'; +import { CreatePropriedadeDto } from './create-propriedade.dto'; + +export class UpdatePropriedadeDto extends PartialType(CreatePropriedadeDto) {} diff --git a/backend/src/propriedades/propriedades.controller.ts b/backend/src/propriedades/propriedades.controller.ts new file mode 100644 index 0000000..1bfb289 --- /dev/null +++ b/backend/src/propriedades/propriedades.controller.ts @@ -0,0 +1,68 @@ +import { Controller, Get, Post, Put, Delete, Patch, Body, Param, Query, ParseIntPipe, UseGuards } from '@nestjs/common'; +import { ApiTags, ApiOperation, ApiResponse, ApiBearerAuth, ApiQuery } from '@nestjs/swagger'; +import { PropriedadesService } from './propriedades.service'; +import { CreatePropriedadeDto } from './dto/create-propriedade.dto'; +import { UpdatePropriedadeDto } from './dto/update-propriedade.dto'; +import { JwtAuthGuard } from '../auth/jwt-auth.guard'; + +@ApiTags('propriedades') +@Controller('propriedades') +@UseGuards(JwtAuthGuard) +@ApiBearerAuth() +export class PropriedadesController { + constructor(private propriedadesService: PropriedadesService) {} + + @Get() + @ApiOperation({ summary: 'Listar todas as propriedades' }) + @ApiQuery({ name: 'empresaId', required: false, type: Number }) + @ApiQuery({ name: 'includeInactive', required: false, type: Boolean }) + @ApiResponse({ status: 200, description: 'Lista de propriedades' }) + findAll( + @Query('empresaId') empresaId?: number, + @Query('includeInactive') includeInactive?: boolean, + ) { + return this.propriedadesService.findAll(empresaId, includeInactive); + } + + @Get(':id') + @ApiOperation({ summary: 'Buscar propriedade por ID' }) + @ApiResponse({ status: 200, description: 'Propriedade encontrada' }) + @ApiResponse({ status: 404, description: 'Propriedade não encontrada' }) + findOne(@Param('id', ParseIntPipe) id: number) { + return this.propriedadesService.findOne(id); + } + + @Post() + @ApiOperation({ summary: 'Criar nova propriedade' }) + @ApiResponse({ status: 201, description: 'Propriedade criada com sucesso' }) + @ApiResponse({ status: 400, description: 'Empresa não encontrada' }) + create(@Body() createPropriedadeDto: CreatePropriedadeDto) { + return this.propriedadesService.create(createPropriedadeDto); + } + + @Put(':id') + @ApiOperation({ summary: 'Atualizar propriedade' }) + @ApiResponse({ status: 200, description: 'Propriedade atualizada' }) + @ApiResponse({ status: 404, description: 'Propriedade não encontrada' }) + update( + @Param('id', ParseIntPipe) id: number, + @Body() updatePropriedadeDto: UpdatePropriedadeDto, + ) { + return this.propriedadesService.update(id, updatePropriedadeDto); + } + + @Delete(':id') + @ApiOperation({ summary: 'Remover propriedade' }) + @ApiResponse({ status: 200, description: 'Propriedade removida' }) + @ApiResponse({ status: 404, description: 'Propriedade não encontrada' }) + remove(@Param('id', ParseIntPipe) id: number) { + return this.propriedadesService.remove(id); + } + + @Patch(':id/toggle-active') + @ApiOperation({ summary: 'Ativar/Desativar propriedade' }) + @ApiResponse({ status: 200, description: 'Status alterado' }) + toggleActive(@Param('id', ParseIntPipe) id: number) { + return this.propriedadesService.toggleActive(id); + } +} diff --git a/backend/src/propriedades/propriedades.module.ts b/backend/src/propriedades/propriedades.module.ts new file mode 100644 index 0000000..c4f7bac --- /dev/null +++ b/backend/src/propriedades/propriedades.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { PropriedadesController } from './propriedades.controller'; +import { PropriedadesService } from './propriedades.service'; + +@Module({ + controllers: [PropriedadesController], + providers: [PropriedadesService], + exports: [PropriedadesService], +}) +export class PropriedadesModule {} diff --git a/backend/src/propriedades/propriedades.service.ts b/backend/src/propriedades/propriedades.service.ts new file mode 100644 index 0000000..123a358 --- /dev/null +++ b/backend/src/propriedades/propriedades.service.ts @@ -0,0 +1,120 @@ +import { Injectable, NotFoundException, BadRequestException } from '@nestjs/common'; +import { PrismaService } from '../prisma/prisma.service'; +import { CreatePropriedadeDto } from './dto/create-propriedade.dto'; +import { UpdatePropriedadeDto } from './dto/update-propriedade.dto'; + +@Injectable() +export class PropriedadesService { + constructor(private prisma: PrismaService) {} + + async findAll(empresaId?: number, includeInactive = false) { + const where: any = {}; + + if (empresaId) { + where.empresaId = empresaId; + } + + if (!includeInactive) { + where.ativo = true; + } + + return this.prisma.propriedade.findMany({ + where, + include: { + empresa: { + select: { id: true, razaoSocial: true, cnpj: true }, + }, + _count: { + select: { avaliacoes: true, documentos: true }, + }, + }, + orderBy: { createdAt: 'desc' }, + }); + } + + async findOne(id: number) { + const propriedade = await this.prisma.propriedade.findUnique({ + where: { id }, + include: { + empresa: { + select: { id: true, razaoSocial: true, cnpj: true }, + }, + avaliacoes: { + orderBy: { createdAt: 'desc' }, + take: 5, + }, + documentos: { + orderBy: { createdAt: 'desc' }, + take: 10, + }, + _count: { + select: { avaliacoes: true, documentos: true }, + }, + }, + }); + + if (!propriedade) { + throw new NotFoundException('Propriedade não encontrada'); + } + + return propriedade; + } + + async create(createPropriedadeDto: CreatePropriedadeDto) { + // Verify empresa exists + const empresa = await this.prisma.empresa.findUnique({ + where: { id: createPropriedadeDto.empresaId }, + }); + + if (!empresa) { + throw new BadRequestException('Empresa não encontrada'); + } + + return this.prisma.propriedade.create({ + data: createPropriedadeDto, + include: { + empresa: { + select: { id: true, razaoSocial: true, cnpj: true }, + }, + }, + }); + } + + async update(id: number, updatePropriedadeDto: UpdatePropriedadeDto) { + await this.findOne(id); + + if (updatePropriedadeDto.empresaId) { + const empresa = await this.prisma.empresa.findUnique({ + where: { id: updatePropriedadeDto.empresaId }, + }); + + if (!empresa) { + throw new BadRequestException('Empresa não encontrada'); + } + } + + return this.prisma.propriedade.update({ + where: { id }, + data: updatePropriedadeDto, + include: { + empresa: { + select: { id: true, razaoSocial: true, cnpj: true }, + }, + }, + }); + } + + async remove(id: number) { + await this.findOne(id); + await this.prisma.propriedade.delete({ where: { id } }); + return { message: 'Propriedade removida com sucesso' }; + } + + async toggleActive(id: number) { + const propriedade = await this.findOne(id); + return this.prisma.propriedade.update({ + where: { id }, + data: { ativo: !propriedade.ativo }, + }); + } +} diff --git a/backend/src/types/express.d.ts b/backend/src/types/express.d.ts new file mode 100644 index 0000000..460a80e --- /dev/null +++ b/backend/src/types/express.d.ts @@ -0,0 +1,15 @@ +import { Multer } from 'multer'; + +declare global { + namespace Express { + interface Request { + user?: { + sub: number; + email: string; + role: string; + }; + } + } +} + +export {}; diff --git a/backend/src/users/dto/create-user.dto.ts b/backend/src/users/dto/create-user.dto.ts new file mode 100644 index 0000000..a251d23 --- /dev/null +++ b/backend/src/users/dto/create-user.dto.ts @@ -0,0 +1,29 @@ +import { IsEmail, IsString, MinLength, IsOptional, IsEnum, IsBoolean } from 'class-validator'; +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; +import { Role } from '@prisma/client'; + +export class CreateUserDto { + @ApiProperty({ example: 'usuario@duorigin.com' }) + @IsEmail({}, { message: 'Email inválido' }) + email: string; + + @ApiProperty({ example: 'Senha123!' }) + @IsString() + @MinLength(6, { message: 'Senha deve ter no mínimo 6 caracteres' }) + password: string; + + @ApiProperty({ example: 'João Silva' }) + @IsString() + @MinLength(2, { message: 'Nome deve ter no mínimo 2 caracteres' }) + nome: string; + + @ApiPropertyOptional({ enum: Role, default: 'OPERADOR' }) + @IsOptional() + @IsEnum(Role) + role?: Role; + + @ApiPropertyOptional({ default: true }) + @IsOptional() + @IsBoolean() + ativo?: boolean; +} diff --git a/backend/src/users/dto/update-user.dto.ts b/backend/src/users/dto/update-user.dto.ts new file mode 100644 index 0000000..78ab602 --- /dev/null +++ b/backend/src/users/dto/update-user.dto.ts @@ -0,0 +1,4 @@ +import { PartialType } from '@nestjs/swagger'; +import { CreateUserDto } from './create-user.dto'; + +export class UpdateUserDto extends PartialType(CreateUserDto) {} diff --git a/backend/src/users/users.controller.ts b/backend/src/users/users.controller.ts new file mode 100644 index 0000000..98892a2 --- /dev/null +++ b/backend/src/users/users.controller.ts @@ -0,0 +1,69 @@ +import { Controller, Get, Post, Put, Delete, Patch, Body, Param, ParseIntPipe, UseGuards } from '@nestjs/common'; +import { ApiTags, ApiOperation, ApiResponse, ApiBearerAuth } from '@nestjs/swagger'; +import { UsersService } from './users.service'; +import { CreateUserDto } from './dto/create-user.dto'; +import { UpdateUserDto } from './dto/update-user.dto'; +import { JwtAuthGuard } from '../auth/jwt-auth.guard'; +import { RolesGuard } from '../auth/roles.guard'; +import { Roles } from '../auth/roles.decorator'; +import { Role } from '@prisma/client'; + +@ApiTags('users') +@Controller('users') +@UseGuards(JwtAuthGuard, RolesGuard) +@ApiBearerAuth() +export class UsersController { + constructor(private usersService: UsersService) {} + + @Get() + @Roles(Role.ADMIN) + @ApiOperation({ summary: 'Listar todos os usuários (Admin)' }) + @ApiResponse({ status: 200, description: 'Lista de usuários' }) + findAll() { + return this.usersService.findAll(); + } + + @Get(':id') + @Roles(Role.ADMIN) + @ApiOperation({ summary: 'Buscar usuário por ID (Admin)' }) + @ApiResponse({ status: 200, description: 'Usuário encontrado' }) + @ApiResponse({ status: 404, description: 'Usuário não encontrado' }) + findOne(@Param('id', ParseIntPipe) id: number) { + return this.usersService.findOne(id); + } + + @Post() + @Roles(Role.ADMIN) + @ApiOperation({ summary: 'Criar novo usuário (Admin)' }) + @ApiResponse({ status: 201, description: 'Usuário criado com sucesso' }) + @ApiResponse({ status: 409, description: 'Email já cadastrado' }) + create(@Body() createUserDto: CreateUserDto) { + return this.usersService.create(createUserDto); + } + + @Put(':id') + @Roles(Role.ADMIN) + @ApiOperation({ summary: 'Atualizar usuário (Admin)' }) + @ApiResponse({ status: 200, description: 'Usuário atualizado' }) + @ApiResponse({ status: 404, description: 'Usuário não encontrado' }) + update(@Param('id', ParseIntPipe) id: number, @Body() updateUserDto: UpdateUserDto) { + return this.usersService.update(id, updateUserDto); + } + + @Delete(':id') + @Roles(Role.ADMIN) + @ApiOperation({ summary: 'Remover usuário (Admin)' }) + @ApiResponse({ status: 200, description: 'Usuário removido' }) + @ApiResponse({ status: 404, description: 'Usuário não encontrado' }) + remove(@Param('id', ParseIntPipe) id: number) { + return this.usersService.remove(id); + } + + @Patch(':id/toggle-active') + @Roles(Role.ADMIN) + @ApiOperation({ summary: 'Ativar/Desativar usuário (Admin)' }) + @ApiResponse({ status: 200, description: 'Status alterado' }) + toggleActive(@Param('id', ParseIntPipe) id: number) { + return this.usersService.toggleActive(id); + } +} diff --git a/backend/src/users/users.module.ts b/backend/src/users/users.module.ts new file mode 100644 index 0000000..513776d --- /dev/null +++ b/backend/src/users/users.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { UsersController } from './users.controller'; +import { UsersService } from './users.service'; + +@Module({ + controllers: [UsersController], + providers: [UsersService], + exports: [UsersService], +}) +export class UsersModule {} diff --git a/backend/src/users/users.service.ts b/backend/src/users/users.service.ts new file mode 100644 index 0000000..b72b6df --- /dev/null +++ b/backend/src/users/users.service.ts @@ -0,0 +1,129 @@ +import { Injectable, NotFoundException, ConflictException } from '@nestjs/common'; +import * as bcrypt from 'bcrypt'; +import { PrismaService } from '../prisma/prisma.service'; +import { CreateUserDto } from './dto/create-user.dto'; +import { UpdateUserDto } from './dto/update-user.dto'; + +@Injectable() +export class UsersService { + constructor(private prisma: PrismaService) {} + + async findAll() { + return this.prisma.user.findMany({ + select: { + id: true, + email: true, + nome: true, + role: true, + ativo: true, + createdAt: true, + updatedAt: true, + }, + orderBy: { createdAt: 'desc' }, + }); + } + + async findOne(id: number) { + const user = await this.prisma.user.findUnique({ + where: { id }, + select: { + id: true, + email: true, + nome: true, + role: true, + ativo: true, + createdAt: true, + updatedAt: true, + }, + }); + + if (!user) { + throw new NotFoundException('Usuário não encontrado'); + } + + return user; + } + + async findByEmail(email: string) { + return this.prisma.user.findUnique({ + where: { email }, + }); + } + + async create(createUserDto: CreateUserDto) { + const existingUser = await this.findByEmail(createUserDto.email); + if (existingUser) { + throw new ConflictException('Email já cadastrado'); + } + + const hashedPassword = await bcrypt.hash(createUserDto.password, 10); + + const user = await this.prisma.user.create({ + data: { + email: createUserDto.email, + password: hashedPassword, + nome: createUserDto.nome, + role: createUserDto.role || 'OPERADOR', + ativo: createUserDto.ativo ?? true, + }, + select: { + id: true, + email: true, + nome: true, + role: true, + ativo: true, + createdAt: true, + updatedAt: true, + }, + }); + + return user; + } + + async update(id: number, updateUserDto: UpdateUserDto) { + await this.findOne(id); + + const data: any = { ...updateUserDto }; + + if (updateUserDto.password) { + data.password = await bcrypt.hash(updateUserDto.password, 10); + } + + return this.prisma.user.update({ + where: { id }, + data, + select: { + id: true, + email: true, + nome: true, + role: true, + ativo: true, + createdAt: true, + updatedAt: true, + }, + }); + } + + async remove(id: number) { + await this.findOne(id); + await this.prisma.user.delete({ where: { id } }); + return { message: 'Usuário removido com sucesso' }; + } + + async toggleActive(id: number) { + const user = await this.findOne(id); + return this.prisma.user.update({ + where: { id }, + data: { ativo: !user.ativo }, + select: { + id: true, + email: true, + nome: true, + role: true, + ativo: true, + createdAt: true, + updatedAt: true, + }, + }); + } +} diff --git a/backend/tsconfig.json b/backend/tsconfig.json new file mode 100644 index 0000000..2cc2a71 --- /dev/null +++ b/backend/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "module": "commonjs", + "declaration": true, + "removeComments": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "target": "ES2021", + "sourceMap": true, + "outDir": "./dist", + "baseUrl": "./", + "incremental": true, + "skipLibCheck": true, + "strictNullChecks": true, + "noImplicitAny": true, + "strictBindCallApply": true, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true, + "esModuleInterop": true, + "resolveJsonModule": true + }, + "exclude": [ + "src/**/*.spec.ts", + "src/**/tests/**" + ] +} \ No newline at end of file diff --git a/docs/API-ROUTES.md b/docs/API-ROUTES.md new file mode 100644 index 0000000..621f982 --- /dev/null +++ b/docs/API-ROUTES.md @@ -0,0 +1,209 @@ +# DuOrigin v2 - API Routes + +## Autenticação + +Todas as rotas (exceto login/registro) requerem autenticação via JWT. +Header: `Authorization: Bearer ` + +### POST /api/auth/login +Login de usuário. +```json +// Request +{ "email": "user@email.com", "password": "senha123" } + +// Response +{ "success": true, "data": { "accessToken": "jwt...", "tokenType": "bearer" } } +``` + +### POST /api/auth/registro +Registrar novo usuário. +```json +// Request +{ "email": "user@email.com", "password": "senha123", "fullName": "Nome", "role": "operator" } + +// Response +{ "success": true, "data": { "id": 1, "email": "...", "fullName": "...", "role": "operator", "isActive": true, "createdAt": "..." } } +``` + +### GET /api/auth/me +Dados do usuário logado. +```json +// Response +{ "success": true, "data": { "id": 1, "email": "...", "fullName": "...", "role": "...", "isActive": true, "createdAt": "..." } } +``` + +--- + +## Empresas (Companies) + +### GET /api/empresas +Lista todas as empresas. + +### POST /api/empresas +Criar nova empresa. +```json +{ "name": "Nome", "cnpj": "12345678000190", "country": "BR", "state": "SP", "city": "São Paulo", "euOperatorId": "EU-001" } +``` + +### GET /api/empresas/[id] +Detalhes de uma empresa. + +### PUT /api/empresas/[id] +Atualizar empresa. + +### DELETE /api/empresas/[id] +Excluir empresa. + +--- + +## Propriedades (Producers) + +### GET /api/propriedades +Lista todas as propriedades. +Query: `?companyId=1` para filtrar por empresa. + +### POST /api/propriedades +Criar nova propriedade. +```json +{ "name": "Nome", "cpfCnpj": "12345678901", "companyId": 1, "state": "MT", "city": "Cuiabá", "carCode": "MT-123" } +``` + +### GET /api/propriedades/[id] +Detalhes de uma propriedade. + +### PUT /api/propriedades/[id] +Atualizar propriedade. + +### DELETE /api/propriedades/[id] +Excluir propriedade. + +--- + +## Avaliações (Areas) + +### GET /api/avaliacoes +Lista todas as avaliações/áreas. +Query: `?producerId=1` para filtrar por produtor. + +### POST /api/avaliacoes +Criar nova avaliação. +```json +{ "name": "Nome", "producerId": 1, "geojson": "{...}", "areaHa": 100.5, "biome": "Cerrado", "latCenter": -15.0, "lonCenter": -56.0 } +``` + +### GET /api/avaliacoes/[id] +Detalhes de uma avaliação. + +### PUT /api/avaliacoes/[id] +Atualizar avaliação. + +### DELETE /api/avaliacoes/[id] +Excluir avaliação. + +### POST /api/avaliacoes/[id]/gerar-dds +Gerar Due Diligence Statement para a avaliação. +```json +// Request (opcional) +{ "notes": "Observações adicionais" } + +// Response +{ "success": true, "data": { "id": 1, "referenceNumber": "DDS-ABC123", "status": "draft", ... } } +``` + +--- + +## Dashboard + +### GET /api/dashboard/stats +Estatísticas do sistema. +```json +{ + "success": true, + "data": { + "totalEmpresas": 10, + "totalPropriedades": 50, + "totalAvaliacoes": 100, + "totalLotes": 200, + "totalDds": 25, + "ddsByStatus": { "draft": 5, "submitted": 10, "approved": 8, "rejected": 2 }, + "riskDistribution": { "low": 70, "medium": 20, "high": 8, "critical": 2 }, + "recentActivity": [...] + } +} +``` + +--- + +## Usuários (Admin Only) + +### GET /api/usuarios +Lista todos os usuários. Requer role `admin`. + +### GET /api/usuarios/[id] +Detalhes de um usuário. + +### PUT /api/usuarios/[id] +Atualizar usuário. +```json +{ "email": "novo@email.com", "fullName": "Novo Nome", "role": "admin", "isActive": true, "password": "novaSenha" } +``` + +### DELETE /api/usuarios/[id] +Excluir usuário (não pode excluir a si mesmo). + +--- + +## Formato de Resposta Padrão + +### Sucesso +```json +{ "success": true, "data": { ... } } +``` + +### Erro +```json +{ "success": false, "error": "Mensagem de erro" } +``` + +## Códigos de Status HTTP + +- `200` - OK +- `201` - Created +- `400` - Bad Request +- `401` - Unauthorized +- `403` - Forbidden +- `404` - Not Found +- `500` - Internal Server Error + +--- + +## Estrutura de Arquivos + +``` +src/app/api/ +├── auth/ +│ ├── login/route.ts # POST - Login +│ ├── registro/route.ts # POST - Registro +│ └── me/route.ts # GET - Dados do usuário +├── empresas/ +│ ├── route.ts # GET list, POST create +│ └── [id]/route.ts # GET, PUT, DELETE +├── propriedades/ +│ ├── route.ts # GET list, POST create +│ └── [id]/route.ts # GET, PUT, DELETE +├── avaliacoes/ +│ ├── route.ts # GET list, POST create +│ ├── [id]/route.ts # GET, PUT, DELETE +│ └── [id]/gerar-dds/route.ts # POST - Gerar DDS +├── dashboard/ +│ └── stats/route.ts # GET - Estatísticas +└── usuarios/ + ├── route.ts # GET list (admin) + └── [id]/route.ts # GET, PUT, DELETE (admin) +``` + +## Libs Auxiliares + +- `src/lib/prisma.ts` - Prisma Client singleton +- `src/lib/auth.ts` - JWT helpers (createToken, verifyToken, requireAuth, requireAdmin) +- `src/lib/password.ts` - bcrypt helpers (hashPassword, verifyPassword) diff --git a/docs/EUDR-API-INTEGRATION.md b/docs/EUDR-API-INTEGRATION.md new file mode 100644 index 0000000..499a6be --- /dev/null +++ b/docs/EUDR-API-INTEGRATION.md @@ -0,0 +1,527 @@ +# EUDR API Integration - Documentação Técnica + +> **Versão**: 1.4 +> **Data**: Fevereiro 2026 +> **Baseado em**: EUDR API EO Specifications v1.4 (22 Julho 2025) + +## 📋 Índice + +1. [Visão Geral](#visão-geral) +2. [Ambientes](#ambientes) +3. [Autenticação](#autenticação) +4. [Serviços da API](#serviços-da-api) +5. [Conformance Tests](#conformance-tests) +6. [Estrutura XML/SOAP](#estrutura-xmlsoap) +7. [GeoJSON para Geolocalização](#geojson-para-geolocalização) +8. [Unidades de Medida](#unidades-de-medida) +9. [Regras de Validação](#regras-de-validação) +10. [Códigos de Erro](#códigos-de-erro) +11. [Fluxo de Integração DuOrigin](#fluxo-de-integração-duorigin) + +--- + +## Visão Geral + +A API EUDR permite a submissão e gestão de DDS (Due Diligence Statements) de forma automatizada via **SOAP/WSDL** (machine-to-machine). O DuOrigin atua como intermediário entre o operador e a API oficial da UE. + +### Arquitetura + +``` +┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ +│ Operador │────▶│ DuOrigin │────▶│ EUDR API │ +│ (Frontend) │ │ (Backend) │ │ (EU Server) │ +└─────────────────┘ └─────────────────┘ └─────────────────┘ + │ │ │ + Formulário SOAP Client SOAP/WSDL + Web UI NestJS XML Messages +``` + +### Serviços Disponíveis + +| Serviço | Descrição | Versões | +|---------|-----------|---------| +| `Echo` | Teste de conexão/autenticação | V1 | +| `submitDDS` | Submissão de nova DDS | V1, V2 | +| `amendDDS` | Alteração de DDS existente | V1, V2 | +| `retractDds` | Cancelar/Retirar DDS | V1, V2 | +| `getDDSInfo` | Obter status e referência de DDS | V1, V2 | +| `getStatementByIdentifiers` | Obter dados completos de DDS | V1, V2 | +| `getReferencedDds` | Obter DDS referenciadas na cadeia | V2 | + +--- + +## Ambientes + +### Production (Produção) +- **URL Base**: `https://webgate.ec.europa.eu/tracesnt/` +- **Uso**: DDS com valor legal +- **Requisito**: Passar todos os Conformance Tests (CF1-CF7) + +### Acceptance Cloud (Testes) +- **URL Base**: `https://acceptance.eudr.webcloud.ec.europa.eu/tracesnt/` +- **Uso**: Testes funcionais e Conformance Tests +- **WebServiceClientId de Teste**: `eudr-test` + +### URLs dos WSDLs + +**ACCEPTANCE (Testes):** +- Submission WS: `https://acceptance.eudr.webcloud.ec.europa.eu/tracesnt/services/EudrSubmissionServiceV1.wsdl` +- Submission V2: `https://acceptance.eudr.webcloud.ec.europa.eu/tracesnt/services/EudrSubmissionServiceV2.wsdl` +- Retrieval WS: `https://acceptance.eudr.webcloud.ec.europa.eu/tracesnt/services/EudrRetrievalServiceV1.wsdl` +- Retrieval V2: `https://acceptance.eudr.webcloud.ec.europa.eu/tracesnt/services/EudrRetrievalServiceV2.wsdl` +- Echo WS: `https://acceptance.eudr.webcloud.ec.europa.eu/tracesnt/services/EudrEchoService.wsdl` + +**PRODUCTION (Produção):** +- Submission WS: `https://webgate.ec.europa.eu/tracesnt/services/EudrSubmissionServiceV1.wsdl` +- Retrieval WS: `https://webgate.ec.europa.eu/tracesnt/services/EudrRetrievalServiceV1.wsdl` +- (Echo não disponível em produção) + +--- + +## Autenticação + +A API utiliza **WS-Security UsernameToken com Digest** (HTTPS obrigatório). + +### Estrutura do Header de Segurança + +```xml + + + 2026-02-09T12:00:00.000Z + 2026-02-09T12:05:00.000Z + + + EU_LOGIN_USERNAME + BASE64_DIGEST + BASE64_NONCE + 2026-02-09T12:00:00.000Z + + +``` + +### Cálculo do Password Digest + +``` +Password = Base64( SHA-1( Nonce + Created + AuthenticationKey ) ) +``` + +Onde: +- **Nonce**: 16 bytes aleatórios em Base64 +- **Created**: Timestamp ISO 8601 +- **AuthenticationKey**: Chave obtida no TRACES NT + +### Campos Obrigatórios no SOAP Envelope + +```xml +eudr-test +``` + +--- + +## Serviços da API + +### 1. Echo Test (CF1) +Teste de conexão - disponível apenas em ambientes de teste. + +**Endpoint**: `{EUDR_URL}/services/EudrEchoService#testEcho` + +**Request:** +```xml + + Test message + +``` + +**Response:** +```xml + + Test message + +``` + +### 2. Submit DDS (CF2) +Submissão de nova Declaração de Due Diligence. + +**Endpoint**: `{EUDR_URL}/services/EudrSubmissionServiceV2#submitDDS` + +**Request (V2):** +```xml + + eudr-test + IMPORT + false + REF-2026-001 + + + + Empresa Exemplo Ltda + Rua Principal, 100 + 01000-000 + São Paulo + BR + BR12345678901234 + + + + 1201 + Soybeans for export + 50000 + 5 + + + BR + Fazenda Exemplo + {"type":"FeatureCollection","features":[...]} + + + +``` + +**Response:** +```xml + + 550e8400-e29b-41d4-a716-446655440000 + +``` + +### 3. Get DDS Info (CF3) +Obter status e número de referência. + +**Endpoint**: `{EUDR_URL}/services/EudrRetrievalServiceV2#getDdsInfo` + +**Request por UUID:** +```xml + + eudr-test + 550e8400-e29b-41d4-a716-446655440000 + +``` + +**Response:** +```xml + + + 550e8400-e29b-41d4-a716-446655440000 + AVAILABLE + EUDR-2026-0001234 + VN123456789 + REF-2026-001 + ... + ... + + +``` + +### 4. Amend DDS (CF5) +Alterar DDS em status AVAILABLE. + +**Endpoint**: `{EUDR_URL}/services/EudrSubmissionServiceV2#amendDDS` + +**Nota**: A mensagem é semelhante a submitDDS, mas inclui o UUID da DDS a ser alterada. + +### 5. Retract DDS (CF6) +Cancelar/Retirar DDS. + +**Endpoint**: `{EUDR_URL}/services/EudrSubmissionServiceV2#retractDds` + +**Request:** +```xml + + eudr-test + 550e8400-e29b-41d4-a716-446655440000 + +``` + +### 6. Get Statement By Identifiers (CF7) +Obter dados completos de uma DDS usando Reference + Verification Number. + +**Endpoint**: `{EUDR_URL}/services/EudrRetrievalServiceV2#getStatementByIdentifiers` + +### 7. Get Referenced DDS (CF7) +Obter DDS referenciadas na cadeia de suprimentos (V2 only). + +**Endpoint**: `{EUDR_URL}/services/EudrRetrievalServiceV2#getReferencedDds` + +--- + +## Conformance Tests + +Sequência obrigatória para acesso à produção: + +| CF | Nome | Descrição | Obrigatório | +|----|------|-----------|-------------| +| CF1 | Echo Test | Conexão e autenticação | ✅ | +| CF2 | Submit DDS | Submissão de DDS | ✅ | +| CF3 | Get DDS Info | Obter referência/status | ✅ | +| CF4 | Error Handling | Gestão de erros | ✅ | +| CF5 | Amend DDS | Alteração de DDS | Opcional | +| CF6 | Retract DDS | Retirada de DDS | Opcional | +| CF7 | Get DDS Data | Obter dados completos | Opcional | + +### Fluxo de Certificação + +1. Registrar operador no TRACES NT (Acceptance) +2. Obter credenciais de Web Service +3. Executar CF1 (Echo) - validar autenticação +4. Executar CF2 (Submit) - submeter DDS de teste +5. Executar CF3 (Get Info) - obter referência +6. Executar CF4 - testar cenários de erro +7. Solicitar acesso à produção via email para SANTE-TRACES@ec.europa.eu + +--- + +## Estrutura XML/SOAP + +### Envelope SOAP Completo + +```xml + + + + + + + + + + + +``` + +### Namespaces + +| Prefixo | URI | +|---------|-----| +| soap | http://schemas.xmlsoap.org/soap/envelope/ | +| wsse | http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd | +| wsu | http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd | +| v21 | http://ec.europa.eu/tracesnt/eudr/v2.1 | +| v4 | http://ec.europa.eu/tracesnt/commons/v4 | + +--- + +## GeoJSON para Geolocalização + +A geolocalização é enviada como string JSON dentro do campo `GeoLocation`. + +### Estrutura GeoJSON para EUDR + +```json +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [-47.123456, -23.456789] + }, + "properties": { + "plotId": "PLOT-001", + "area": 3.5, + "harvestDate": "2025-06-15" + } + }, + { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [[ + [-47.100, -23.400], + [-47.100, -23.500], + [-47.200, -23.500], + [-47.200, -23.400], + [-47.100, -23.400] + ]] + }, + "properties": { + "plotId": "PLOT-002" + } + } + ] +} +``` + +### Regras de Geolocalização + +- **Latitude**: -90 a +90 +- **Longitude**: -180 a +180 +- **Precisão máxima**: 6 casas decimais (sistema arredonda automaticamente) +- **Área máxima para Point (não-gado)**: 4 hectares +- **Área mínima**: 0.1 hectare (0.0001 km²) +- **Polígonos**: Mínimo 4 pontos, não podem ter auto-interseção +- **Tamanho máximo por DDS**: 25 MB + +--- + +## Unidades de Medida + +### Para Import/Export + +| HS Code | Tipo | Descrição | +|---------|------|-----------| +| 010221, 010229 | NAR (p/st) | Número de itens | +| 4011, 4013 | NAR (p/st) | Número de itens | +| 4403, 4406, 4408, 4410-4413 | MTQ (m³) | Metro cúbico | +| 4701, 4702, 4704, 4705 | KSD (kg 90% sdt) | Kg substância 90% seca | + +**Campos obrigatórios Import/Export:** +- Net Mass (Kg): Sempre obrigatório +- Supplementary Unit: Obrigatório se HS Code estiver na lista acima + +### Para Domestic/Trade + +Combinações válidas: +1. Net Mass + Percentage estimate (0-25%) +2. Supplementary unit type + quantity +3. Ambos + +**Tipos de Supplementary Unit:** +| Código | Display | Descrição | +|--------|---------|-----------| +| KSD | KSD (kg 90% sdt) | Kg substância 90% seca | +| MTK | MTK (m²) | Metro quadrado | +| MTQ | MTQ (m³) | Metro cúbico | +| MTR | MTR (m) | Metro | +| NAR | NAR (p/st) | Número de itens | +| NPR | NPR (pa) | Número de pares | + +--- + +## Regras de Validação + +### Operador + +| Regra | Descrição | +|-------|-----------| +| Activity Type | Obrigatório; não pode mudar em amend | +| EORI | Obrigatório para IMPORT/EXPORT | +| Non-EU Operator | Apenas IMPORT permitido | +| Authorized Rep | Deve informar dados do operador representado | + +### Commodities + +| Regra | Descrição | +|-------|-----------| +| Mínimo | Pelo menos 1 commodity por DDS | +| Máximo | 100 commodities por DDS | +| Description | Obrigatório para cada commodity | +| Net Mass | Obrigatório para IMPORT/EXPORT | +| HS Code | Deve ser válido (Annex I EUDR) | +| Timber | Requer scientific name + common name | + +### Geolocalização + +| Regra | Descrição | +|-------|-----------| +| Obrigatória | Se não houver Referenced DDS | +| Tamanho máximo | 25 MB por DDS | +| Producers por commodity | Máximo 1000 | +| Producers por DDS | Máximo 10.000 | +| Área para Point | Obrigatória; default 4ha; máx 4ha (não-gado) | + +### DDS Referenciadas + +| Regra | Descrição | +|-------|-----------| +| Máximo | 2000 por DDS | +| Status | Deve estar AVAILABLE ou ARCHIVED | +| Auto-referência | DDS não pode referenciar a si mesma | + +--- + +## Códigos de Erro + +### Erros de Autenticação/Schema + +| Código HTTP | Descrição | +|-------------|-----------| +| 401 | Credenciais inválidas | +| 403 | Sem permissão | +| 500 | Erro de schema XML | + +### Erros de Negócio + +| Código | Descrição | +|--------|-----------| +| EUDR_WEBSERVICE_USER_NOT_EUDR_OPERATOR | Usuário não registrado como operador EUDR | +| EUDR_WEBSERVICE_USER_FROM_MANY_OPERATOR | Usuário pertence a mais de um operador | +| EUDR_WEBSERVICE_USER_ACTIVITY_NOT_ALLOWED | Atividade não permitida para o perfil | +| EUDR_OPERATOR_EORI_FOR_ACTIVITY_MISSING | EORI obrigatório para IMPORT/EXPORT | +| EUDR_BEHALF_OPERATOR_NOT_PROVIDED | Operador representado não informado | +| EUDR_BEHALF_OPERATOR_CITY_POSTALCODE_EMPTY_OR_INVALID | Cidade/CEP inválidos | +| EUDR_ACTIVITY_TYPE_NOT_COMPATIBLE | Atividade incompatível com perfil | +| EUDR_COMMODITIES_HS_CODE_INVALID | HS Code inválido | +| EUDR_COMMODITIES_DESCRIPTOR_NET_MASS_EMPTY | Net Mass obrigatório | +| EUDR_COMMODITIES_DESCRIPTOR_QUANTITY_MISSING | Quantidade obrigatória | +| EUDR_COMMODITITY_PRODUCER_COUNTRY_CODE_INVALID | Código de país inválido | +| EUDR_COMMODITIES_PRODUCER_GEO_EMPTY | Geolocalização obrigatória | +| EUDR_COMMODITIES_PRODUCER_GEO_INVALID | GeoJSON inválido | +| EUDR_COMMODITIES_PRODUCER_GEO_LATITUDE_INVALID | Latitude fora do range | +| EUDR_COMMODITIES_PRODUCER_GEO_LONGITUDE_INVALID | Longitude fora do range | +| EUDR_COMMODITIES_PRODUCER_GEO_INVALID_GEOMETRY | Geometria inválida | +| EUDR_COMMODITIES_PRODUCER_GEO_AREA_INVALID | Área inválida (0.1-4 ha) | +| EUDR_MAXIMUM_GEO_SIZE_REACHED | Tamanho máximo excedido (25MB) | +| EUDR_REFERENCED_STATEMENT_NOT_FOUND | DDS referenciada não encontrada | +| EUDR_MAXIMUM_REFERENCED_DDS_REACHED | Máximo de DDS referenciadas excedido | +| EUDR_API_AMEND_ACTIVITY_TYPE_CHANGE_NOT_ALLOWED | Não pode mudar activity type | +| EUDR_API_AMEND_OR_WITHDRAW_DDS_NOT_POSSIBLE | DDS referenciada ou prazo expirado | +| EUDR_API_AMEND_NOT_ALLOWED_FOR_STATUS | Status não permite alteração | +| EUDR_API_NO_DDS | DDS não encontrada | + +--- + +## Fluxo de Integração DuOrigin + +### 1. Cadastro de Operador +``` +Operador → DuOrigin UI → Salvar empresa com EORI, endereço, etc. +``` + +### 2. Submissão de DDS +``` +1. Operador preenche formulário DDS no DuOrigin +2. Sistema valida dados localmente +3. DuOrigin chama eudr-api.service.submitDDS() +4. Recebe UUID e armazena no banco +5. Polling getDDSInfo() para obter Reference Number +6. Atualiza status no DuOrigin +``` + +### 3. Acompanhamento +``` +1. DuOrigin faz polling periódico de getDDSInfo() +2. Atualiza status (SUBMITTED → AVAILABLE/REJECTED) +3. Notifica operador se houver CA message +``` + +### 4. Alterações +``` +1. Operador solicita alteração +2. DuOrigin valida prazo e referências +3. Chama amendDDS() com dados completos +4. Atualiza registro local +``` + +### 5. Retirada +``` +1. Operador solicita cancelamento/retirada +2. DuOrigin valida status e referências +3. Chama retractDds() com UUID +4. Atualiza status para WITHDRAWN/CANCELLED +``` + +--- + +## Contatos + +- **Suporte Técnico**: SANTE-TRACES@ec.europa.eu (título deve começar com "EUDR API") +- **Política**: ENV-DEFORESTATION@ec.europa.eu +- **Website**: https://environment.ec.europa.eu/topics/forests/deforestation/regulation-implementation_en + +--- + +*Documentação gerada para DuOrigin v2 - Fevereiro 2026* 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..d2e7761 --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,73 @@ +# React + TypeScript + 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 updating the configuration to enable type-aware lint rules: + +```js +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + + // Remove tseslint.configs.recommended and replace with this + tseslint.configs.recommendedTypeChecked, + // Alternatively, use this for stricter rules + tseslint.configs.strictTypeChecked, + // Optionally, add this for stylistic rules + tseslint.configs.stylisticTypeChecked, + + // Other configs... + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` + +You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: + +```js +// eslint.config.js +import reactX from 'eslint-plugin-react-x' +import reactDom from 'eslint-plugin-react-dom' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + // Enable lint rules for React + reactX.configs['recommended-typescript'], + // Enable lint rules for React DOM + reactDom.configs.recommended, + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` diff --git a/frontend/eslint.config.js b/frontend/eslint.config.js new file mode 100644 index 0000000..5e6b472 --- /dev/null +++ b/frontend/eslint.config.js @@ -0,0 +1,23 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs.flat.recommended, + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + }, +]) diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..7c06456 --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,17 @@ + + + + + + + + DuOrigin - Compliance EUDR + + + + + +
+ + + diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 0000000..a78a49a --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,5510 @@ +{ + "name": "frontend", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "frontend", + "version": "0.0.0", + "dependencies": { + "@hookform/resolvers": "^5.2.2", + "axios": "^1.13.5", + "lucide-react": "^0.563.0", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "react-hook-form": "^7.71.1", + "react-router-dom": "^7.13.0", + "recharts": "^3.7.0", + "zod": "^4.3.6" + }, + "devDependencies": { + "@eslint/js": "^9.39.1", + "@tailwindcss/postcss": "^4.1.18", + "@types/node": "^24.10.1", + "@types/react": "^19.2.7", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^5.1.1", + "autoprefixer": "^10.4.24", + "eslint": "^9.39.1", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.4.24", + "globals": "^16.5.0", + "postcss": "^8.5.6", + "tailwindcss": "^3.4.19", + "typescript": "~5.9.3", + "typescript-eslint": "^8.48.0", + "vite": "^7.3.1" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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/@hookform/resolvers": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-5.2.2.tgz", + "integrity": "sha512-A/IxlMLShx3KjV/HeTcTfaMxdwy690+L/ZADoeaTltLx+CVuzkeVIPuybK3jrRfw7YZnmdKsVVHAlEPIAEUNlA==", + "license": "MIT", + "dependencies": { + "@standard-schema/utils": "^0.3.0" + }, + "peerDependencies": { + "react-hook-form": "^7.55.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==", + "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==", + "dev": true, + "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==", + "dev": 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/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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==", + "dev": true, + "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/node/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==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.18.tgz", + "integrity": "sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.18", + "@tailwindcss/oxide": "4.1.18", + "postcss": "^8.4.41", + "tailwindcss": "4.1.18" + } + }, + "node_modules/@tailwindcss/postcss/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==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "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": "24.10.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.12.tgz", + "integrity": "sha512-68e+T28EbdmLSTkPgs3+UacC6rzmqrcWFPQs1C8mwJhI/r5Uxr0yEuQotczNRROd1gq30NGxee+fo0rSIxpyAw==", + "dev": 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/@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/typescript-estree/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@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/@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/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "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/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": 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/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/autoprefixer": { + "version": "10.4.24", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.24.tgz", + "integrity": "sha512-uHZg7N9ULTVbutaIsDRoUkoS8/h3bdsmVJYZ5l3wv8Cp/6UIIoRDm90hZ+BwxUj/hGBEzLxdHNSKuFpn8WOyZw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001766", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "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/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "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/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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/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/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/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "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/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/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/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "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-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==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-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-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "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-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-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/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==", + "dev": true, + "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==", + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "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" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "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/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==", + "dev": true, + "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/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "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-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/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "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/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/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "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/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/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/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "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/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "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-hook-form": { + "version": "7.71.1", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.71.1.tgz", + "integrity": "sha512-9SUJKCGKo8HUSsCO+y0CtqkqI5nNuaDqTxyqPsZPqIwudpj4rCrAz/jZV+jn57bx5gtZKOh3neQu94DXMc+w5w==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19" + } + }, + "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/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", + "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", + "dev": true, + "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/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.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==", + "dev": true, + "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/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "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/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "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/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "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==", + "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/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/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-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "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/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/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==", + "dev": 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/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "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==", + "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..4be6af2 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,41 @@ +{ + "name": "frontend", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@hookform/resolvers": "^5.2.2", + "axios": "^1.13.5", + "lucide-react": "^0.563.0", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "react-hook-form": "^7.71.1", + "react-router-dom": "^7.13.0", + "recharts": "^3.7.0", + "zod": "^4.3.6" + }, + "devDependencies": { + "@eslint/js": "^9.39.1", + "@tailwindcss/postcss": "^4.1.18", + "@types/node": "^24.10.1", + "@types/react": "^19.2.7", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^5.1.1", + "autoprefixer": "^10.4.24", + "eslint": "^9.39.1", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.4.24", + "globals": "^16.5.0", + "postcss": "^8.5.6", + "tailwindcss": "^3.4.19", + "typescript": "~5.9.3", + "typescript-eslint": "^8.48.0", + "vite": "^7.3.1" + } +} diff --git a/frontend/postcss.config.js b/frontend/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/frontend/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/frontend/public/logo-duorigin.jpg b/frontend/public/logo-duorigin.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cee0a5eaa6105d8065b15ba1f3a2739af3d897cc GIT binary patch literal 33526 zcmb4qWmp|ev*6(F?k+)s1c%@f+%34fyAv$9OMu`KEV#Q{aCdiimpysk{r27;clUX= z=1fmbcXd~FS9P_Wd0%+n08pjGCB*?SFfiZ?=mOriz!oG$MD!GtzqHeg|0Bi!I}*;=#K{Om zasj$29YM@NGGT&nOtXJ++P}Erzc}At+|AkE8APM-7k5-q5&_}HAe`3hzu|`e4L7oP z{7WARqT#c#cKOTeFZ`_?qKU1lGUy2lx(NX%Knailg#Xqb^bP{MTmay@1ptWH|B5qA z1%QTN0Ki@PuQfco+Oiu3P=LBfD!N!gs}q501LqJz6^)}kPr}me~=K6P>_&N z(C{$OAV7kHhlNK$LPbSELP18uz{NyE$3aI%!6L-M!NVgUAV9?=A|b*j!Nn)Q|62$c zBoq`h6f`0X3?e=n3L5_ZH@tTPXt3ZA;BydQ|hN#^kGtL z_#`0!&HQgZ1^`uq7C@te2Ot>$MI{Do_;32zP++vl3ILg~3P{~wh5bbVZ2y0FfQtC5 zbKzk)NkMeYFI8fK=-mMfs!0G8xFS^|I0LpqA}EneQV>!J>aQ_^nNUGy13)+_0LFkx z1pv}efFOBir3SVFCLmf_C9I?n3?~GYND5v6i-3S-0sx6n|L_6OdjU+4Xh0$ufC^xu zf+wQFR;qwX2iN?9rC%usCWx7=0wTq>Eaj+?wl%ubGz_W)<&;8?2gSk(0^pdzUjPL` zAR84*Q&12VOd0`H7yxLB<|<%@^An5R-u+ye@e;XjVVKctYww%RLYiUASk+4aAAdSa z)-JcysZC^1#JN&emm8u5{6SSoL{-W5C#3}x#L$Ohv*8T%OaB$LQY9OK_K4S;V_d*k zL)~D>v*EUM#da*M;lf65uH-pg`M#JdWH&9(RC;8V_p3N#(uG6ICrYM21m~AqzV86! z^Zk!?Pp83pkl0iK{-m%#Hhi2QLoRwyHk#-MaR0wd5NH8-IB~3nog`|ei322g9VhRu zI;2$gU*tL=N6%b`E~Y2Ag_^~mcm{9ZdLH*)Z6nuQ9jZ=JvQwfSpL`ioVdU4d^t1n# zM6N*P4<0`ZDh?i10T6@-0Q78H08A+$a4)UF$Ron=c>gTi=s-Wy;|>MGN#ZQC=axxx zZl|6dW#8_`Gh<*J`n2GTt$pOkdVxg7t!ngfySYO5x#rV<;+kD7m7 z4*;7)3$Boi1tkT*gKN-&1O6ax0pRiev48olt%gPSM0uux;kjom$tetlo_^t6~SCN(V>XOy(#p5gC6L@p+ z_DU0eqU$GGL%cyEuvAt4QLj_RZFgCJ**Yc~=3>pom9deVf5gJ~-qb!SCgrw6FJnH9 zN)VhD5)i}^1!Dl90C?D3T1YV3U{VDj96c6LfTBWhY3I7O846wpnNuHq zHCq%=8q1~%P!)9XbzjZYzQ25ZV|*fP$@=1<=i}~qQvSW+kl)Sfu_GZN*02d|3|s*q zMH5vZ`vU5f{@DuPfD|gI&%uLy7P!AgA`y&M%u)L0;sS|H=}o2PR?r@IB{A$ znbsn~nIpJ*5~-Sf79bH0o4zb>@niDxaBU@tIJ{gVP#@qAeq3!XllRr<$lEH?`a|Y|gT@;M1So%yx4`s=f`tmLtoHxQ6J#&g zT}9Q_%MkN1A12+;^*Yk8hpv34d2c!xcok%KKBE}5x$Jh;XKChMA1^=7$A5-ia|qmr zJHLwAp3RC;V{Sda9=Nj8G;6MLO&~bGwYFYU$OZ$*l>ABkbMrO+_GEB{>d=4G3NqWj zO-w~yJncoV>++EGdvV#g>GqXP9R{UcuU~U;{qBX?wnIrSdf@orv;F2Sk3>vNOgugVkxYK5xnRDCXZW5*EN#@rQy0nPyP7G{~t!0Z{$`0?4rd z2v}@mE^$6~DBm+4asA{|Zbv=G#Yx)qmdso4UR+mDL~gF`R-z@QV^%NskG&mu#yXPf z-vRBqU#zWb46nYP4=#Tl^N7l1n z6~id~B(;Ut(}g&(clJe!UqE93DY-v-CuFVy@J(OyOE&CZ(f$I17-WGIpbBah04kA+ z3ILM+#*&8u=$!y)kjVx_F;x=(Rtf~z3aEerCOE#QQ-LRk;4JfPxqm2MPQ9(42 z;Q!Pa)Z|c9KpT@&5yP;6uJx01X6(sJ)5GVOr>pxM7O%;0%)jm%vIm2ia&Ft-eNLx-?&>T-_)0ZJ& zzal##43x8_HSk>4vS{PY61b?nqd6ZVj@a9Lly^DEjK24~tdZebh_)TQlHjy8k6yfk zQJuUYtguV+_|&}YX6mbZ!>?m1ztbV2S;-}k#r&sWW~9K&eeZ7_&io69 z)CFs4bn9A97v9^UVtsr=t!#eU=P}VDQCo*ZRmHD1O&6QSKlbT&*F`<%CqEMr$FJb0 z$V={KAxmJ#&#VPq?^_&2GO>3(t`Z#!Pu8%0DveUB^i>uofB`hLb~-ji+39IjmO%kJ=?A8~N` zyy~fsYX8Bx&Lhq|!Os&XiUEfTMo)tA%-}*>yztV%NlmHlkpS#IZ*3SeG?tHfOsSA@h&QilIz zDzGkb`0(p^`=*flV%WxkTU4C{udJzmV5ERSB(MC^|7v6;nAA|y9K?i75I`RWJ;8oI zlKlQ=N;9+TF4Mt3jXPphzHw#k!s{o02BC4kIYsEjk=(lQbxS9%+$%Hjtg_utRVP_* z?kX>D|He<6BWu6-ba$SBLi-+CsNz|U?0LI|f_Tq0^|MhM40V>>IzpxV^z~F$yS#kj zymG?ZllS^K(_ueP^gDntV*Q7`f1tNu`p7Og?7d z2hG5lE)2yPzkoZ9<`P`@K1$LPO4jiWPjo2*3H=QTQx>H|ho8aq>ty$yV)yP_fa2xT zWY?|_%>MNa&GzLT)Bg9dz~C{O(PvQ4135HO&;!g68yhO|pP}gAndRSk{uSuIw{EMC{! z;4R;|U-zj6n#fIK<-Y?8PH8I*GZ}ohPY%fOT+5igs-lkKuoHhO1r6Ar7S#sLQdKc1 z8Cl7zuy78N%{Uq<7{d9#(l;Fs2^*-KqV8J;@@nHPZH!IBZ+$M^T^g(*mi6toV&)ot z`yG=sWoU059YdDz+iarVfmlaMf4i}GIj`?eXXVy`{l5QZ??m=Ec;}B(9`mY+6PHHf zt~Vs5lS{!&EjR@j>=_lQFu9DDAqz{L8PVy6Bavnb)g2D|V zj>p8v@`!ZJnuIb|A+N=zeZSt+QIx^Z@=qhWM|BU0s{urHSveU1Fk*9|JCMNc_H-6zOOR#`*_y~E^!DACj zG4kYD3dtnfZ7z?)LpM7pPiaD6!@+=IgKq6#Bx!fY5d&)0_TG*M4-h?X^)#jfvIXfd z^@RNc_6!*wGoV@dDsV$f4&i8M>?93QR|C(i_kl{7P-p>3{|{=qAyHwYj?x8qekqN@ z^gUON#9ZBFGyBFM5w!$~+WOe?iCl4IK!5#dh$Y0IkZByfKzu>Fisf0XcsMJl!HhP41hbAHfvUfqm7;xS%Zok3C)qBXwm-bbA=GWw z#({{uAx(-{l!+L!jmO8*y;{_Tor3u0@dDC$OJSqNbWlm7T6=v%v{utGVK(l_|-?FO%ag77e{;UYb1E z(RPW;@0^K$$wX-?r(;bYW|w^!fVg4&$sJSsYo4@1q>QvYeA$q?&#@#iLPAX`N@H2N zsuaC{C!L19Jm zXAbHyq}^Hw3Uyu9tMws}n#%J+hvd@et?pEO$tzfps;+w?UbN$i-j5S~+{vFyqn4&8 zjlMVb_>*{3^K}rF`5V&NV4!h4kAy$w+$WVOA&qf{cn)gKERJCldzN{GAi-{fqTG-S z-|x*0kDK3Pn~G_3OC#fr&Gb=28^&dyG#b~)6K)Tr77 ziO>_rf5IA^5ikW9bg!34v{a$AxfF>KecYE3=zbV; zQZZ5zvKS&S3p1bMY_6KC;RpGns#ot)nH4FS!zU=pvA0I+45dE}#$m9B+va`_8MOk7 z_b~CT@w^LE zSF?Sjcht4C6;5;~-Q5u#T4~m;Diaol4;}eqJhD3>VvKaTVVE4M^iBF_Uj)e)Tw;-8 z7|hV0u^SVYpci*$J^;3Kpij<&ze0!an?D!YJFp=eoIM+LX=3VLUc;xV8LK-VU)1^z zOpz9e8W6;yme`406WCT{7$qfq8a20^58MuOj31rL^*Fc1&SWAS3XoqCe=)s3q=~P7 zX`Y{560sDxKex*(imch^m)U8hKMgC3&t0Q;=WD?rq7pEqVaHv^GRty_xG}htN8F)1?M#Ed07vfwZQkx7e&K)Cn100k){p$DnF3e!#%= zvk{-3R>A@@?Zs)%m?Wh*1M!E_&d8t#<~%ZF?gqghd1rz$Th`w(^{~};FxW!n`0Ock zk}D{@j7_47Zf#`in}&5lJ9}SesEc@+VFWIo=L?ebhTvc|8Ovdi%{)m1eM2#DVo>ASy6!o)X{|`eUCE#Z)y%J{?<9BCBkuvtzLR>i;F`> zjGV*PAI7rS-huCI_27(2Kj(~DqT}>5v~5K8%r#{%wHhirKSy7lF16vHDq<@SvQ-)S zrj~qd-Sk6h^R!6vBkHkKkxbG?J zsHwkR_%HenyW8M$93`=BKd~ff%3peQRCRt%K0i%;YIJ^s)_rMDzv>8CYvY43Dfg#Z zw!&a=lS`nCo9fUmc8Lr9nc!wdL7JqW);{9}3mP5)UGHo0(H~SCrR-55)FSiZ#Z}hK zo&1)9v`Kx@Qv;RAQdgxXre)+EmazT5W6hTtTNRgtSaH~~w8}=U6r?sg&~h*NEZvcAjbZi8d@QE4n)&2jF10k(tN@PKX+333%;eDWbKU1m`u`I;Yr3=>`~Sp%8y zqU9hD=Vaj~ETNYcv9$Lwn*a*sYtWbQ@c6#7EN#zEkhoF7b9pj|i}gS>A?cz5vw^(p z9KRXlZFQAa)79BkXqH?p z7Y-;>gV4o3tB|p}AB=gwQ0X2n)Ei2Tv;IkP>E&Xp%+a{;qhA`8OHYp$+bCLU z_p#Ut3x!fKIhC$|v==r>BPQrUT}AB}C^xo%_bh)dZ-Hrcx^YiNeReh^LkbrG%XoRWW86$O!dK6YX#2 zO2vT^)jpf#G5=X@K$>9`6~~#qmcFp~DVYT4=E#1jP9`jlMyT!M@3s#x;npXYW@>Bc zKNj)Bh6pK99BCNbjfQtD*|{Vz$i-eAAifdqv7d^H=Zeqx3ANFP4>T#~N20@KWJLOA z2^AIfH@pJ~9iVkE9U1@z0S*lgKtueyI0o&#gF!%|p`w$KvnXJYQm_i?8`v}ZfBR?o z3p(`^0DHZ82W(gMN~7JJYBsHH0yp+*oFx=C)T;4%Z)EZGUX@f3J!wn4gRQ&-aASy& zL^YRA(p~3uh4mX|vD3AZWRb;3-dgFahpTVIxF8nilfidcz+{5J8tsg{!JfF0`x>3q z0_3}Slx!qa1}M$x5srdt*k6$ z3P<4)d=9>w-xw@S&BaAmHpEzr9A+chbZN;XA#||b1rIVKqo!(VYKNuNezB^2@??wh z^upN2q%^j6?+ zl_^%`R+ST#VHVk5bleBfPx1IPG+`X5RpI}Bz^8{IAha4LVUJPYd%(QNK~H+<)5^Pa z!Or)b>2Ubi{6^t=dg0spY))N)ya!(q+)Ce_xo^W(>+beR(<-o(gUz&$gOArY(yWxV zB(L$1*7qPQ%|&?LQL2${>JJ40TbNCfhHD2QZ$;R_SCoMI8%zm0OedtG#2raRJg%dd zS*hocyT7}`1Ff3!fJo=TzT?DMC9-< znwb#Zf%dPdGJ&dZNFyOCT=PLG0hH~nZj_qM=rfj~rMS5!A}XSe3}2Iq6D@zt!f7Vq z$r}lSn%y_wjVeg2iJYd|6E?ZmMWmbNit^BaG4wRZ6?-T2gyVC2z8iiG9TnYzR+L5( z(vf#;uIv-}fdz|bVo~%?khCE~LBL9Eeb4-22ZAs5OKxOde&g~ETEiU^NKX==og@fw za3~mf2p9-(7*H?zdpr(_hE9fx!6KvxMNYwL;NXM_+E5Z!(szuDH~iK`$til3u$8tQH?0ItApHy8z&EjGM}xfhZgGB zMP>896LRdu>z4CRv;oh;Eyds7lAd*tb>@VTq_-1a`O)@KF@EjLvu$%S z(Bj{7aP{x)Nm=1C%tfH^3@}Gl2@z28_9*A=Y+JyM^BPA{d1)Ukadfz4rPX@el_wlk zKcIj8{!BsEoBO!y(0;swY2zJybH-s$V|Ww!R3SB9a#QwHA@lD8^fuJ_=4-8_uw{)n zl6-k8Z29AY=dPn|59g!9^r-p+vRYqy`dEW&=w=Kj-=dk?J5cAjl4W_@@LD>zepjKD zaH`utvs59edzY2lLbA(1k~ZsDhWzbC!H2guijPfW58ml_0BzqD{FfzmN46d0%lyZV ztj^#EL|a~atniEsn%3R4&Zp!pLTnxj$f%R+%2`pOA zs@8EAp-+axUVyJY2o7!?< z5DV;dnu+`u=Z5%+mAx`4x#SPCgIMB>YUH%A+QHG3{SWevqdz1F+s<3yXGvol)nN}# z%_H@3cx)fwog)=^w(42lnzzr67wVr4S#f`K6Ths){J`x{xSTI^8M~Je>_A&DWW1Pr zEBOv|TP@hmBSe80e))PBGJvTuU7odSIXj0!lkki=_yNv_inqr89iW9a7F72&+u-E& zZ;pG`-bc@p*&dD6c6~UrgB%daU=u%ByLG z!HIlP+5=t}wzBUyis@9%gbatb?J?VLYgvYRQ4)VoN&M+0byhW!qe%+!si{=LJaX-+ zyht1C`pL9?nXXsq+_;J}ey5h!dAh7WFOM}3SwMBR3o(P&JjcBb;aCHVX^`@b@;hKy zTynS^jx)@nwW#{3El7Oyd$hDVinIVymvarzz@p{8?vZC;O$pz=n@72-K+5B_C7-;% zanR{!<)xnktJQ2dC?EP^;FfFM3J0g7F=paQRXKmfJO`V{$WzOnoXWXe^nZ$1w-ra0 zCE%GR`qji9h5K_WH^`=ew_}VVe2cBF0mpT0HghV!(4(8A%{dQKqU7=y5`%kVi@jX5 zBum@ge$57>&qw8R;wy%X;OJ9bp<%)&3s#&vWwse3_f4 zn0N>X84E$T+J_A&Zufj^7CO{I5_-b>a35-Vo{BOz^i;IcVXy+)(&AmYtQD`!Xq*-! ze(oS)_DVq;EW>F$%HF#*&Kyb9O(~7fQoNL#T4jt1fEg5pRU=Q7uNv|GEFNrPX+fIR z9&hYm#&Uz{Xd9lnI&2sOPT5P2|1kW3QCA;{JK|L8EA$)>y*~JnR&`5 z+$)g9!G$}GXLBYz#x-Zp;#}JyK`n-%J-^-598WVi*P-c!Uj4eO?smL4rxEHjY!7^$GFtQ1)d>O+PEgfz>a@hx9b}vl-P!wZC}`kamrm-m89I&S7MG_?Nwv`XXmA4^38Kw*nYjJb56(l zzOm`#KD+&qut_U&#tzG_5fA>Je)BX5T%8_s(NUtsb56rPS&F>Rp`Q}*9M0=Z0^G-T zV-hlgo}<-E$+2Ih`br^VEDqOXE-pr*TK^>ODfv!vzUCN}#UZ+n8HMz75_OpinSTmnX5EooMAcH&}`|Y=#r4Mm=)CsOmAau917SgC>BA zb_-#%qr#rx{Ce(wqQf_U(#-MU&5yOPf6?PtFP$IK`liZ5M{Ws=OQkua4LpoMnGxhG zKe)+fdG-pMo(a}ko@e6KqP7eM;)|6u+MdYe%8D1sQKl1(eRm`As|apBBe(X`2rQXs z4-JcLCZXH2UZ4Il%oA&)nvvqOYrlK=qKnlxETMNGAjB^gh2@}XLv5rs&drWrOJ&(%1{DF1Npt;?u5wxz~iDAK|yx)U`a zkvr-hde*$hFsi5~p}*?waUq@emqT3Pb`^9-x&pLObXrL7)V-Fz=3{b3a8UEs3zl+B zlU+%#PeVd3O>Y-P=CNr`QCuStX$IG3*<_bytmgeVv5E9Mb8nQ#@?lWhW6IJAt9%zb1$a1T( zjN*TmfyG{s^~{b(N36S@Q!^hh*zn0isLH>eod;Q#)2)u?9e`~+`{=MFH9KAZA`eL@ zUhU^z%C-IDL|?tgjnfIbGi@+U`??b9S-W@L*qbeRaAGf`4_bJlKdMJ$H*wPlYB;{x zU_#WRqwxFZy;1WfC1Koogeu9q02MutrH9(c3v4MbqE1f^IZzxHfMIlTiUN9mYIz4xU1*GI_n_HxN? z21aUVBfkg;1_ZrROn6;0X(bRuaA%Ib!kAT^Bh={!IZ0@)V8e>F?K{XtB#ixz;uvVn zUb?r+<-HFg?s08l$vq>56tB^tX&#yDk(GD{&P!&e8w4zt$HGiWTOjQ8^V9KWy!21b z98pOH5Z2t0PB?}JJm&?y_6IixiT_{gSq_Cat z;-HoA*eXOk*5?p^b`~`#n`LfDn{M)ac&b=_6imLr%ibDwdT7(k?GZ}LnS*%#ZNhzS zv64}wAA{D^(AoU*nelf-755b(qwQ2>Qb= z;=(p==C(do{m5IB_I@q#E3~Eh5%FoBBf8okRZmrp$=(n0)bd1x1uSGZW^BUqF3ZE^ zYhnS2G$}J@*<-ZU17qfhralhb?;cyq`P{8LT}v61A!iOvle;cRheR_cu+2cDeKsx#fl2-%E?LK} zbd$Ge*F`J~QxI#j!S<+KrFg1vR6ZHh58Q^gF)ciHyL)jo)}ZR5ftvx~Rv7k57z%6?(xy$`O3Ivfgj<;&Bim4-L*S`&( zLo*j{e~i{wsM@XMrp@&)zXObU=Wc1ttwY#%+*bPB&$63uJqRAR$b@qjVz;a~83b%F z%B{;@a@|#ZqwdEI-!qgJmbAB^McO=DI}Ajnx_cr|Ng98lv5fDZAxuc#CCR{6&BpB3 z`kYP5-B0yvYkah>$&Wb*%b~{OvVohJ;Y3(UCA~4DiSC`}WEPu<&Tm1(8Kf5Nev#)O zT!qYK5n$@h+R6V(V9S<#%wA5Ans)2KxE3fq^6|wSJ3X*Nv}UL(;P86Hb|0(cJ9TtT zBUuO;#p^!3<+AOLiwvrC)2LiPwr0Xw6N4 zX&2My?3GRF!AP2JiTi}Z%{A1n?&mB{NU^t2&g;Cy>KF+hqJ5SqkeBhgi`$)Y3VK5q04r6R zP%OPaIUOuY@=U7V@Mv6h|F{8_RRv=k*dIO=Sh*+DOksr65G{=Cvkuem55W?fC3>jlevW<~s($ea zU^V%BNJwSHw%mH@b|=AA{O-5}e1?x+Ux^S#R}sp1lV}i#Fz*&iNw!CdJCHEk!_)V9 zpmf}Odu9xwdEA%8N0Ri0KyoSwBFk~og4Gr}31xJjIgWCar{?^o9)}R43Be?$4);T( zv-^1vxe09+(KIwU(z(|pi_&<7(Z7xNCNHseirJ1kHB39Y>McJBq0O-G6duu|(oQ<@ zw)1vX@(xhR_YjAB6R;bJR8$Y$EjpGw80Y@*Ls~pAf;%MJYZ);iK>56Pb~cGkW+w0x z)P}jx4WzhisxN5-*GW>Rb7bP%m0Z-^Erb)!`fgt(5X|#0x&wPB|;cb9*w0);V`xgGI1>$ z$Av?fQEfFg*KnuS->zFVf5V9B?c^ikcyafLm>=r|q9_g+HhS5tWyycJq#Vbl^x|QU z!S)`&*~t%)EA30z_@Pnzs*v{cKAILTW9Q1=wa-ZztKB}r{K>=p3~pNPMBa5~ZaLT1 zj+VU%_**NISo6|HHk6;gEcli5~tN42VX^$Ab$>(n50r%yhFBZOGSNK%`689Q3Kt^I;`S8xbd zLu(EqMC;|G>~#j}OQ4uK$RM~U4j=hK8c!ojC8cS0W=)m(TpKk$kg%W>IpAGPN(pSk zqhN>$gkW)wD0|K5(N3yg{}uD}>PI>?QHpLc$)sn#pV(2=D~=cj-U{FHj4(pmW}G^s zR|`Tiy!$eN7uG0)#hNUJVPE}{r#rq*ud(_i|E_zs?ME5`PQ)l=qLMvCn2V%(y(XPl z7~Y5)HS@|TC>dcv4js>YbLbuDfFZ50@8-It__NcM;$vXwj$o36kv#s^#8_KJQR``a zl#{jILzT*&&;;vYilQTbe*WmH%7!FR#*IY+Nr#VQD@YywBb}7sW1AWqu)xNBrOYz! zI#o5@xv<*njYr8WS>n}@yA=8phUgDfs!*l)eoG}2ZD~~z1=-mPlUXg7YiWB@%E^$4 z42p+Z2uGzW%5H6BuDw-(OO0*~%%lumLFo7kE4Y4zd%Vw%MaBFV;~w^OpFiwk#lDEj zfR}ib(+|Bd@GcmnHxoh?WF+UYddsH+$`=l~g0hIAqx6%@sYT-M7dfOMh`n%r`4~O5 z^E|bhVFRbOKQz@PFd}Royx%n6HiXJ}GE^^$br_=9lJ_|8Lu#F3|D9bFX(2` zKb7IgWtPl&HS?ddx{cE7NO?wW8{&3x+PzgjtpEb4HqU$x-12b`l0@;jzm^In7EF_$kX(m3LFQ!QOZ66|?tleT(yk3va%Hec~C-=c*_U8Z=X5Fk3 zv{o9vinEi{-;60XP$*EU%&i+}kqr#0KeG+KJL@ls$jhtms?-G5uEVKRDz?_P^ZMPj z)@N3$xAUzLI(|s#=h5`<C#{{lH{sM80K?7AH+wv2{=;-)$oUF?IcX4p^zPd7R%@WykIU0%!&=PqU>FCV^fpz z_|0Lw!vR@E{jSa&Mp@@I6{kj5!IDjNBYF)m3cu$ynaf(02NMZQ9dAxcE2}Nk8P0NI zQk&nqp8?2|^xv#O8J<10RD7<3{DE*DOW?`rQfgs>ol8fco@B0h7lz}rGHZ=H6xpv1@e}H8(IiHL z_-NmD65}$@=Qq?(s_83piiiv03yd~2?^au#W_>>MU9QpDiDE|&@~#vkM# z33I~BjjHsAfW=n<}S; zD3>q8(E4_sg{3U1Mv+V6(FmwU+CH5~Gu>&QRZLR4i(8pX-vqNZK1w|f+vuoJTdFsJ zHgVxZAPv=d7fps#&T?XAe-h&@RPo3#)mztFHk(xrgave7C|47z2QTP2yj|e1@hmfC ze@6%iG%~jm@5I^-j`{ps<12)OAy0kC`X>{MZL8;QBsA6@)2|Fpus`yw;5Kk%G4$53 zahLFUp}&DiJw8S1}fU?+Xsu4N#{HrNc-hzN4AwzBJF@Ju$^4#t7@->%Io)wj9k zz-MqmAW0aA*wv&T#US<)?!gezTBzE@Z7lZ^X}OUnWLWAk^)Fsjhy4g)6w(*M5rW)V zWq{jQ<}Ut`zA&od9Iig9bv4ym<04YTlhGa7VnsDXkU=guc*VXHF`$oz(5Z4-+s5m(7nj zZd%c9uZGLu;N6p^>=yyc7!TCi??4fXhbOneT@dVKjp9lW`mcJ`2iD&{W$!?G)^+6s zO`#8Qhx8^(YVGfVMK|9_3m1Zg?cD9;5{tCIhwP&nPp-Ni6)V(HtD;cqB=G?(wd zr#HWAfr*YE=D#mq#)e1N7sj1 zh#%AQ_o&>MWWjh2d}fBW0C;)>B6K1>MkL1K!w=bT%h~X0(6I%{QGtKp!)|O}Ej)dB zqx^DMLn(NNnGOnnOh2Gi<%!_$ASPgJ_(m^rF))*wll+oq{i87!Xt*TLwg-!fy?CJ`el#p-GZ-zh$ymw66dj9=ip5u<<7B@`ke2+RL*mzoK9e^RSD zJosi#j(P7uC>qUqd*}G1GJ6=ayA7w*?A<`pX{U3M18vGn7GdNWcR_4t%4qx&F`{K$ z&-|mVBJ#OPJ`bGW$W1UbNuUeWS>r8|^Xl;1)DuZy%mxq9d{?#pp}Z-zNte|#hHliP zw99UXr!MLZBq0L_vN9_Vd&Pn{ql}w=Ra8sL(GU+Eh07|HSgOTmtXWL@MwV*x#g??Q z*U^&e;Yt1P`~ymr z7vBN9i$(qr<~lw*jKpkSZ6z#xk@%i@?DJXVWpEyWgRpf;fhm7@*%xAs(7PUIn}aoj zs3ucZL>@oz5}0fyICh{8G`&|?p=KY7oNr>RZyEY9aZBYFK0>{spQQoO(rQ4C0UlA7 zdd&7rroho#O3o4zzcupZPJ;>R?S;I%0SBq#KAH7Z^C$C{OMMs%LzqrYQS60`tScX; zla!eVn0}HXHt&uOB}j$>QP&ETQzpV_rZd(YFN;{A8b&rtUA_d`7j~I*+N?`})@9>$ z&}Gf!;@}le=Wiw_T=tI&DDg^V;!Cd^Te{6{6SzM3Ydc1p#8-F3$|x1WAq(cs$&tT= z0}^*07)6Zg1!ZmEgZ zZ}QhS!%>M-L8qj!@h$}D>R`MgYKcOcuuV2owyKEj1t3aVzw=$cTx zeZJagNWS5~)I^rA>rm0;ssSZ(7y0`rRgU6e|2rUQg|0)IX*QQ3zafuM1%02WpLI_D z-KA*oOnP1J5iVWNufqLY^N&K*&pZ_9>v2na=_EH1nADp%6gA8(w2A}Wp7RNcX7G)Z8Lvj!F|ti?^}#0cB|@&OGP7_7RL2n`xuQAF{o^630DjDjv_7rX5_#> zzT_ggha?UJUXVk8JhB^7lUd$!&6f|vcK=f4Wd2lDKWvf`K}j?9fDk66ELvA zS6GpLX*Eh!k{>r=7QT2;LJAnCo;snWR!ODY6&OOuhjVE~B#A1urwomU6{QG545!l_ z;Tp8Dx4NeM!8d-i>SU#*6Of`gR&-e=(@5X_Hi}p)QE2hNI%Y&#t<+ep$L}jY;w!w7 zL0Xt|B(k>pupkhar1*MMjG*ok?T*Y~9npanHvERE_u$o^3#kM5L*4c%5VC!GmT&=c z7@^xjPHhazkhH!vNaVhw^^FE??a#efieIh8!tHjcq%B7`xW4sbLbiP7YRADJ%$;4M z<{<;fLBoWMTq8PZR4SfnfvuKbk(-!N_q{)$;2UndLAA%$6z1IrA@MATg`=+if`4SC zxbLY;F2kEX;LgLW`wmc+SI~BowByExVr@JpD53PMv0B#?#Kqk8PJE6ekhep7;nr=R z;}KeD^(hOXmtOr4rPZswSX^~<{zAck_!u`kE_hgjO;cH)j^5pd?L;Iq()_$4M3$2+ zfhC^1tzhNv%!T?Z+a{sgNP>}def9VqAQl)Mwb%D$gGPgbPSDj)Ru21fej~(jOs_ft zPhM|y2NgcDr#M%U^$sL6y#pgjERtF}prZ*Mze%B0CKWQ@QRy zl1QBLx4DG#I`Tb2+WSB)E~FUo!t|X>)YUszF8>~dCtNznp{1%?0r=jw0NVDQovS;- zxLGq`S&_#4cwS+os-iRqGP%M1+a7N2q7s5_x%ZhK6xHT0(M_-4hL_&((nAF4q)H{F zI!;-uV*SC#=D6n}i&5jKEsVdIyc*xRh*JzY&{$?m^aWN zsVe(57l>R^SV7hDN_HM!vV ze1PNA9(yb$6_GUAS?lQgHHhu2j?sfHs0o%;LNt%%A0o4;R<= z$&AyOk2?E9*V9Ke8%+`W=d2fH*JbVcLtWwml#9P=CA=F;@FUl}UI2^NF0cvE$5B#z zF%+`=)7xB!XT>zGCOEVs$5~7xg-Xx27#f%oiHzblOO)9(q1a1h|Es5~42$afx_4j( zkQ};OkZwezh7zQ^8)>9Lx;q7FkdC3d8-|dOR1i_RkwzNd`Tak<^J$)E?mc(kQ?vKl zd#%%JJ?mdnK6plAGjfK9Sk|Q&H>7O&I%Dd|pfqhR&S?Ck_n5!crI@t+XVzS~P-TUn z6qM1&M@t^JeZuA3F?8ORkN(@%ukDZU=PFgF)RUaQsb{3!UtF(;OwMk^aLST@+SCjM zM<+x{ibmXxp1sVXpCqWqbILc0Wxo;LXTdFy`z^L1dAU~;Tf8ZTH@<9sX2;FH>76f( zpozIo#Xo0GmYLXn_n7-o%Ottt>M4k+*-S_FzTF?cPwbe1v3}btSQ1twge%?zGYeo! zSN9}DsLpn1A5SoO8fHKFO|iZ?tFE4pB-9OSd}VIse@J9UUN3f=eVcz_8!f!NpiYJ! zIaxd9u;*R&Li(SQGQB=ug&Q)H^t6^!XYU2v15jK{k=HYyn?ry8-tr`Nr+ zrC^7kuM@lDQU1vcRu~9_`TCDSAB>dm1fH1Z_xgO!SL8~?4L|+$*PWoI3D0kB6#4a- z5zYR1@oV3v!Tv6Kc>LoR@!WVbY3-TGiw_3=y$#@UUXeDJvp*~mxK z419BbpV0Iqg9cagAdM)Q%|9>2h+NyBY013{^IgF6{!v8 zN!>r<0ZJtYFeDw{2Mb*mh7}aVEBvsvvZk$3Z#x|qj6ME?l|7T*V^+m>M#4(V;W*(? z7F=krdGTPZi8eTPFx$75e!{^&Tj$p2XyNYB%jP97h48SPeC_u4s8M8yCqH}ivxEtZ&+#nj*ur8BfW96SSL1V1lx{wP6m;n>Wo21^2`a#drRlx zk@{Oa3r4lqOM4Rnt3}`Iq;?ZWHa@?=eS=mlwJbC%Cs!1vV5%svhv$2*_R(si>V#xj zAr0d_N~PnzOG-=pGEh!BQ1@!a zM}aD8M^o!N%@Hl%T!!1rsG5coaHOOItzEWyi%F=ag7ERz*i??sjtA6e)fMfl1`A*T z>l;nOExEDJJM>AI%lzhF1+OX-J}dYCelJ;PatO(@GQ}!wR@OcpK-HMD4Fg)x(YABZ zoPUs3#zB8u8V3K34hUVU!zUZzwBK0gQ-yI8&~w3#45baLn+wi3ceUN)l#2w@!fIX5I7}Nk;p!lZB0sNZ2kwxa&A&CMH8z& zt%jYEM=ow=DVezO5GEKfQg3FmFVkz)FbF)lhBAF^QM8qo5-yE@MPAyWtwXoP%bf+~ z*0FyPN^lpOOBOG3Tg8v`QH@F~xZ6Gq3+55^S}Y1AV#qcXCc|I+v8a1y_x=OB2D6|M zv#(9tJHsiqwZliS8H>=KvL6*Tjr=v*tsIC@-~mqz+?pF$`>KTZnS+7)QcQM%4t3xF z#q$aFJN2tUP0sg_pUn%?rGa18U4ILt9*(_#CE3i3@k5|5WWef5>orxGpHQQvUBY$! zb=K4>H`88Jg2Hp4RJ)||fekbJ()%Bvx$!D4gERs0&7?i(XYRb z3Myjv^9wq9E8WS}i6yBaG9@0(^1}B3i@kaelesVuVu*?Qc@HAjU?c_#R(@ko7ao_8 zKpXgM{jSqXhF{C%`w?^A3#SQ>sy}rQBbnzvUidi>4?73waaq#RS%rjt4{?U66RM}q zu4;fllFdZKJ?E)jBjxV|6Ya6VIH}zT2BvJScI{Xl_rdAJS+9!aDa-8O2FJ3Fw3`5a z1y|pLfMmBBc&(HJD$o!vg%bREqTUDvpaB2*2^oZO0>wqR1Y=qF%~d?=R4GYf5mWEz zNO<}~g6YgG%Q-+frGis(a^FY%=?gxof9_c8*wMH2$^gSK-)NI7R23r2*iLPN9{P|7 z%m37Efd5K0kvvnRdW~@jSczvrv^i7~3cTtEJr7m{08L5o8~%5@cKm}l-=YCj6=X9=l~lN2I%_1rvLyO1eX9jsF*$w z-RB#~=E2YD6+p2(pJ~H$8bb8(`~R~9Gy{wR^mHFxcS8ZBwh=)HRS2+YrS8m7_MQ6_ zDQSeXM*C$744_d4Q2hZIInoTqV5oSxaLJhT7_*1VB=W7_LLk_5NTM$Q^9m*do0x+z z#TEnT6uDCO`dQpDF_4A;P?=Fv5THs2(wB!4DQyAR&jtShpXft*9e9uYU}o4Lz?2?j z>bME;^h4Em#()7R3^hSS$ol}}9fnFlH_A8^3gtzp8=d_|4iE+ph!sHb1VaRMlYiBv zsx?S##E;N5s3M8LJSFq~ZD4xFd9{V$|2oBt7>B7`mWNfl5N#G;l?RAavREWLpMin% z{hR+IA!C5#flt2*iO0XlCJ64TfzPApQozp($3;JaLkig zPd|VGrbE|yV@fpl1qTIR)-sf%D2&Ps0ROe`Y?m{m?`>81PhyE~HZ)+sP_zK5RkF&# z7lN$;0Q@6wAOXf6y(^x!U=%!#U_1e#Wj)eSfGJ;KZdw$E>_&M&vli`S?+D8;R zAQ%9taEwGh|1{!FCqq>j4B#W*FY;BIrt3-~ax5|W!5C5ib|V;Q8pj?|r2`;>Na31b z6o76VBN%vY77U=G{HJa~I0-<$n#*7kUBCc3D2xCS9xN$92c|>C#Wq6F z_OO5r1pqV-qXW5)Xy+ouXn^{kFN4uRB^WwxNG%YV0;ni}hFlzA9t@&UXbs)em43X7 zX}M*eDuM`ML%ML~wiJZzHX*Wx}SACLHUl4r~mN7$rNK-Q{>v)1yVE{U~ zz8?xG0N-#4$&M0oCZC~_v)4W65lN7KK}H6kil!uD*S`gTBzXYO)VZPsyvHeDXwJ*h zPwlkjGcdz}2`-Wr4aR{61K2~b8NeDW91;u#Q0O>=f#Ph&a~5_W6O{!R00DH!@dW_| zm6WKvI{i|0fL^P4tZVZ-Ng(t^n#(5ugzP2c_yZtpx@HJfV}u>>40`|~ZixZ(L+DV5 zz~RWBVL+-f9nY|*CscF|ARh#Pi(o)=3;-!1hX&Bl6a^s9`$0;l@vspZNjeZ%9XZvB z%m8d;vvkO*2pZzG2B19s0BDph9DpI)Lw;P)fk2B7e(1({xQo@7@D7uAX*hCdWEKs9 z5P175o+}M9qfBp}3@#%V#SAK%i4-2biwYw)8qcsb_i}71PL*vbVZNcTVf$z6H8&|_ z6?*0w=sEA9ObTfsy`@zw6t?9PzYgdQD=Y^MX?z-TwFe| z;ZM7+YOOZcBWn9LOi`A0?8Xd|c3umc5a16h47*i)*R#0cead31DBqM=IK^t)PyAH} zj*ZK(XL5|Z4~9?~k#(%V-8eBFHfbkH>W z;p8U&y_`z#C*4Z_+{b8Hq@!vs<$R|S?HtHV)=NyKRmU!II?kZ^wx}7w-gPf2DM{=y z-;UMsIJKHswoX9BhF&mt(7U_+!u_Z@>MwgMYH%CeSb1u^Pw2O5aTl7YPA$-)?pKk| zL~}Rr4*)E-hlZ5!tZz(7(Sz5|jap4Z9I(u`!<->-p@Cy^Q;~&d>I*$mn;4DT@n-hw z1m#~mxyC+_ln#IXc+934CVr|EaNZ-0#jX~oxrJo`JpnagiAy^w!&c16&#Ax82;$xb zT!=~Eq}LNC8HACbl`H8{wsV9go3T53n0=iIR8*GvOlZwHRPnb5w{)8e#4<$?Ma(i~ zR7^cy+n{a|{W_w$LXyQ*E->wGL8UXP+Q}15qW*YyscDN4-rkLELdr$f=p-h&(BYDA zDUEX{q}fZ~Vd6VwQRL12iOYya*QDjfAuKkHO*i(yv}kB-?LvGJxqz7P|I4HxmkqrVcZArQ_h&a7B0ix_hxMUHi>g>Z5Da_~>;Fmp3(N7Wfu_k4_WENYXN-vaucZDk zOE+2H9M1FE>=Z{6amy&@%{7%mc`-gbO-<1(mkmxwJ=mwXseCYKcycYoh<7PUsA|uB z!820Y1LiL0fSPgWOVOUv{Q$+5a+~gdzP0k)ji!*m zz-m^-`s(NujK_NFEht1VoqkAg?&wYUwNEV%1$b<&y8pa>DqEs5512cBOWE~|uX$AT zmX-*@@PnftpOj$u=)DQ3zBi)Z6erRTWBWU}H?Cw#p?b!7Gf>cEd93by6`BG`AUF*y;Ak;X6PK(ymOV8quf zZ*3p?<|W>WWcfyq;)=_TwBJqpLgMp;38g#wSaDovvP*=f&01A=qbWmU(MrWl0MsjN z+l-uioW|8p$+10z+FZ%-;@jAuXgxMpMCbO>navQ_;j>(Yz7MNnUjtv%)&y<`v>Hpj zHh28Ju9Btd{*HD2)rYm;+a`Y|blYiu(z*>dbhUAN73K*}4}N{=eR{nv_5-!m`|);~ zdSJ7IVc}rrgGBq*D&?lw&EwnrRTGS@ovW0$1McBLTOZI~_Y>6Q8q4=cMl8PE&h&nA z5^_4yai^c=-`~s$FovEXo@j#>>ykfAi(?r*eeD(b2gv^ekn@!FzvLg17xdpW{a^0y zzl|Q5{DaaVxA~A{9%T0KbO4$9`~SQj^tf-fkMBN++T(9&KceF1(Z1YOIPF*~z+(V= ze7{>^vt}1bJ-F!}t_WoMIH@EF7y9vGbkC^aq}>dmo|d;9-|?=UhrMQ=#68CCPWS!g zPN%&oeAVtVO#VQ3xBP<2$*5iES77M`&EZ z;jhH(RZqj-{KS>py$segLtlr0L_s1e3($m%$fOr^AUvKmHv9m>i@Lg?(0dB>epBrcmL&H62w@-DzF z5qOdI#@Fq8E#G@C7h`TRk9sF6uD(eZ$nNWQ+#FYLr(vE|1opvH3GT&rSB=g`56Ba| z4~ z^Dg*GW&9ECYqfq7yrca7)2lU?9jz!bz1Gd+*W980gxmzBx;$I~;|yBe`rHfRBK-4b zT&CEsb$chiS`FMLG&YeGtbE_r`a5w!UjQSwa1f{>$fY;9>f)|v8wv(m99k#UBxRl?!*k= zedP^js_{B}Cx^nGiBjZ@cBj#=wch?<^t0odjnhMwP^sI7cjfkY6FISO!hX~Y7>_6o z1&lu)h*X{*{}c*xsjxq5e`A}|+LA`ZuM1t4iJ=T+DtY3-W6Rrm)!1m>izW~s`u!h} zJ15;f!_wdSlkki{9yKjim@U(JQQ?gJf}Liw*U6%3vN&PV{-j*+rzLh^7?)Ak-b9Q$ z^m;By40qBu!i32uW>@3h{#tx@L)*FZ_Gs$bRNCDzW08hFQZ4{R6P8 zzQEJmw}f0IM@Sd=(P*^0%tTqrMtSKgA;D-!xhhpgU`NeEx{i*t#o=ipU9g_Z4xUp61oCM zn4T$*00m^_$t9ix`$}B^#xdb_NPec$uZU8>uP`B$&W<{XC+!5MprB%n@-DWLr=HGd z&tCZ5pPv!+CO9*adQ^m9VpUt|@0vFml}v^9Gz!v}k|OU7Ld0va3>xOwUj>?>N`rnd z>JcPUC!d(X(bVw%T2aFUNl||}Zm?YRz%CG_x2jt)Wa%q9QR;T-`ityOZ#FtRRI`u? z8mXS~w4eU?3fFT@0XYXdx_vWkZrh`;I%E(E$JPD4nSV$dD+!ercp)-U$sDQ#L%!eT zoQU(ap+dH=Qp2eJgY zs=;%6|3s^J>_I>wnQH{xe`;%7;^-r4^gP~piV_cZEaL)`0IdNnb&DeWn-JTcXFuFB zYN3ExrXfBPCkMajnt|dBYGI3>P30T;GsxBQP4^JnO{IAE@So3B6XXG|EXdk9YTUb{ zK8-qJwt|(awBHZohXHLECzs;)y}K);>86R3PG~4gAR%+F}i>iJN{B%m!Hyk;1R>hy<4fMonWQi_Bh0Du+lX1JMZ9A*5Nw8s z;LNmprCg)8z{Zu$M8crkV~DNO_`_mvhGE8XN~yAN;_HO~6?@IO15>elx1RCHmxJ5Z zXzuf_?`|OffR7~aW}UQ6i*I79BU&kzU)4_!uoGmGeO+IVoF0GXBAJE_ToV2RQhFv4 zeb8vOXft!_6XbT85RJY(A;fKEzwOqb6F;)^`YyKNNuGl8HKCUHK(z~un*1dbfM>55 z^)BwQu<$g{Qo!oXH?O+Pau-kpNg0?N8me0A_xqXyikeandTFPF&bS5=+N8gREut_G=>R(WpvRrL=IP4<4hqVy+sxMa z^*9>)Z}79j`7`3&yR00X*A{yivT}vLqO6i^jNelU+l_N&)B~K4x+UDs*9QZ zD7#Zc#oso6Db`4H8tVM1Ufg-r(O_8}GCGh>vqzprA>plsrGCWyaQCMx^bY)Xc!aIB z$?^wcUO$p(MWKE*DVTaZyJ$$(^#aRyd>Ehz2;Y?We3OJekDmcm)yC=owVW9FJJA$v zrbLit7$yi!Yjx=7YE_NOqV0-Ri;agEcPva}3z3xF#A!TA){bAZrsW+>c4$;(>F+0w z_cWF&^!in5eSgiAK}e$7Odo$Xc#E+99yf24r}~caJiu4dDWcNbeG)BgB7FW}@M&n$ zV&TL@dSLs{TSpl4Ge=FUKVCnI*x!Rqyl%wmucq+5DBA*8V0%}EX$H|RnGzrS-By+c z@9BK{NXM?$q66eS;?&OFx0v+9wb+SlHTqjKak8Lu?P$}v2-kKOE4cyt^N&y1-GG5e z(>YY1Q1PW^go$nX3ts~lpZU2}=)Jam!P7b72H zv;(FQL%$6IRZ%15xGzs+X(24pI5JbJXaoKYhmBe5E?2JHn}-{8j6a zOco>8)tKv*J}8?*UO0L*yH??Q!Q@o%%jDhkZ$UhyXg^}_YWuKzC(ODp;-BQ(!%Ng@ zBXzm9Elm;Ph#C6J3?-Gy!f9G$bv<{C+U)s{w>QCdu8o>oKe&bSsmTt-jFjY()6Grz zQQ{}sTf$kqxidF|BE>VCHvfr;5}jY6tSZ^mk! z+oMuehT&12>nO6)Y}cg|e|ha4!f*Npzn z8#e36KYuyw_8Lr1wWIyH5rP6zJFj%A@0lB9V}0Lz+Mxj#Rnjctjpak#(x_^(AR~(5yQ!S~mt9XEFpD|j|s+-4s%!UIp?v10f%HCF}PWIK)E9{$3EVEI0gyO&=v;Rck$E1|9>fI=#wF)3s?i+MODi?X};3 zwNZVW)+-G|d8hJsub38^&>;>dE2_a}CDS`%!#~ZkWb4)Co#LCMlToctH!|p|H@vq& z^kFOJCi5ToZnlxmTC9A{3baP&Ru+!+i98TS{NC2;x}x0WKX4vE+0d0+w7L!9^0RKj zJ}li4d9>s~VD1|WuVBcQ{%mH5LK8aH;n4}ErtcDaDXoz{y=G9yXbPot3r}<_gI$0> zR7IBB?YGed3=%Fu1HA@cB=fBGagOPW|?4y__56wCw42o+p(6s)H{K$~f zqa9n_qUGB$e8aRyhRdGW~DU``;MoYv~SUD^g2VvwqiO}K zow;Dc+bA^eAXZZf=p8#<$uoM8b!f%1*i8O%n`m0eIL6j>s(t}&^7v&q=~TLj$K&J6 zgj<8bs*i^!w;gJ-Hu~+<&+-t^p=axBc_oqYwC0Y2_#F;Rh~>GO*#j{^07q4bH_#KJZ`fmjL5?sLsR|% zomJy?2!I8ZtQhRR+m|Z9{;Lm~$AX$}@KD|PyST@wA{7nc3~px9uY!>*avD`D)Ex&* z?CU4(2~NX0$}CF#@=DBlxVG#qKKCM5@jX_*0Aw#+fT@6_4z3-*Be~Qo;eP1W z9zpgW$jd^ZK{}YH+C#HxASFv(IU2X_D!N_pWQ9uoS$WBr=9+{&wNz9bYda*I$=1l? z{65Imc%(sV4dIP_{-l_5X<;f2!7#u@xMEe%7y9(e;WAjT!-39Q4;nq9V9uX%KO&Ax zb#Nr9CYnLoff&q|#l8gT`q=boq2-hJ`5G7O<@`7MCTqGDqXFzIQ_~&lkPyOBWhsUW z_Ekyl=gX^dd<`ob#;)y~npB@%=O24B1m{iew5me<6>5)kCtb5Xyn72RNOU4wFHt{l=%H)BRaleo3E4>bv-C>BOFcB~}9j*J!J@d(x?>oq7`B*m^gzdH1q0x{P zV;9tnQ!_T;q&-8aL!>&c@646tXYnr75GfcBHg&>zlb_}-@a9@?D>7GzsMyQtvfHTa z^mnjO;NwI(NUP80V({z&Pay&sq0~Pv^JKJk_hPUtxfO8gj_hsl?IT&Mttcb)EAZfI z($~z;t-5wT6jDr%AbiQy4RI(Zl-7|NBa9Y>$7b?{|1!PFxAGY^*aJw$2lM9Cm5+GC zbj$>1hAQl^VfH+>7MhJF9%1q5d+;!h!06$IPHW*J@loDISZ$1BZLM_-()Y~_7{4Y& zP#o+8jN6|y$<*p0%PX72nRMkA7GxHl{Rb74Dj(P;RBj%ebAu*utJAppq9we~tlJVm z<9ot!O6<+rj}!NbOJ+n^${bUx6T^d)JhosC9&YKgTn%Uyhur9!s(y_ zZ!yt+z$>2VrvVn~qPc$5^zyvd5q?`yxQUnG691tEQ?*5O!@r*Eg)YJq=LKI@^@fwS zb5&*tH==8WH!smjDfgJkV_vW~$I36>wR<=%AbRkt5cfj+G5T|bDMW=v>0Mfahbzu_ zox8!lNtyo#tuoY&fWXt-g#w9YuEE(&cB)jv0xa#Ad2>O_K-smmP;BA}JhX8y{g3;` zP_cMts@@*~f1_I(0+T&AvAw|>3x7;`Y+#1kw&B3|Ek%7V-mkEmJ)6_|<;X#X=VJCI zinipcB9X7T2Vb&|)6fY(0rfXAx`YUW6&W~|c7f<{MaUkGkWmtp^MGOAo`%L}fn0{F z$gOW+0HtBB*1dLW)GZ%>vLerqB=aY>V-8|gD4Jj9SAU28p?-TW@-U2w>zQd|#q8;< z$;u3F#O$k%%wwZEmyt4uno*qHb}q7gV`W7Aj7$ZqJ=e3LYpW{Rhc^n)5zK9GRHQGp zRY4M8{#Q&EA$Y7eWP;T;OGZf2qQff9IpdR!MloTDu9#n!rLTWrJZs>~DYoE>fK@(j z9!Lne6OmXARbHdDncl1{Q~m=ebEJ_qxfaVpHy7+jE}EzKWO|1n`;|5&zUQjyUCfbH z$5;c~Fqt=hHy64ehC2*1!s7xm0;oOR*;lQ64(h;$A#Mc=jdqAWO>xWWp@psx7mNF} z4LsS}#BE+SErl43A>IKttqT1ZW9Lh3>V-4xpYN85WobEIR3@^qY8z^2c$h}JrMd0K zts9zZL(P65$L}UK#d;gq$*#Da5vL~w@y5rz)diL0vvqF_&6PgsH(P^!LQgi z5q`g-$sqkTP*lI2sE3@tH!mJi|4OJH0LQly3op%tA|(WrS_Yf`a`hG&UIA2IoLA`6 z(u;-&!#|Zr-Q#OaI!uOyV%)skMZI*UusB?zXYI zCnVI=<~kr2c)r+ss42(~**Z4Wt@$X-sm1DcpOc!a`<7s57; z9m-zt)V?+ek~5MkU)=j`FY@OD|JCoWypXMvK&HEhi@8S+E1&(uKDTSOfXNTKeY030 zbF)`eeo;jbuZU5XMJvBFHk(DG@8y*VXKZaKJDnmYDi$=poiWBppw>OR{ox8(6Xq)R z_jBUiqC$_-xbRzJ-k-)xn>DaQxyj0y4Tz^ozA+b`HFB?jA1>f&tan`f&g*;?zgwy7 zin-hP7}#Ux|8z)X$fYE)5I&llF%z;Mu1be2WAORIi82yS-5{)4XpM%A3A9+}1%0d``m+ zScN;f75;(wVv7f))5@0@-?y&?5tGwaUOE2&FD4C`LG_BfMv$vIQA{#LU5Cn1pNdvZ z<(vX&t|O-8Y<;(MBIA1}I!q;le}hx{Sy(j{@fO$K@PgARyzqB3h`me60a-Z`8+L(3 zIy_EZsPTDAar6sjJCvdLnua`}BnSN*EsTpZ+ixVOQrBIsK0+YOWP1u>V+L%e``Y zWKKXOM0b4TT@12u9wCk1`Z;0lu}wtdzJB;Rja-!aM66Dvox_)gh>sR?A+$qi?#7gY zO)F0G#G%=o8#ag)11%R)!Whgp9ElFvXB%Q}l|B0z8yIw)Mu6Ms-WbKR!Jq@d3d2Zc zf8EEpL>Rw=HsW4h)`bXNKJ%>!eQ7zVWXK;|af=%oMUMVgDACH%WUXGe#^@YO?X}h8 z&m`BL#UJVv^%3MpILBH>aQg-zoK{d~OSaznKTjBJ{;|d9FCEDyWJ`FP__wkKQYILQ zmaK)Ig0tMBJOOI?8hxO(F&IH|ux*=o5D}TM%`nQ&5pbi(6LTe&$Twk z3S|>qBPF;E1hE_ivGsNiT2P*roL{vLa1<@>MNYRQ1ca_wk3l$3nKK4_!aOS#*;^(n zjK5MVdGQBi9o_8Lxz%a1Pu4lsPGsZ?^0(!$g{5Gwp5DRw_!@9#6s(9$vxCwh+i~0J zHSeQN^P{C|Xt%kGp=elV96^29qz|_WW~XZyD3vp4iwiJ_GEh`e3k0kfhL-h@uRisE zg+wIp45>>uGB8N^4{k%o{{;A{NFNiv6SE+B?*4bue$wGQJERNxjaW_vJ zNSn)_<`~(*esfkacDeJ`(<4D5`Z1jnp9M05K3SzT$9`IfA}JM_EKJM$S(v!oX59YK zvpgq1OTCx*ddZakx3&M@zCJ0_-uypa4#fwANT@DS?ZZFdD^8g;vLu`V;>0QS8ba!0 zjec$RR1|Jj$6CkrrkU_4vU1P1ojvc^C0{X-y#5G2q!XR)*EjK>xuI;SV76 z^pjz27(hm>Re2LV6SG%M)huv)#z#Nok;gb>Pb>_BZ{nem4iqzaB-6+gE(npw3%Ygh6iaJ}9i$&Ly$ zuZCv!Eyv#oyv9WT)^-KH!tl|F_BuUB*=CX7>XNKGWpRgL`z zWJ3aVFES|4rI<>eM5!8I4tzn~jyki%goUhu2WYq?TdeWdU-GWhkU%z+?&qw({08-z@*`LLt*imM7Wq4&z<6X zv`R5r-gQ?ZmhUzTZAe(iUfbh+)>iE2K^DF$Fr;4t2N0xqoDMCVBKe9T1 znQ&8bj-cA-EGT*o_o`xfXv>dG+T2I$LFy6;0f@kQ35{pgawp&ka1Y$!ZqB579hQ+$xrqhzHOMX1S}bCJ&pDTW6~S3x2$ zFFvqdHg#8XQsEl}+&ji5&lp5-8 z8Otx9Y;FP@vNG=EiO4qGg9byt&|%5j-V)={lSfEJXTOcJC04jJdJ*z4@(zc+r{l3u z=*`j@XuP}j5ymPe_laL`H~%6e=IF^zyVa+rK=aTPBW19_P{fOFH- z(Ds31Zq^p_1ALULMt1aO-ed7%7N{M5(vFYO6S)hjO2KlSIL05W-89yq=3&T72kh`? z^64+4V@SlB($KU!`Q+X!NJU>*reO7^Y2kevaWRH*YDe^!{-nfoGjtY)8_Np-0R^jep5F?VvEN~_A|ZX{_Z6>qR4 zw{2m`Mr0bTzFj`>$R>olK+G-PV|0m9Z@@10kB1S^l0>V<(O34!(Kqq;%u46~fJO(G zbhh@#e#&%a(p|n$1q6?+siM(u6zc{g&7 zzb#JDMh6}L1KKwwG9HH|=ckawJe{Sd3j6%ou}&G|cJ0%umPIQokp@gX-FC z*UFmCy&fB|m*ZLtb@|qYd6_A?j12{38X89}CqFo%{o0vzoqFpA)5m>>pvP+rFBZr-qeN zTHI#!Vfz&FXg_qNH!cWbX_%xigbR#MTo0o{yw!Er$Rr}5I>`J*N?T7UOBL&@FbJ9`IQhr!GO)@avyiwAvvRU?;N~!0+q$!y zTghb2s5T?BBf~GMH<8P-?6qYZHJ52cV3(0y$Y<41E>Ch3Gjx8FyP_e2yTw;&(aoEs z6Nu?(L6U7lwj!H~9TR6{x-0TE;RPwDUM6Yk5wuiv#6F?pA#~jQ9)DbQgA1}wyCZ50 zA{W9cKr(;1>>Z`2#s@zh>ID12nNx53fvT+_CLd}`@!q8}|`Vg`4&y|F8o zku;)Pk?q)WvW=RQ;G{5DfljADSF$$a80WIu15W%?SFo0;Cxg3wlJe;LI$x#AXaj-! zdFT^@wwYkeRraRc<)#vxH`9u;t&YTHJUu0XLhXt$F1r%eFU}%H-;=Zna>mayP(?+&NuCmfH(*AioLXWT%BNsrRk=;!_fPm9I5S2H zhLW3c)!1t%87CxaC(_lILzffO7$Cc$J4_?#EOg(+&0hAOH!H=l^;(T8HJiKY`eH?q z#yNI}43G%EVzmEo#uZ<0SQ1Ev|C&rzt!jX^1)@q~RENJ zWnA@>xHH0(`rBvD?&zgn`g^d<8S|Olo_nAA{DQD!!NH0m#r4)Q@yot*=Czx%+)t*N zU_tIqLV`N7ZcIJFChp1VD`&(mmV}I8K!YARCEIFb_s|+uu?L>`I(V`Of*&|Nz;BL| z!woFxMl;4(3q}aN?F-;Cw`IM_^GTJ0)9|1#y!8$bwvsHqKouV*C}=sWYwz^^O`CmW zx}yOjfpbOH_fL$6)`WA8n8Fj{6~H8nL=bz%JJEMwxrnO7eBMpNgftU|#5g0;?Cs9S zF9fS_uK z+T+H!Vr&2MC>flyvK~NL(^+lrLP057SU}64^q*{#N1=f{S-NEwls^0N)0HyiB@xPv zz){$*pTkOqf}f>Dq-8+PQ`3A$QROj6;__C+`_O)-(B{%_N-7UckS#zteHA+<(+n|~^-=$pJyS&M zBfjR-F-WF4RiFfI##Y}g7;P02{SV+<9fW>Il$u_X^V>xOG1-vzxkK2L7LD4g*dqpx&D+$-H zT*BYe>#Qwgs~B-rA}6NqEoVxi4L7lQ-;2UDFkK8ELYFT3mNUpekLBrv(?W2p@D}JPlMFLOORJ zip&0NMSr7gt8T^g9&3%U^Wevcpb&-|yP_uPgMR^o3G0XIvR{i&@g#Z8aWu z9f9TFybiB!dVL*7wa(a!=QfQLzw)EB=YzWzI?ky3|0;j5E~{E`NG!uV;Qd<0$Q|wX zNVuxHL3wpYbr+LZmHkNdSD5jzW<1}x#jOd6oFYBkud!*y$Zy7`#;Ax2PgbiJo=W3s zizmohgXHfGKegvd6)tEdHe6YmI4TbodHnFxe(JJm1x#05%@ygY8gnlqPcVX8#<&{R zhD=azIIAjb)>)Bkx+@n{3SHSfm@)Uy$_6dn-F(=Mz9K|ax zqu%QP>WMw)OB~PYYhBH}IXBN@#BRZEfmiaXj_E;8Okxs0Vw+m!wMcGYEHV=R_v8Nn DdE_Y! literal 0 HcmV?d00001 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..c8550ed --- /dev/null +++ b/frontend/src/App.tsx @@ -0,0 +1,77 @@ +import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom'; +import { AuthProvider } from '@/contexts/AuthContext'; +import ProtectedRoute from '@/components/ProtectedRoute'; +import DashboardLayout from '@/components/DashboardLayout'; + +// Pages +import Landing from '@/pages/Landing'; +import Login from '@/pages/Login'; +import Registro from '@/pages/Registro'; +import Dashboard from '@/pages/Dashboard'; +import Empresas from '@/pages/Empresas'; +import EmpresaForm from '@/pages/EmpresaForm'; +import Propriedades from '@/pages/Propriedades'; +import PropriedadeForm from '@/pages/PropriedadeForm'; +import Avaliacoes from '@/pages/Avaliacoes'; +import AvaliacaoDetail from '@/pages/AvaliacaoDetail'; +import Documentos from '@/pages/Documentos'; +import Usuarios from '@/pages/Usuarios'; + +function App() { + return ( + + + + {/* Public Routes */} + } /> + } /> + } /> + + {/* Protected Routes */} + + + + } + > + } /> + + {/* Empresas */} + } /> + } /> + } /> + + {/* Propriedades */} + } /> + } /> + } /> + + {/* Avaliações */} + } /> + } /> + } /> + + {/* Documentos */} + } /> + + {/* Usuários (Admin only) */} + + + + } + /> + + + {/* Catch all */} + } /> + + + + ); +} + +export default App; diff --git a/frontend/src/api/client.ts b/frontend/src/api/client.ts new file mode 100644 index 0000000..71f14de --- /dev/null +++ b/frontend/src/api/client.ts @@ -0,0 +1,37 @@ +import axios from 'axios'; + +const apiClient = axios.create({ + baseURL: '/api', + headers: { + 'Content-Type': 'application/json', + }, +}); + +// Request interceptor - adiciona JWT token +apiClient.interceptors.request.use( + (config) => { + const token = localStorage.getItem('duorigin_token'); + if (token) { + config.headers.Authorization = `Bearer ${token}`; + } + return config; + }, + (error) => { + return Promise.reject(error); + } +); + +// Response interceptor - trata erros de auth +apiClient.interceptors.response.use( + (response) => response, + (error) => { + if (error.response?.status === 401) { + localStorage.removeItem('duorigin_token'); + localStorage.removeItem('duorigin_user'); + window.location.href = '/login'; + } + return Promise.reject(error); + } +); + +export default apiClient; 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/DDSModal.tsx b/frontend/src/components/DDSModal.tsx new file mode 100644 index 0000000..afada1b --- /dev/null +++ b/frontend/src/components/DDSModal.tsx @@ -0,0 +1,162 @@ +import { useState } from 'react'; +import { FileText, Loader2, CheckCircle, AlertCircle, Download } from 'lucide-react'; +import Modal from './Modal'; +import { api } from '@/hooks/useApi'; +import { Avaliacao } from '@/types'; + +interface DDSModalProps { + isOpen: boolean; + onClose: () => void; + avaliacao: Avaliacao | null; + onSuccess: () => void; +} + +export default function DDSModal({ isOpen, onClose, avaliacao, onSuccess }: DDSModalProps) { + const [isGenerating, setIsGenerating] = useState(false); + const [result, setResult] = useState<{ success: boolean; message: string; codigo?: string } | null>(null); + + const handleGenerar = async () => { + if (!avaliacao) return; + + setIsGenerating(true); + setResult(null); + + try { + const response = await api.gerarDDS(avaliacao.id); + setResult({ + success: true, + message: 'DDS gerada com sucesso!', + codigo: response.data.dds_codigo, + }); + onSuccess(); + } catch (error: unknown) { + const err = error as { response?: { data?: { detail?: string } } }; + setResult({ + success: false, + message: err.response?.data?.detail || 'Erro ao gerar DDS', + }); + } finally { + setIsGenerating(false); + } + }; + + const handleClose = () => { + setResult(null); + onClose(); + }; + + if (!avaliacao) return null; + + return ( + +
+ {/* Info da avaliação */} +
+

Dados da Avaliação

+
+
+ Propriedade: + {avaliacao.propriedade?.nome || '-'} +
+
+ Data: + + {new Date(avaliacao.data_avaliacao).toLocaleDateString('pt-BR')} + +
+
+ Status: + + {avaliacao.status.charAt(0).toUpperCase() + avaliacao.status.slice(1)} + +
+
+ Score de Risco: + {avaliacao.score_risco}% +
+
+
+ + {/* Resultado */} + {result && ( +
+ {result.success ? ( + + ) : ( + + )} +
+

+ {result.message} +

+ {result.codigo && ( +

+ Código: {result.codigo} +

+ )} +
+
+ )} + + {/* Aviso */} + {!result && ( +
+

⚠️ Atenção

+

+ A DDS será gerada no formato compatível com TRACES NT. + Certifique-se de que todos os dados da avaliação estão corretos antes de prosseguir. +

+
+ )} + + {/* Ações */} +
+ + + {!result?.success && ( + + )} + + {result?.success && ( + + )} +
+ + {avaliacao.status !== 'aprovada' && !result && ( +

+ ⚠️ A avaliação precisa estar aprovada para gerar a DDS. +

+ )} +
+
+ ); +} diff --git a/frontend/src/components/DashboardLayout.tsx b/frontend/src/components/DashboardLayout.tsx new file mode 100644 index 0000000..bc57ace --- /dev/null +++ b/frontend/src/components/DashboardLayout.tsx @@ -0,0 +1,13 @@ +import { Outlet } from 'react-router-dom'; +import Sidebar from './Sidebar'; + +export default function DashboardLayout() { + return ( +
+ +
+ +
+
+ ); +} diff --git a/frontend/src/components/DataTable.tsx b/frontend/src/components/DataTable.tsx new file mode 100644 index 0000000..4467764 --- /dev/null +++ b/frontend/src/components/DataTable.tsx @@ -0,0 +1,109 @@ +import { ReactNode } from 'react'; +import { ChevronLeft, ChevronRight, Loader2 } from 'lucide-react'; + +interface Column { + key: string; + label: string; + render?: (item: T) => ReactNode; +} + +interface DataTableProps { + columns: Column[]; + data: T[]; + isLoading?: boolean; + emptyMessage?: string; + keyExtractor: (item: T) => string | number; + onRowClick?: (item: T) => void; + pagination?: { + page: number; + totalPages: number; + onPageChange: (page: number) => void; + }; +} + +export default function DataTable({ + columns, + data, + isLoading, + emptyMessage = 'Nenhum registro encontrado', + keyExtractor, + onRowClick, + pagination, +}: DataTableProps) { + if (isLoading) { + return ( +
+ +
+ ); + } + + if (data.length === 0) { + return ( +
+

{emptyMessage}

+
+ ); + } + + return ( +
+
+ + + + {columns.map(col => ( + + ))} + + + + {data.map(item => ( + onRowClick?.(item)} + className={`border-t border-gray-100 hover:bg-gray-50 transition ${ + onRowClick ? 'cursor-pointer' : '' + }`} + > + {columns.map(col => ( + + ))} + + ))} + +
+ {col.label} +
+ {col.render + ? col.render(item) + : (item as Record)[col.key] as ReactNode} +
+
+ + {pagination && pagination.totalPages > 1 && ( +
+ + Página {pagination.page} de {pagination.totalPages} + +
+ + +
+
+ )} +
+ ); +} diff --git a/frontend/src/components/Footer.tsx b/frontend/src/components/Footer.tsx new file mode 100644 index 0000000..2c0f4c7 --- /dev/null +++ b/frontend/src/components/Footer.tsx @@ -0,0 +1,7 @@ +export default function Footer() { + return ( +
+ © {new Date().getFullYear()} DUORIGIN — Compliance EUDR Inteligente. Todos os direitos reservados. +
+ ); +} diff --git a/frontend/src/components/Modal.tsx b/frontend/src/components/Modal.tsx new file mode 100644 index 0000000..07cee58 --- /dev/null +++ b/frontend/src/components/Modal.tsx @@ -0,0 +1,66 @@ +import { ReactNode, useEffect } from 'react'; +import { X } from 'lucide-react'; + +interface ModalProps { + isOpen: boolean; + onClose: () => void; + title: string; + children: ReactNode; + maxWidth?: 'sm' | 'md' | 'lg' | 'xl'; +} + +const maxWidthClasses = { + sm: 'max-w-sm', + md: 'max-w-md', + lg: 'max-w-lg', + xl: 'max-w-xl', +}; + +export default function Modal({ isOpen, onClose, title, children, maxWidth = 'md' }: ModalProps) { + useEffect(() => { + const handleEscape = (e: KeyboardEvent) => { + if (e.key === 'Escape') onClose(); + }; + + if (isOpen) { + document.addEventListener('keydown', handleEscape); + document.body.style.overflow = 'hidden'; + } + + return () => { + document.removeEventListener('keydown', handleEscape); + document.body.style.overflow = 'unset'; + }; + }, [isOpen, onClose]); + + if (!isOpen) return null; + + return ( +
+ {/* Backdrop */} +
+ + {/* Modal */} +
+ {/* Header */} +
+

{title}

+ +
+ + {/* Content */} +
+ {children} +
+
+
+ ); +} diff --git a/frontend/src/components/Navbar.tsx b/frontend/src/components/Navbar.tsx new file mode 100644 index 0000000..5d6561a --- /dev/null +++ b/frontend/src/components/Navbar.tsx @@ -0,0 +1,19 @@ +import { Link } from 'react-router-dom'; + +export default function Navbar() { + return ( + + ); +} diff --git a/frontend/src/components/ProtectedRoute.tsx b/frontend/src/components/ProtectedRoute.tsx new file mode 100644 index 0000000..9dc98f9 --- /dev/null +++ b/frontend/src/components/ProtectedRoute.tsx @@ -0,0 +1,31 @@ +import { Navigate, useLocation } from 'react-router-dom'; +import { useAuth } from '@/hooks/useAuth'; +import { Loader2 } from 'lucide-react'; + +interface ProtectedRouteProps { + children: React.ReactNode; + adminOnly?: boolean; +} + +export default function ProtectedRoute({ children, adminOnly = false }: ProtectedRouteProps) { + const { isAuthenticated, isLoading, user } = useAuth(); + const location = useLocation(); + + if (isLoading) { + return ( +
+ +
+ ); + } + + if (!isAuthenticated) { + return ; + } + + if (adminOnly && user?.role !== 'admin') { + return ; + } + + return <>{children}; +} diff --git a/frontend/src/components/Sidebar.tsx b/frontend/src/components/Sidebar.tsx new file mode 100644 index 0000000..f19cd0d --- /dev/null +++ b/frontend/src/components/Sidebar.tsx @@ -0,0 +1,100 @@ +import { Link, useLocation } from 'react-router-dom'; +import { useAuth } from '@/hooks/useAuth'; +import { + LayoutDashboard, + Building2, + MapPin, + ClipboardCheck, + FileText, + Users, + LogOut, +} from 'lucide-react'; + +const menuItems = [ + { path: '/dashboard', icon: LayoutDashboard, label: 'Dashboard' }, + { path: '/empresas', icon: Building2, label: 'Empresas' }, + { path: '/propriedades', icon: MapPin, label: 'Propriedades' }, + { path: '/avaliacoes', icon: ClipboardCheck, label: 'Avaliações' }, + { path: '/documentos', icon: FileText, label: 'Documentos' }, +]; + +const adminItems = [ + { path: '/usuarios', icon: Users, label: 'Usuários' }, +]; + +export default function Sidebar() { + const location = useLocation(); + const { user, logout } = useAuth(); + + const isActive = (path: string) => location.pathname === path; + + return ( + + ); +} diff --git a/frontend/src/components/StatsCard.tsx b/frontend/src/components/StatsCard.tsx new file mode 100644 index 0000000..663f811 --- /dev/null +++ b/frontend/src/components/StatsCard.tsx @@ -0,0 +1,30 @@ +import { ReactNode } from 'react'; +import { TrendingUp, TrendingDown } from 'lucide-react'; + +interface StatsCardProps { + icon: ReactNode; + label: string; + value: number | string; + trend?: string; + trendUp?: boolean; +} + +export default function StatsCard({ icon, label, value, trend, trendUp }: StatsCardProps) { + return ( +
+
+
{icon}
+ {trend && ( +
+ {trendUp ? : } + {trend} +
+ )} +
+
+
{value}
+
{label}
+
+
+ ); +} diff --git a/frontend/src/contexts/AuthContext.tsx b/frontend/src/contexts/AuthContext.tsx new file mode 100644 index 0000000..302bf8f --- /dev/null +++ b/frontend/src/contexts/AuthContext.tsx @@ -0,0 +1,83 @@ +import { createContext, useState, useEffect, ReactNode } from 'react'; +import apiClient from '@/api/client'; +import { User, AuthResponse, LoginCredentials, RegistroData } from '@/types'; + +interface AuthContextType { + user: User | null; + isAuthenticated: boolean; + isLoading: boolean; + login: (credentials: LoginCredentials) => Promise; + registro: (data: RegistroData) => Promise; + logout: () => void; +} + +export const AuthContext = createContext({} as AuthContextType); + +interface AuthProviderProps { + children: ReactNode; +} + +export function AuthProvider({ children }: AuthProviderProps) { + const [user, setUser] = useState(null); + const [isLoading, setIsLoading] = useState(true); + + useEffect(() => { + const token = localStorage.getItem('duorigin_token'); + const savedUser = localStorage.getItem('duorigin_user'); + + if (token && savedUser) { + setUser(JSON.parse(savedUser)); + // Validar token com backend + apiClient.get('/auth/me') + .then(response => { + setUser(response.data); + localStorage.setItem('duorigin_user', JSON.stringify(response.data)); + }) + .catch(() => { + localStorage.removeItem('duorigin_token'); + localStorage.removeItem('duorigin_user'); + setUser(null); + }) + .finally(() => setIsLoading(false)); + } else { + setIsLoading(false); + } + }, []); + + const login = async (credentials: LoginCredentials) => { + const response = await apiClient.post('/auth/login', credentials); + const { access_token, user } = response.data; + + localStorage.setItem('duorigin_token', access_token); + localStorage.setItem('duorigin_user', JSON.stringify(user)); + setUser(user); + }; + + const registro = async (data: RegistroData) => { + const response = await apiClient.post('/auth/registro', data); + const { access_token, user } = response.data; + + localStorage.setItem('duorigin_token', access_token); + localStorage.setItem('duorigin_user', JSON.stringify(user)); + setUser(user); + }; + + const logout = () => { + localStorage.removeItem('duorigin_token'); + localStorage.removeItem('duorigin_user'); + setUser(null); + }; + + return ( + + {children} + + ); +} diff --git a/frontend/src/hooks/useApi.ts b/frontend/src/hooks/useApi.ts new file mode 100644 index 0000000..cee5b6d --- /dev/null +++ b/frontend/src/hooks/useApi.ts @@ -0,0 +1,90 @@ +import { useState, useCallback } from 'react'; +import apiClient from '@/api/client'; +import { AxiosError } from 'axios'; + +interface UseApiState { + data: T | null; + isLoading: boolean; + error: string | null; +} + +interface UseApiReturn extends UseApiState { + execute: (...args: unknown[]) => Promise; + reset: () => void; +} + +export function useApi( + apiCall: (...args: unknown[]) => Promise<{ data: T }> +): UseApiReturn { + const [state, setState] = useState>({ + data: null, + isLoading: false, + error: null, + }); + + const execute = useCallback(async (...args: unknown[]): Promise => { + setState(prev => ({ ...prev, isLoading: true, error: null })); + + try { + const response = await apiCall(...args); + setState({ data: response.data, isLoading: false, error: null }); + return response.data; + } catch (err) { + const error = err as AxiosError<{ detail?: string }>; + const message = error.response?.data?.detail || error.message || 'Erro desconhecido'; + setState(prev => ({ ...prev, isLoading: false, error: message })); + return null; + } + }, [apiCall]); + + const reset = useCallback(() => { + setState({ data: null, isLoading: false, error: null }); + }, []); + + return { ...state, execute, reset }; +} + +// Funções de API helper +export const api = { + // Dashboard + getDashboardStats: () => apiClient.get('/dashboard/stats'), + + // Empresas + getEmpresas: () => apiClient.get('/empresas'), + getEmpresa: (id: number) => apiClient.get(`/empresas/${id}`), + createEmpresa: (data: unknown) => apiClient.post('/empresas', data), + updateEmpresa: (id: number, data: unknown) => apiClient.put(`/empresas/${id}`, data), + deleteEmpresa: (id: number) => apiClient.delete(`/empresas/${id}`), + + // Propriedades + getPropriedades: (empresaId?: number) => + apiClient.get('/propriedades', { params: empresaId ? { empresa_id: empresaId } : {} }), + getPropriedade: (id: number) => apiClient.get(`/propriedades/${id}`), + createPropriedade: (data: unknown) => apiClient.post('/propriedades', data), + updatePropriedade: (id: number, data: unknown) => apiClient.put(`/propriedades/${id}`, data), + deletePropriedade: (id: number) => apiClient.delete(`/propriedades/${id}`), + + // Avaliações + getAvaliacoes: (propriedadeId?: number) => + apiClient.get('/avaliacoes', { params: propriedadeId ? { propriedade_id: propriedadeId } : {} }), + getAvaliacao: (id: number) => apiClient.get(`/avaliacoes/${id}`), + createAvaliacao: (data: unknown) => apiClient.post('/avaliacoes', data), + updateAvaliacao: (id: number, data: unknown) => apiClient.put(`/avaliacoes/${id}`, data), + gerarDDS: (id: number) => apiClient.post(`/avaliacoes/${id}/gerar-dds`), + + // Documentos + getDocumentos: (params?: { propriedade_id?: number; avaliacao_id?: number }) => + apiClient.get('/documentos', { params }), + uploadDocumento: (formData: FormData) => + apiClient.post('/documentos/upload', formData, { + headers: { 'Content-Type': 'multipart/form-data' }, + }), + deleteDocumento: (id: number) => apiClient.delete(`/documentos/${id}`), + + // Usuários + getUsuarios: () => apiClient.get('/usuarios'), + getUsuario: (id: number) => apiClient.get(`/usuarios/${id}`), + createUsuario: (data: unknown) => apiClient.post('/usuarios', data), + updateUsuario: (id: number, data: unknown) => apiClient.put(`/usuarios/${id}`, data), + deleteUsuario: (id: number) => apiClient.delete(`/usuarios/${id}`), +}; diff --git a/frontend/src/hooks/useAuth.ts b/frontend/src/hooks/useAuth.ts new file mode 100644 index 0000000..72b4236 --- /dev/null +++ b/frontend/src/hooks/useAuth.ts @@ -0,0 +1,12 @@ +import { useContext } from 'react'; +import { AuthContext } from '@/contexts/AuthContext'; + +export function useAuth() { + const context = useContext(AuthContext); + + if (!context) { + throw new Error('useAuth must be used within an AuthProvider'); + } + + return context; +} diff --git a/frontend/src/index.css b/frontend/src/index.css new file mode 100644 index 0000000..a6bdbd6 --- /dev/null +++ b/frontend/src/index.css @@ -0,0 +1,60 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + --green: #1A7A4C; + --green-hover: #15634D; + --navy: #2D3142; + --gray: #C8C9CB; + --gray-text: #8E9196; + --text: #5A5D6B; +} + +body { + font-family: 'Inter', system-ui, -apple-system, sans-serif; + background: #FFFFFF; + color: #2D3142; +} + +@layer components { + .glass-card { + @apply bg-white border border-gray-200 rounded-2xl p-6 transition-all duration-300; + box-shadow: 0 1px 3px rgba(0,0,0,0.05); + } + + .glass-card:hover { + @apply border-primary; + transform: translateY(-2px); + box-shadow: 0 8px 24px rgba(26, 122, 76, 0.1); + } + + .btn-primary { + @apply bg-primary hover:bg-primary-hover text-white font-semibold py-3 px-8 rounded-xl transition-all duration-300 inline-block; + } + + .btn-primary:hover { + transform: translateY(-2px); + box-shadow: 0 8px 32px rgba(26, 122, 76, 0.3); + } + + .btn-secondary { + @apply border border-gray-custom text-navy hover:border-primary py-3 px-8 rounded-xl transition-all duration-300; + } + + .input-field { + @apply w-full bg-gray-bg border border-gray-200 rounded-lg px-4 py-3 text-navy focus:border-primary focus:outline-none transition; + } + + .sidebar-link { + @apply flex items-center gap-3 px-4 py-3 rounded-lg text-gray-text hover:text-primary hover:bg-primary/5 transition-all duration-200; + } + + .sidebar-link.active { + @apply bg-primary/10 text-primary font-medium; + } +} + +::-webkit-scrollbar { width: 6px; } +::-webkit-scrollbar-track { background: #F5F6F8; } +::-webkit-scrollbar-thumb { background: #1A7A4C; border-radius: 3px; } diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx new file mode 100644 index 0000000..bef5202 --- /dev/null +++ b/frontend/src/main.tsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import './index.css' +import App from './App.tsx' + +createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/frontend/src/pages/AvaliacaoDetail.tsx b/frontend/src/pages/AvaliacaoDetail.tsx new file mode 100644 index 0000000..3038bae --- /dev/null +++ b/frontend/src/pages/AvaliacaoDetail.tsx @@ -0,0 +1,245 @@ +import { useEffect, useState } from 'react'; +import { useNavigate, useParams } from 'react-router-dom'; +import { ArrowLeft, Loader2, FileText, MapPin, Calendar, AlertTriangle, CheckCircle, Clock, XCircle } from 'lucide-react'; +import { api } from '@/hooks/useApi'; +import { Avaliacao } from '@/types'; +import DDSModal from '@/components/DDSModal'; + +const statusConfig = { + pendente: { icon: Clock, color: 'bg-amber-100 text-amber-700', label: 'Pendente' }, + em_analise: { icon: AlertTriangle, color: 'bg-blue-100 text-blue-700', label: 'Em Análise' }, + aprovada: { icon: CheckCircle, color: 'bg-green-100 text-green-700', label: 'Aprovada' }, + reprovada: { icon: XCircle, color: 'bg-red-100 text-red-700', label: 'Reprovada' }, +}; + +const riscoConfig = { + baixo: { color: 'text-green-600', bg: 'bg-green-100', label: 'Baixo' }, + medio: { color: 'text-amber-600', bg: 'bg-amber-100', label: 'Médio' }, + alto: { color: 'text-orange-600', bg: 'bg-orange-100', label: 'Alto' }, + critico: { color: 'text-red-600', bg: 'bg-red-100', label: 'Crítico' }, +}; + +export default function AvaliacaoDetail() { + const navigate = useNavigate(); + const { id } = useParams(); + const [avaliacao, setAvaliacao] = useState(null); + const [isLoading, setIsLoading] = useState(true); + const [showDDSModal, setShowDDSModal] = useState(false); + + useEffect(() => { + loadAvaliacao(); + }, [id]); + + const loadAvaliacao = async () => { + try { + const response = await api.getAvaliacao(Number(id)); + setAvaliacao(response.data); + } catch (error) { + console.error('Erro ao carregar avaliação:', error); + // Mock + setAvaliacao({ + id: Number(id), + propriedade_id: 1, + data_avaliacao: '2024-02-01', + status: 'aprovada', + risco_desmatamento: 'baixo', + score_risco: 15, + observacoes: 'Propriedade em conformidade com EUDR. Documentação verificada e validada.', + dds_gerada: true, + dds_codigo: 'DDS-2024-00001', + created_at: '2024-02-01', + updated_at: '2024-02-01', + propriedade: { + id: 1, + nome: 'Fazenda Santa Maria', + codigo_car: 'MT-5107909-F4B8E35DB1', + area_total_ha: 1250.5, + cidade: 'Sinop', + estado: 'MT', + } as any, + }); + } finally { + setIsLoading(false); + } + }; + + if (isLoading) { + return ( +
+ +
+ ); + } + + if (!avaliacao) { + return ( +
+

Avaliação não encontrada

+
+ ); + } + + const status = statusConfig[avaliacao.status]; + const StatusIcon = status.icon; + const risco = riscoConfig[avaliacao.risco_desmatamento]; + + return ( +
+ {/* Header */} +
+
+ +
+

Avaliação #{avaliacao.id}

+

+ {avaliacao.propriedade?.nome} +

+
+
+
+ +
+
+ +
+ {/* Main Info */} +
+ {/* Status Card */} +
+

Status da Avaliação

+
+
+ + + {status.label} + +

Status

+
+
+ + {risco.label} + +

Risco

+
+
+ {avaliacao.score_risco}% +

Score de Risco

+
+
+ + {avaliacao.dds_gerada ? '✓ Gerada' : 'Pendente'} + +

DDS

+
+
+
+ + {/* Observações */} +
+

Observações

+

+ {avaliacao.observacoes || 'Sem observações registradas.'} +

+
+ + {/* DDS Info */} + {avaliacao.dds_gerada && avaliacao.dds_codigo && ( +
+
+
+ +
+
+

DDS Gerada com Sucesso

+

+ Código: {avaliacao.dds_codigo} +

+

+ Declaração compatível com TRACES NT +

+
+
+
+ )} +
+ + {/* Sidebar */} +
+ {/* Propriedade Info */} +
+

Propriedade

+
+
+ +
+

{avaliacao.propriedade?.nome}

+

+ {avaliacao.propriedade?.cidade}/{avaliacao.propriedade?.estado} +

+
+
+
+

Código CAR

+

{avaliacao.propriedade?.codigo_car || '-'}

+
+
+

Área Total

+

+ {avaliacao.propriedade?.area_total_ha?.toLocaleString('pt-BR')} ha +

+
+
+
+ + {/* Datas */} +
+

Datas

+
+
+ + + Avaliação + + + {new Date(avaliacao.data_avaliacao).toLocaleDateString('pt-BR')} + +
+
+ Criado em + + {new Date(avaliacao.created_at).toLocaleDateString('pt-BR')} + +
+
+ Atualizado em + + {new Date(avaliacao.updated_at).toLocaleDateString('pt-BR')} + +
+
+
+
+
+ + {/* DDS Modal */} + setShowDDSModal(false)} + avaliacao={avaliacao} + onSuccess={loadAvaliacao} + /> +
+ ); +} diff --git a/frontend/src/pages/Avaliacoes.tsx b/frontend/src/pages/Avaliacoes.tsx new file mode 100644 index 0000000..b8fdb8f --- /dev/null +++ b/frontend/src/pages/Avaliacoes.tsx @@ -0,0 +1,224 @@ +import { useEffect, useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { Plus, Search, ClipboardCheck, Calendar, AlertTriangle, CheckCircle, Clock, XCircle } from 'lucide-react'; +import DataTable from '@/components/DataTable'; +import { api } from '@/hooks/useApi'; +import { Avaliacao } from '@/types'; + +const statusConfig = { + pendente: { icon: Clock, color: 'bg-amber-100 text-amber-700', label: 'Pendente' }, + em_analise: { icon: AlertTriangle, color: 'bg-blue-100 text-blue-700', label: 'Em Análise' }, + aprovada: { icon: CheckCircle, color: 'bg-green-100 text-green-700', label: 'Aprovada' }, + reprovada: { icon: XCircle, color: 'bg-red-100 text-red-700', label: 'Reprovada' }, +}; + +const riscoConfig = { + baixo: { color: 'bg-green-100 text-green-700', label: 'Baixo' }, + medio: { color: 'bg-amber-100 text-amber-700', label: 'Médio' }, + alto: { color: 'bg-orange-100 text-orange-700', label: 'Alto' }, + critico: { color: 'bg-red-100 text-red-700', label: 'Crítico' }, +}; + +export default function Avaliacoes() { + const navigate = useNavigate(); + const [avaliacoes, setAvaliacoes] = useState([]); + const [isLoading, setIsLoading] = useState(true); + const [searchTerm, setSearchTerm] = useState(''); + + useEffect(() => { + loadAvaliacoes(); + }, []); + + const loadAvaliacoes = async () => { + try { + const response = await api.getAvaliacoes(); + setAvaliacoes(response.data); + } catch (error) { + console.error('Erro ao carregar avaliações:', error); + // Mock data + setAvaliacoes([ + { + id: 1, + propriedade_id: 1, + data_avaliacao: '2024-02-01', + status: 'aprovada', + risco_desmatamento: 'baixo', + score_risco: 15, + observacoes: 'Propriedade em conformidade com EUDR', + dds_gerada: true, + dds_codigo: 'DDS-2024-00001', + created_at: '2024-02-01', + updated_at: '2024-02-01', + propriedade: { id: 1, nome: 'Fazenda Santa Maria' } as any, + }, + { + id: 2, + propriedade_id: 2, + data_avaliacao: '2024-02-05', + status: 'em_analise', + risco_desmatamento: 'medio', + score_risco: 45, + observacoes: 'Aguardando documentação adicional', + dds_gerada: false, + created_at: '2024-02-05', + updated_at: '2024-02-05', + propriedade: { id: 2, nome: 'Sítio Esperança' } as any, + }, + { + id: 3, + propriedade_id: 3, + data_avaliacao: '2024-02-08', + status: 'pendente', + risco_desmatamento: 'baixo', + score_risco: 22, + dds_gerada: false, + created_at: '2024-02-08', + updated_at: '2024-02-08', + propriedade: { id: 3, nome: 'Estância Boa Vista' } as any, + }, + ]); + } finally { + setIsLoading(false); + } + }; + + const filteredAvaliacoes = avaliacoes.filter( + a => + a.propriedade?.nome?.toLowerCase().includes(searchTerm.toLowerCase()) || + a.dds_codigo?.includes(searchTerm) + ); + + const columns = [ + { + key: 'propriedade', + label: 'Propriedade', + render: (av: Avaliacao) => ( +
+
+ +
+
+
{av.propriedade?.nome || '-'}
+ {av.dds_codigo && ( +
{av.dds_codigo}
+ )} +
+
+ ), + }, + { + key: 'data_avaliacao', + label: 'Data', + render: (av: Avaliacao) => ( +
+ + {new Date(av.data_avaliacao).toLocaleDateString('pt-BR')} +
+ ), + }, + { + key: 'status', + label: 'Status', + render: (av: Avaliacao) => { + const config = statusConfig[av.status]; + const Icon = config.icon; + return ( + + + {config.label} + + ); + }, + }, + { + key: 'risco_desmatamento', + label: 'Risco', + render: (av: Avaliacao) => { + const config = riscoConfig[av.risco_desmatamento]; + return ( + + {config.label} + + ); + }, + }, + { + key: 'score_risco', + label: 'Score', + render: (av: Avaliacao) => ( +
+
+
+
+ {av.score_risco}% +
+ ), + }, + { + key: 'dds_gerada', + label: 'DDS', + render: (av: Avaliacao) => ( + + {av.dds_gerada ? 'Gerada' : 'Pendente'} + + ), + }, + ]; + + return ( +
+ {/* Header */} +
+
+

Avaliações

+

+ Avaliações de due diligence EUDR +

+
+ +
+ + {/* Search */} +
+
+ + setSearchTerm(e.target.value)} + className="input-field pl-10" + /> +
+
+ + {/* Table */} + av.id} + onRowClick={av => navigate(`/avaliacoes/${av.id}`)} + emptyMessage="Nenhuma avaliação encontrada" + /> +
+ ); +} diff --git a/frontend/src/pages/Dashboard.tsx b/frontend/src/pages/Dashboard.tsx new file mode 100644 index 0000000..c672b9c --- /dev/null +++ b/frontend/src/pages/Dashboard.tsx @@ -0,0 +1,179 @@ +import { useEffect, useState } from 'react'; +import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts'; +import { Building2, MapPin, ClipboardCheck, FileText, Loader2 } from 'lucide-react'; +import StatsCard from '@/components/StatsCard'; +import { api } from '@/hooks/useApi'; +import { DashboardStats } from '@/types'; + +export default function Dashboard() { + const [stats, setStats] = useState(null); + const [isLoading, setIsLoading] = useState(true); + + useEffect(() => { + loadStats(); + }, []); + + const loadStats = async () => { + try { + const response = await api.getDashboardStats(); + setStats(response.data); + } catch (error) { + console.error('Erro ao carregar stats:', error); + // Mock data para desenvolvimento + setStats({ + total_empresas: 12, + total_propriedades: 48, + total_avaliacoes: 156, + avaliacoes_aprovadas: 142, + avaliacoes_pendentes: 8, + dds_geradas: 134, + avaliacoes_por_mes: [ + { mes: 'Set', total: 18 }, + { mes: 'Out', total: 24 }, + { mes: 'Nov', total: 32 }, + { mes: 'Dez', total: 28 }, + { mes: 'Jan', total: 35 }, + { mes: 'Fev', total: 19 }, + ], + }); + } finally { + setIsLoading(false); + } + }; + + if (isLoading) { + return ( +
+ +
+ ); + } + + const taxaAprovacao = stats + ? Math.round((stats.avaliacoes_aprovadas / stats.total_avaliacoes) * 100) + : 0; + + return ( +
+ {/* Header */} +
+
+

Dashboard

+

Visão geral do compliance EUDR

+
+
+ Última atualização: {new Date().toLocaleString('pt-BR')} +
+
+ + {/* Stats Cards */} +
+ } + label="Empresas" + value={stats?.total_empresas || 0} + /> + } + label="Propriedades" + value={stats?.total_propriedades || 0} + /> + } + label="Avaliações" + value={stats?.total_avaliacoes || 0} + /> + } + label="DDS Geradas" + value={stats?.dds_geradas || 0} + trend={`${taxaAprovacao}%`} + trendUp={taxaAprovacao >= 90} + /> +
+ + {/* Charts */} +
+ {/* Gráfico de Avaliações por Mês */} +
+

📊 Avaliações por Mês

+
+ + + + + + + + + +
+
+ + {/* Resumo */} +
+

📋 Resumo

+
+
+ Avaliações Aprovadas + {stats?.avaliacoes_aprovadas || 0} +
+
+ Avaliações Pendentes + {stats?.avaliacoes_pendentes || 0} +
+
+ Taxa de Aprovação + {taxaAprovacao}% +
+
+ DDS Geradas + {stats?.dds_geradas || 0} +
+
+
+
+ + {/* Quick Actions */} + +
+ ); +} diff --git a/frontend/src/pages/Documentos.tsx b/frontend/src/pages/Documentos.tsx new file mode 100644 index 0000000..1703ce9 --- /dev/null +++ b/frontend/src/pages/Documentos.tsx @@ -0,0 +1,296 @@ +import { useEffect, useState, useRef } from 'react'; +import { FileText, Upload, Search, Trash2, Download, File, Image, FileSpreadsheet, Loader2 } from 'lucide-react'; +import DataTable from '@/components/DataTable'; +import Modal from '@/components/Modal'; +import { api } from '@/hooks/useApi'; +import { Documento } from '@/types'; + +const iconByType: Record = { + 'application/pdf': FileText, + 'image/jpeg': Image, + 'image/png': Image, + 'application/vnd.ms-excel': FileSpreadsheet, + 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': FileSpreadsheet, +}; + +function formatFileSize(bytes: number): string { + if (bytes < 1024) return `${bytes} B`; + if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`; + return `${(bytes / (1024 * 1024)).toFixed(1)} MB`; +} + +export default function Documentos() { + const [documentos, setDocumentos] = useState([]); + const [isLoading, setIsLoading] = useState(true); + const [searchTerm, setSearchTerm] = useState(''); + const [showUploadModal, setShowUploadModal] = useState(false); + const [isUploading, setIsUploading] = useState(false); + const [showDeleteModal, setShowDeleteModal] = useState(false); + const [selectedDoc, setSelectedDoc] = useState(null); + const fileInputRef = useRef(null); + + useEffect(() => { + loadDocumentos(); + }, []); + + const loadDocumentos = async () => { + try { + const response = await api.getDocumentos(); + setDocumentos(response.data); + } catch (error) { + console.error('Erro ao carregar documentos:', error); + // Mock data + setDocumentos([ + { + id: 1, + nome: 'CAR_Fazenda_Santa_Maria.pdf', + tipo: 'application/pdf', + tamanho: 2456789, + url: '/uploads/car_fazenda.pdf', + propriedade_id: 1, + uploaded_by: 1, + created_at: '2024-02-01T10:30:00', + }, + { + id: 2, + nome: 'Licença_Ambiental_2024.pdf', + tipo: 'application/pdf', + tamanho: 1234567, + url: '/uploads/licenca.pdf', + empresa_id: 1, + uploaded_by: 1, + created_at: '2024-02-03T14:15:00', + }, + { + id: 3, + nome: 'Mapa_Propriedade.png', + tipo: 'image/png', + tamanho: 3456789, + url: '/uploads/mapa.png', + propriedade_id: 1, + uploaded_by: 1, + created_at: '2024-02-05T09:00:00', + }, + ]); + } finally { + setIsLoading(false); + } + }; + + const handleUpload = async (e: React.ChangeEvent) => { + const files = e.target.files; + if (!files || files.length === 0) return; + + setIsUploading(true); + try { + for (const file of files) { + const formData = new FormData(); + formData.append('file', file); + await api.uploadDocumento(formData); + } + loadDocumentos(); + setShowUploadModal(false); + } catch (error) { + console.error('Erro ao fazer upload:', error); + } finally { + setIsUploading(false); + if (fileInputRef.current) { + fileInputRef.current.value = ''; + } + } + }; + + const handleDelete = async () => { + if (!selectedDoc) return; + try { + await api.deleteDocumento(selectedDoc.id); + loadDocumentos(); + } catch (error) { + console.error('Erro ao excluir documento:', error); + } + setShowDeleteModal(false); + setSelectedDoc(null); + }; + + const filteredDocumentos = documentos.filter(d => + d.nome.toLowerCase().includes(searchTerm.toLowerCase()) + ); + + const columns = [ + { + key: 'nome', + label: 'Documento', + render: (doc: Documento) => { + const Icon = iconByType[doc.tipo] || File; + return ( +
+
+ +
+
+
{doc.nome}
+
{formatFileSize(doc.tamanho)}
+
+
+ ); + }, + }, + { + key: 'tipo', + label: 'Tipo', + render: (doc: Documento) => ( + + {doc.tipo.split('/').pop()?.toUpperCase() || 'Arquivo'} + + ), + }, + { + key: 'created_at', + label: 'Data Upload', + render: (doc: Documento) => ( + + {new Date(doc.created_at).toLocaleDateString('pt-BR')} + + ), + }, + { + key: 'acoes', + label: 'Ações', + render: (doc: Documento) => ( +
+ + + + +
+ ), + }, + ]; + + return ( +
+ {/* Header */} +
+
+

Documentos

+

+ Gestão de documentos e arquivos +

+
+ +
+ + {/* Search */} +
+
+ + setSearchTerm(e.target.value)} + className="input-field pl-10" + /> +
+
+ + {/* Table */} + doc.id} + emptyMessage="Nenhum documento encontrado" + /> + + {/* Upload Modal */} + setShowUploadModal(false)} + title="Upload de Documentos" + > +
+
fileInputRef.current?.click()} + > + {isUploading ? ( + + ) : ( + + )} +

+ {isUploading ? 'Enviando...' : 'Clique para selecionar arquivos'} +

+

+ PDF, imagens ou planilhas (máx. 10MB) +

+ +
+
+
+ + {/* Delete Modal */} + { + setShowDeleteModal(false); + setSelectedDoc(null); + }} + title="Confirmar Exclusão" + > +

+ Tem certeza que deseja excluir o documento {selectedDoc?.nome}? + Esta ação não pode ser desfeita. +

+
+ + +
+
+
+ ); +} diff --git a/frontend/src/pages/EmpresaForm.tsx b/frontend/src/pages/EmpresaForm.tsx new file mode 100644 index 0000000..32f7ec2 --- /dev/null +++ b/frontend/src/pages/EmpresaForm.tsx @@ -0,0 +1,298 @@ +import { useEffect, useState } from 'react'; +import { useNavigate, useParams } from 'react-router-dom'; +import { useForm } from 'react-hook-form'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { z } from 'zod'; +import { ArrowLeft, Loader2, Save, Trash2 } from 'lucide-react'; +import { api } from '@/hooks/useApi'; +import Modal from '@/components/Modal'; + +const empresaSchema = z.object({ + nome: z.string().min(3, 'Nome deve ter no mínimo 3 caracteres'), + cnpj: z.string().min(14, 'CNPJ inválido'), + email: z.string().email('Email inválido').optional().or(z.literal('')), + telefone: z.string().optional(), + endereco: z.string().optional(), + cidade: z.string().optional(), + estado: z.string().max(2, 'Use a sigla do estado').optional(), + cep: z.string().optional(), + eu_operator_id: z.string().optional(), +}); + +type EmpresaFormData = z.infer; + +export default function EmpresaForm() { + const navigate = useNavigate(); + const { id } = useParams(); + const isEditing = Boolean(id); + + const [isLoading, setIsLoading] = useState(false); + const [isSaving, setIsSaving] = useState(false); + const [showDeleteModal, setShowDeleteModal] = useState(false); + const [error, setError] = useState(''); + + const { + register, + handleSubmit, + reset, + formState: { errors }, + } = useForm({ + resolver: zodResolver(empresaSchema), + }); + + useEffect(() => { + if (isEditing) { + loadEmpresa(); + } + }, [id]); + + const loadEmpresa = async () => { + setIsLoading(true); + try { + const response = await api.getEmpresa(Number(id)); + reset(response.data); + } catch (error) { + console.error('Erro ao carregar empresa:', error); + setError('Empresa não encontrada'); + } finally { + setIsLoading(false); + } + }; + + const onSubmit = async (data: EmpresaFormData) => { + setIsSaving(true); + setError(''); + + try { + if (isEditing) { + await api.updateEmpresa(Number(id), data); + } else { + await api.createEmpresa(data); + } + navigate('/empresas'); + } catch (err: unknown) { + const error = err as { response?: { data?: { detail?: string } } }; + setError(error.response?.data?.detail || 'Erro ao salvar empresa'); + } finally { + setIsSaving(false); + } + }; + + const handleDelete = async () => { + try { + await api.deleteEmpresa(Number(id)); + navigate('/empresas'); + } catch (err: unknown) { + const error = err as { response?: { data?: { detail?: string } } }; + setError(error.response?.data?.detail || 'Erro ao excluir empresa'); + } + setShowDeleteModal(false); + }; + + if (isLoading) { + return ( +
+ +
+ ); + } + + return ( +
+ {/* Header */} +
+ +
+

+ {isEditing ? 'Editar Empresa' : 'Nova Empresa'} +

+

+ {isEditing ? 'Atualize os dados da empresa' : 'Cadastre uma nova empresa operadora'} +

+
+
+ + {/* Form */} +
+
+ {error && ( +
+ {error} +
+ )} + +
+
+ + + {errors.nome && ( +

{errors.nome.message}

+ )} +
+ +
+ + + {errors.cnpj && ( +

{errors.cnpj.message}

+ )} +
+ +
+ + +
+ +
+ + + {errors.email && ( +

{errors.email.message}

+ )} +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+
+ + + {errors.estado && ( +

{errors.estado.message}

+ )} +
+
+ + +
+
+
+ + {/* Actions */} +
+ {isEditing ? ( + + ) : ( +
+ )} + +
+ + +
+
+ +
+ + {/* Delete Modal */} + setShowDeleteModal(false)} + title="Confirmar Exclusão" + > +

+ Tem certeza que deseja excluir esta empresa? Esta ação não pode ser desfeita. +

+
+ + +
+
+
+ ); +} diff --git a/frontend/src/pages/Empresas.tsx b/frontend/src/pages/Empresas.tsx new file mode 100644 index 0000000..0e6a4cd --- /dev/null +++ b/frontend/src/pages/Empresas.tsx @@ -0,0 +1,188 @@ +import { useEffect, useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { Plus, Search, Building2, MapPin, Phone } from 'lucide-react'; +import DataTable from '@/components/DataTable'; +import { api } from '@/hooks/useApi'; +import { Empresa } from '@/types'; + +export default function Empresas() { + const navigate = useNavigate(); + const [empresas, setEmpresas] = useState([]); + const [isLoading, setIsLoading] = useState(true); + const [searchTerm, setSearchTerm] = useState(''); + + useEffect(() => { + loadEmpresas(); + }, []); + + const loadEmpresas = async () => { + try { + const response = await api.getEmpresas(); + setEmpresas(response.data); + } catch (error) { + console.error('Erro ao carregar empresas:', error); + // Mock data + setEmpresas([ + { + id: 1, + nome: 'AgroBrasil Exportações', + cnpj: '12.345.678/0001-99', + email: 'contato@agrobrasil.com', + telefone: '(11) 99999-9999', + cidade: 'São Paulo', + estado: 'SP', + eu_operator_id: 'BR-OP-2024-001', + ativo: true, + created_at: '2024-01-15', + updated_at: '2024-01-15', + }, + { + id: 2, + nome: 'Fazendas União LTDA', + cnpj: '98.765.432/0001-11', + email: 'contato@fazendasuniao.com.br', + telefone: '(62) 98888-8888', + cidade: 'Goiânia', + estado: 'GO', + eu_operator_id: 'BR-OP-2024-002', + ativo: true, + created_at: '2024-02-20', + updated_at: '2024-02-20', + }, + { + id: 3, + nome: 'Cooperativa Grãos do Sul', + cnpj: '55.444.333/0001-22', + email: 'admin@graosul.coop.br', + telefone: '(51) 97777-7777', + cidade: 'Porto Alegre', + estado: 'RS', + eu_operator_id: 'BR-OP-2024-003', + ativo: true, + created_at: '2024-03-10', + updated_at: '2024-03-10', + }, + ]); + } finally { + setIsLoading(false); + } + }; + + const filteredEmpresas = empresas.filter( + e => + e.nome.toLowerCase().includes(searchTerm.toLowerCase()) || + e.cnpj.includes(searchTerm) + ); + + const columns = [ + { + key: 'nome', + label: 'Empresa', + render: (empresa: Empresa) => ( +
+
+ +
+
+
{empresa.nome}
+
{empresa.cnpj}
+
+
+ ), + }, + { + key: 'localizacao', + label: 'Localização', + render: (empresa: Empresa) => ( +
+ + {empresa.cidade}/{empresa.estado} +
+ ), + }, + { + key: 'contato', + label: 'Contato', + render: (empresa: Empresa) => ( +
+
{empresa.email}
+ {empresa.telefone && ( +
+ + {empresa.telefone} +
+ )} +
+ ), + }, + { + key: 'eu_operator_id', + label: 'EU Operator ID', + render: (empresa: Empresa) => ( + + {empresa.eu_operator_id || '-'} + + ), + }, + { + key: 'status', + label: 'Status', + render: (empresa: Empresa) => ( + + {empresa.ativo ? 'Ativa' : 'Inativa'} + + ), + }, + ]; + + return ( +
+ {/* Header */} +
+
+

Empresas

+

+ Gestão de empresas operadoras EUDR +

+
+ +
+ + {/* Search */} +
+
+ + setSearchTerm(e.target.value)} + className="input-field pl-10" + /> +
+
+ + {/* Table */} + empresa.id} + onRowClick={empresa => navigate(`/empresas/${empresa.id}`)} + emptyMessage="Nenhuma empresa encontrada" + /> +
+ ); +} diff --git a/frontend/src/pages/Landing.tsx b/frontend/src/pages/Landing.tsx new file mode 100644 index 0000000..4dbf7dd --- /dev/null +++ b/frontend/src/pages/Landing.tsx @@ -0,0 +1,258 @@ +import { Link } from 'react-router-dom'; +import Navbar from '@/components/Navbar'; +import Footer from '@/components/Footer'; +import { Shield, Map, FileText, Link2, BarChart3, Globe, Zap, CheckCircle2, Server } from 'lucide-react'; + +const features = [ + { + icon: , + title: 'Due Diligence Automatizada', + desc: 'Motor de avaliação EUDR com checklist completo, scoring de risco e flags automáticas', + }, + { + icon: , + title: 'Geolocalização Avançada', + desc: 'Mapeamento de áreas com GeoJSON/KML, detecção de sobreposição e análise de desmatamento', + }, + { + icon: , + title: 'DDS Automatizada', + desc: 'Geração, revisão e envio de Declarações de Due Diligence diretamente para a UE', + }, + { + icon: , + title: 'Rastreabilidade Completa', + desc: 'Cadeia de custódia do produtor ao porto, com histórico imutável de auditoria', + }, + { + icon: , + title: 'Dashboard Inteligente', + desc: 'Visão consolidada de risco, status de DDS, alertas e KPIs em tempo real', + }, + { + icon: , + title: 'Integração Direta via API Oficial EU', + desc: 'Conexão machine-to-machine com a API EUDR oficial — submissão automática de DDS', + }, +]; + +const stats = [ + { value: '5.2K+', label: 'Produtores' }, + { value: '180K+', label: 'Lotes Rastreados' }, + { value: '2.4K+', label: 'DDS Enviadas' }, + { value: '99.2%', label: 'Aprovação' }, +]; + +const apiFeatures = [ + { + icon: , + title: 'Submissão Automática', + desc: 'Envie DDS diretamente do DuOrigin para o sistema EUDR sem exportar arquivos', + }, + { + icon: , + title: 'Status em Tempo Real', + desc: 'Acompanhe o processamento: SUBMITTED → AVAILABLE com número de referência', + }, + { + icon: , + title: 'Cadeia de Suprimentos', + desc: 'Referencie DDS de fornecedores e navegue pela supply chain integrada', + }, + { + icon: , + title: 'Conformance Certified', + desc: 'Aprovado em todos os 7 Conformance Tests exigidos pela Comissão Europeia', + }, +]; + +export default function Landing() { + return ( +
+ + + {/* Hero */} +
+
+
+ + API EUDR v1.4 Integrada +
+
+ 🇪🇺 Conformidade EUDR 2025 — Regulamento (UE) 2023/1115 +
+

+ DUO + ORIGIN +
+ Compliance EUDR +
+ Inteligente +

+

+ Plataforma completa para gestão de compliance EUDR no agronegócio brasileiro. + Due diligence automatizada, rastreabilidade e integração direta com a API oficial da UE. +

+
+ + Começar Agora + + +
+ + {/* Stats */} +
+ {stats.map(stat => ( +
+
{stat.value}
+
{stat.label}
+
+ ))} +
+
+
+ + {/* API Integration Section - NEW */} +
+
+
+
+ + API EUDR v1.4 Certified +
+

+ Integração Oficial EUDR +

+

+ O DuOrigin conecta diretamente com a API oficial da Comissão Europeia via SOAP/WSDL. + Submeta, acompanhe e gerencie suas DDS sem sair da plataforma. +

+
+ +
+ {apiFeatures.map(f => ( +
+
{f.icon}
+

{f.title}

+

{f.desc}

+
+ ))} +
+ +
+
+
+ + Ambientes Suportados: +
+ ACCEPTANCE (Testes) + | + PRODUCTION (Produção) +
+
+
+
+ + {/* Features */} +
+
+

+ Recursos Completos +

+

+ Tudo que você precisa para compliance EUDR +

+
+ {features.map(f => ( +
+
{f.icon}
+

{f.title}

+

{f.desc}

+
+ ))} +
+
+
+ + {/* Technical Specs - NEW */} +
+
+

+ Especificações Técnicas +

+
+
+
+

API EUDR

+
    +
  • + + Protocolo SOAP/WSDL +
  • +
  • + + WS-Security UsernameToken Digest +
  • +
  • + + GeoJSON para geolocalização +
  • +
  • + + Suporte V1 e V2 dos serviços +
  • +
+
+
+

Serviços Disponíveis

+
    +
  • + submitDDS + Submissão de DDS +
  • +
  • + amendDDS + Alteração de DDS +
  • +
  • + retractDds + Cancelar/Retirar +
  • +
  • + getDDSInfo + Status e Referência +
  • +
+
+
+
+
+
+ + {/* CTA */} +
+
+

+ Pronto para garantir sua conformidade EUDR? +

+

+ Entre em contato para uma demonstração personalizada do DuoOrigin + e veja a integração com a API EUDR em ação. +

+
+ + Acessar Demo + + + Falar com Especialista + +
+
+
+ +
+
+ ); +} diff --git a/frontend/src/pages/Login.tsx b/frontend/src/pages/Login.tsx new file mode 100644 index 0000000..7d1eade --- /dev/null +++ b/frontend/src/pages/Login.tsx @@ -0,0 +1,157 @@ +import { useState } from 'react'; +import { Link, useNavigate, useLocation } from 'react-router-dom'; +import { useForm } from 'react-hook-form'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { z } from 'zod'; +import { useAuth } from '@/hooks/useAuth'; +import { Loader2, AlertCircle } from 'lucide-react'; + +const loginSchema = z.object({ + email: z.string().email('Email inválido'), + password: z.string().min(4, 'Senha deve ter no mínimo 4 caracteres'), +}); + +type LoginFormData = z.infer; + +const demoUsers = [ + { email: 'demo@duorigin.com', password: 'DuoDemo2026', role: 'Admin', desc: 'Acesso completo' }, + { email: 'operador@duorigin.com', password: 'DuoDemo2026', role: 'Operador', desc: 'Acesso operacional' }, +]; + +export default function Login() { + const navigate = useNavigate(); + const location = useLocation(); + const { login } = useAuth(); + const [error, setError] = useState(''); + const [isLoading, setIsLoading] = useState(false); + + const from = (location.state as { from?: { pathname: string } })?.from?.pathname || '/dashboard'; + + const { + register, + handleSubmit, + setValue, + formState: { errors }, + } = useForm({ + resolver: zodResolver(loginSchema), + }); + + const onSubmit = async (data: LoginFormData) => { + setIsLoading(true); + setError(''); + + try { + await login(data); + navigate(from, { replace: true }); + } catch (err: unknown) { + const error = err as { response?: { data?: { detail?: string } } }; + setError(error.response?.data?.detail || (error.response?.data as any)?.message || 'Email ou senha inválidos'); + } finally { + setIsLoading(false); + } + }; + + const fillDemo = (idx: number) => { + setValue('email', demoUsers[idx].email); + setValue('password', demoUsers[idx].password); + }; + + return ( +
+
+ {/* Logo */} +
+ + DuoOrigin + +

+ DuoOrigin +

+

Field to Data. Compliance Verified.

+
+ + {/* Login Card */} +
+

Acesso ao Sistema

+ +
+
+ + + {errors.email && ( +

{errors.email.message}

+ )} +
+ +
+ + + {errors.password && ( +

{errors.password.message}

+ )} +
+ + {error && ( +
+ + {error} +
+ )} + + +
+ +
+ + Não tem conta? Criar conta + +
+ + {/* Demo Access */} +
+

🔑 Acesso Demo

+
+ {demoUsers.map((user, idx) => ( + + ))} +
+
+
+
+
+ ); +} diff --git a/frontend/src/pages/PropriedadeForm.tsx b/frontend/src/pages/PropriedadeForm.tsx new file mode 100644 index 0000000..ca18c0b --- /dev/null +++ b/frontend/src/pages/PropriedadeForm.tsx @@ -0,0 +1,330 @@ +import { useEffect, useState } from 'react'; +import { useNavigate, useParams } from 'react-router-dom'; +import { useForm } from 'react-hook-form'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { z } from 'zod'; +import { ArrowLeft, Loader2, Save, Trash2 } from 'lucide-react'; +import { api } from '@/hooks/useApi'; +import Modal from '@/components/Modal'; +import { Empresa } from '@/types'; + +const propriedadeSchema = z.object({ + nome: z.string().min(3, 'Nome deve ter no mínimo 3 caracteres'), + empresa_id: z.string().min(1, 'Selecione uma empresa'), + codigo_car: z.string().optional(), + area_total_ha: z.string().min(1, 'Área deve ser maior que 0'), + latitude: z.string().optional(), + longitude: z.string().optional(), + cidade: z.string().optional(), + estado: z.string().max(2, 'Use a sigla do estado').optional(), +}); + +type PropriedadeFormData = z.infer; + +export default function PropriedadeForm() { + const navigate = useNavigate(); + const { id } = useParams(); + const isEditing = Boolean(id); + + const [isLoading, setIsLoading] = useState(false); + const [isSaving, setIsSaving] = useState(false); + const [showDeleteModal, setShowDeleteModal] = useState(false); + const [error, setError] = useState(''); + const [empresas, setEmpresas] = useState([]); + + const { + register, + handleSubmit, + reset, + formState: { errors }, + } = useForm({ + resolver: zodResolver(propriedadeSchema), + }); + + useEffect(() => { + loadEmpresas(); + if (isEditing) { + loadPropriedade(); + } + }, [id]); + + const loadEmpresas = async () => { + try { + const response = await api.getEmpresas(); + setEmpresas(response.data); + } catch (error) { + console.error('Erro ao carregar empresas:', error); + // Mock + setEmpresas([ + { id: 1, nome: 'AgroBrasil Exportações' } as Empresa, + { id: 2, nome: 'Fazendas União LTDA' } as Empresa, + ]); + } + }; + + const loadPropriedade = async () => { + setIsLoading(true); + try { + const response = await api.getPropriedade(Number(id)); + const data = response.data; + reset({ + nome: data.nome, + empresa_id: String(data.empresa_id), + codigo_car: data.codigo_car || '', + area_total_ha: String(data.area_total_ha), + latitude: data.latitude ? String(data.latitude) : '', + longitude: data.longitude ? String(data.longitude) : '', + cidade: data.cidade || '', + estado: data.estado || '', + }); + } catch (error) { + console.error('Erro ao carregar propriedade:', error); + setError('Propriedade não encontrada'); + } finally { + setIsLoading(false); + } + }; + + const onSubmit = async (data: PropriedadeFormData) => { + setIsSaving(true); + setError(''); + + try { + const payload = { + ...data, + empresa_id: Number(data.empresa_id), + area_total_ha: Number(data.area_total_ha), + latitude: data.latitude ? Number(data.latitude) : undefined, + longitude: data.longitude ? Number(data.longitude) : undefined, + }; + if (isEditing) { + await api.updatePropriedade(Number(id), payload); + } else { + await api.createPropriedade(payload); + } + navigate('/propriedades'); + } catch (err: unknown) { + const error = err as { response?: { data?: { detail?: string } } }; + setError(error.response?.data?.detail || 'Erro ao salvar propriedade'); + } finally { + setIsSaving(false); + } + }; + + const handleDelete = async () => { + try { + await api.deletePropriedade(Number(id)); + navigate('/propriedades'); + } catch (err: unknown) { + const error = err as { response?: { data?: { detail?: string } } }; + setError(error.response?.data?.detail || 'Erro ao excluir propriedade'); + } + setShowDeleteModal(false); + }; + + if (isLoading) { + return ( +
+ +
+ ); + } + + return ( +
+ {/* Header */} +
+ +
+

+ {isEditing ? 'Editar Propriedade' : 'Nova Propriedade'} +

+

+ {isEditing ? 'Atualize os dados da propriedade' : 'Cadastre uma nova propriedade rural'} +

+
+
+ + {/* Form */} +
+
+ {error && ( +
+ {error} +
+ )} + +
+
+ + + {errors.nome && ( +

{errors.nome.message}

+ )} +
+ +
+ + + {errors.empresa_id && ( +

{errors.empresa_id.message}

+ )} +
+ +
+ + +
+ +
+ + + {errors.area_total_ha && ( +

{errors.area_total_ha.message}

+ )} +
+ +
+ + +
+ +
+ + + {errors.estado && ( +

{errors.estado.message}

+ )} +
+ +
+ + +
+ +
+ + +
+
+ + {/* Actions */} +
+ {isEditing ? ( + + ) : ( +
+ )} + +
+ + +
+
+ +
+ + {/* Delete Modal */} + setShowDeleteModal(false)} + title="Confirmar Exclusão" + > +

+ Tem certeza que deseja excluir esta propriedade? Esta ação não pode ser desfeita. +

+
+ + +
+
+
+ ); +} diff --git a/frontend/src/pages/Propriedades.tsx b/frontend/src/pages/Propriedades.tsx new file mode 100644 index 0000000..1868535 --- /dev/null +++ b/frontend/src/pages/Propriedades.tsx @@ -0,0 +1,192 @@ +import { useEffect, useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { Plus, Search, MapPin, Building2, Ruler } from 'lucide-react'; +import DataTable from '@/components/DataTable'; +import { api } from '@/hooks/useApi'; +import { Propriedade } from '@/types'; + +export default function Propriedades() { + const navigate = useNavigate(); + const [propriedades, setPropriedades] = useState([]); + const [isLoading, setIsLoading] = useState(true); + const [searchTerm, setSearchTerm] = useState(''); + + useEffect(() => { + loadPropriedades(); + }, []); + + const loadPropriedades = async () => { + try { + const response = await api.getPropriedades(); + setPropriedades(response.data); + } catch (error) { + console.error('Erro ao carregar propriedades:', error); + // Mock data + setPropriedades([ + { + id: 1, + nome: 'Fazenda Santa Maria', + empresa_id: 1, + codigo_car: 'MT-5107909-F4B8E35DB1', + area_total_ha: 1250.5, + latitude: -12.5432, + longitude: -55.7234, + cidade: 'Sinop', + estado: 'MT', + ativo: true, + created_at: '2024-01-15', + updated_at: '2024-01-15', + empresa: { id: 1, nome: 'AgroBrasil Exportações' } as any, + }, + { + id: 2, + nome: 'Sítio Esperança', + empresa_id: 2, + codigo_car: 'GO-5208707-A2C3D45EF6', + area_total_ha: 320.8, + latitude: -16.6799, + longitude: -49.2550, + cidade: 'Goiânia', + estado: 'GO', + ativo: true, + created_at: '2024-02-20', + updated_at: '2024-02-20', + empresa: { id: 2, nome: 'Fazendas União LTDA' } as any, + }, + { + id: 3, + nome: 'Estância Boa Vista', + empresa_id: 1, + codigo_car: 'MT-5106752-C7D8E90FA1', + area_total_ha: 2100.0, + latitude: -13.1234, + longitude: -56.4567, + cidade: 'Sorriso', + estado: 'MT', + ativo: true, + created_at: '2024-03-10', + updated_at: '2024-03-10', + empresa: { id: 1, nome: 'AgroBrasil Exportações' } as any, + }, + ]); + } finally { + setIsLoading(false); + } + }; + + const filteredPropriedades = propriedades.filter( + p => + p.nome.toLowerCase().includes(searchTerm.toLowerCase()) || + p.codigo_car?.includes(searchTerm) || + p.cidade?.toLowerCase().includes(searchTerm.toLowerCase()) + ); + + const columns = [ + { + key: 'nome', + label: 'Propriedade', + render: (prop: Propriedade) => ( +
+
+ +
+
+
{prop.nome}
+
{prop.codigo_car || '-'}
+
+
+ ), + }, + { + key: 'empresa', + label: 'Empresa', + render: (prop: Propriedade) => ( +
+ + {prop.empresa?.nome || '-'} +
+ ), + }, + { + key: 'localizacao', + label: 'Localização', + render: (prop: Propriedade) => ( + + {prop.cidade}/{prop.estado} + + ), + }, + { + key: 'area_total_ha', + label: 'Área Total', + render: (prop: Propriedade) => ( +
+ + + {prop.area_total_ha.toLocaleString('pt-BR')} ha + +
+ ), + }, + { + key: 'status', + label: 'Status', + render: (prop: Propriedade) => ( + + {prop.ativo ? 'Ativa' : 'Inativa'} + + ), + }, + ]; + + return ( +
+ {/* Header */} +
+
+

Propriedades

+

+ Gestão de propriedades rurais +

+
+ +
+ + {/* Search */} +
+
+ + setSearchTerm(e.target.value)} + className="input-field pl-10" + /> +
+
+ + {/* Table */} + prop.id} + onRowClick={prop => navigate(`/propriedades/${prop.id}`)} + emptyMessage="Nenhuma propriedade encontrada" + /> +
+ ); +} diff --git a/frontend/src/pages/Registro.tsx b/frontend/src/pages/Registro.tsx new file mode 100644 index 0000000..fce5a56 --- /dev/null +++ b/frontend/src/pages/Registro.tsx @@ -0,0 +1,173 @@ +import { useState } from 'react'; +import { Link, useNavigate } from 'react-router-dom'; +import { useForm } from 'react-hook-form'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { z } from 'zod'; +import { useAuth } from '@/hooks/useAuth'; +import { Loader2, AlertCircle } from 'lucide-react'; + +const registroSchema = z.object({ + nome: z.string().min(3, 'Nome deve ter no mínimo 3 caracteres'), + email: z.string().email('Email inválido'), + password: z.string().min(6, 'Senha deve ter no mínimo 6 caracteres'), + confirmarSenha: z.string(), + empresa_nome: z.string().optional(), +}).refine(data => data.password === data.confirmarSenha, { + message: 'Senhas não conferem', + path: ['confirmarSenha'], +}); + +type RegistroFormData = z.infer; + +export default function Registro() { + const navigate = useNavigate(); + const { registro } = useAuth(); + const [error, setError] = useState(''); + const [isLoading, setIsLoading] = useState(false); + + const { + register, + handleSubmit, + formState: { errors }, + } = useForm({ + resolver: zodResolver(registroSchema), + }); + + const onSubmit = async (data: RegistroFormData) => { + setIsLoading(true); + setError(''); + + try { + await registro({ + nome: data.nome, + email: data.email, + password: data.password, + empresa_nome: data.empresa_nome, + }); + navigate('/dashboard', { replace: true }); + } catch (err: unknown) { + const error = err as { response?: { data?: { detail?: string } } }; + setError(error.response?.data?.detail || 'Erro ao criar conta'); + } finally { + setIsLoading(false); + } + }; + + return ( +
+
+ {/* Logo */} +
+ + DuoOrigin + +

+ DuoOrigin +

+

Criar nova conta

+
+ + {/* Registro Card */} +
+

Cadastro

+ +
+
+ + + {errors.nome && ( +

{errors.nome.message}

+ )} +
+ +
+ + + {errors.email && ( +

{errors.email.message}

+ )} +
+ +
+ + +
+ +
+ + + {errors.password && ( +

{errors.password.message}

+ )} +
+ +
+ + + {errors.confirmarSenha && ( +

{errors.confirmarSenha.message}

+ )} +
+ + {error && ( +
+ + {error} +
+ )} + + +
+ +
+ + Já tem conta? Fazer login + +
+
+
+
+ ); +} diff --git a/frontend/src/pages/Usuarios.tsx b/frontend/src/pages/Usuarios.tsx new file mode 100644 index 0000000..9f3e210 --- /dev/null +++ b/frontend/src/pages/Usuarios.tsx @@ -0,0 +1,391 @@ +import { useEffect, useState } from 'react'; +import { Plus, Search, Mail, Shield, Edit, Trash2 } from 'lucide-react'; +import DataTable from '@/components/DataTable'; +import Modal from '@/components/Modal'; +import { api } from '@/hooks/useApi'; +import { User as UserType } from '@/types'; +import { useForm } from 'react-hook-form'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { z } from 'zod'; + +const roleLabels = { + admin: { label: 'Admin', color: 'bg-purple-100 text-purple-700' }, + operador: { label: 'Operador', color: 'bg-blue-100 text-blue-700' }, + visualizador: { label: 'Visualizador', color: 'bg-gray-100 text-gray-700' }, +}; + +const userSchema = z.object({ + nome: z.string().min(3, 'Nome deve ter no mínimo 3 caracteres'), + email: z.string().email('Email inválido'), + role: z.enum(['admin', 'operador', 'visualizador']), + senha: z.string().min(6, 'Senha deve ter no mínimo 6 caracteres').optional(), +}); + +type UserFormData = z.infer; + +export default function Usuarios() { + const [usuarios, setUsuarios] = useState([]); + const [isLoading, setIsLoading] = useState(true); + const [searchTerm, setSearchTerm] = useState(''); + const [showModal, setShowModal] = useState(false); + const [showDeleteModal, setShowDeleteModal] = useState(false); + const [selectedUser, setSelectedUser] = useState(null); + const [isSaving, setIsSaving] = useState(false); + const [error, setError] = useState(''); + + const { + register, + handleSubmit, + reset, + formState: { errors }, + } = useForm({ + resolver: zodResolver(userSchema), + }); + + useEffect(() => { + loadUsuarios(); + }, []); + + const loadUsuarios = async () => { + try { + const response = await api.getUsuarios(); + setUsuarios(response.data); + } catch (error) { + console.error('Erro ao carregar usuários:', error); + // Mock data + setUsuarios([ + { + id: 1, + nome: 'Administrador', + email: 'admin@duorigin.com', + role: 'admin', + ativo: true, + created_at: '2024-01-01', + }, + { + id: 2, + nome: 'Operador Sistema', + email: 'operador@duorigin.com', + role: 'operador', + ativo: true, + created_at: '2024-01-15', + }, + { + id: 3, + nome: 'Visualizador', + email: 'viewer@duorigin.com', + role: 'visualizador', + ativo: true, + created_at: '2024-02-01', + }, + ]); + } finally { + setIsLoading(false); + } + }; + + const openModal = (user?: UserType) => { + if (user) { + setSelectedUser(user); + reset({ + nome: user.nome, + email: user.email, + role: user.role, + }); + } else { + setSelectedUser(null); + reset({ + nome: '', + email: '', + role: 'operador', + senha: '', + }); + } + setShowModal(true); + setError(''); + }; + + const onSubmit = async (data: UserFormData) => { + setIsSaving(true); + setError(''); + + try { + if (selectedUser) { + await api.updateUsuario(selectedUser.id, data); + } else { + await api.createUsuario(data); + } + loadUsuarios(); + setShowModal(false); + } catch (err: unknown) { + const error = err as { response?: { data?: { detail?: string } } }; + setError(error.response?.data?.detail || 'Erro ao salvar usuário'); + } finally { + setIsSaving(false); + } + }; + + const handleDelete = async () => { + if (!selectedUser) return; + try { + await api.deleteUsuario(selectedUser.id); + loadUsuarios(); + } catch (error) { + console.error('Erro ao excluir usuário:', error); + } + setShowDeleteModal(false); + setSelectedUser(null); + }; + + const filteredUsuarios = usuarios.filter( + u => + u.nome.toLowerCase().includes(searchTerm.toLowerCase()) || + u.email.toLowerCase().includes(searchTerm.toLowerCase()) + ); + + const columns = [ + { + key: 'nome', + label: 'Usuário', + render: (user: UserType) => ( +
+
+ + {user.nome.charAt(0).toUpperCase()} + +
+
+
{user.nome}
+
+ + {user.email} +
+
+
+ ), + }, + { + key: 'role', + label: 'Perfil', + render: (user: UserType) => { + const config = roleLabels[user.role]; + return ( + + + {config.label} + + ); + }, + }, + { + key: 'created_at', + label: 'Criado em', + render: (user: UserType) => ( + + {new Date(user.created_at).toLocaleDateString('pt-BR')} + + ), + }, + { + key: 'status', + label: 'Status', + render: (user: UserType) => ( + + {user.ativo ? 'Ativo' : 'Inativo'} + + ), + }, + { + key: 'acoes', + label: '', + render: (user: UserType) => ( +
+ + +
+ ), + }, + ]; + + return ( +
+ {/* Header */} +
+
+

Usuários

+

+ Gestão de usuários do sistema +

+
+ +
+ + {/* Search */} +
+
+ + setSearchTerm(e.target.value)} + className="input-field pl-10" + /> +
+
+ + {/* Table */} + user.id} + emptyMessage="Nenhum usuário encontrado" + /> + + {/* User Modal */} + setShowModal(false)} + title={selectedUser ? 'Editar Usuário' : 'Novo Usuário'} + > +
+ {error && ( +
+ {error} +
+ )} + +
+ + + {errors.nome && ( +

{errors.nome.message}

+ )} +
+ +
+ + + {errors.email && ( +

{errors.email.message}

+ )} +
+ +
+ + +
+ + {!selectedUser && ( +
+ + + {errors.senha && ( +

{errors.senha.message}

+ )} +
+ )} + +
+ + +
+
+
+ + {/* Delete Modal */} + { + setShowDeleteModal(false); + setSelectedUser(null); + }} + title="Confirmar Exclusão" + > +

+ Tem certeza que deseja excluir o usuário {selectedUser?.nome}? + Esta ação não pode ser desfeita. +

+
+ + +
+
+
+ ); +} diff --git a/frontend/src/types/index.ts b/frontend/src/types/index.ts new file mode 100644 index 0000000..65cea65 --- /dev/null +++ b/frontend/src/types/index.ts @@ -0,0 +1,99 @@ +export interface User { + id: number; + nome: string; + email: string; + role: 'admin' | 'operador' | 'visualizador'; + empresa_id?: number; + ativo: boolean; + created_at: string; +} + +export interface AuthResponse { + access_token: string; + token_type: string; + user: User; +} + +export interface Empresa { + id: number; + nome: string; + cnpj: string; + email?: string; + telefone?: string; + endereco?: string; + cidade?: string; + estado?: string; + cep?: string; + eu_operator_id?: string; + ativo: boolean; + created_at: string; + updated_at: string; +} + +export interface Propriedade { + id: number; + nome: string; + empresa_id: number; + codigo_car?: string; + area_total_ha: number; + latitude?: number; + longitude?: number; + cidade?: string; + estado?: string; + geojson?: object; + ativo: boolean; + created_at: string; + updated_at: string; + empresa?: Empresa; +} + +export interface Avaliacao { + id: number; + propriedade_id: number; + data_avaliacao: string; + status: 'pendente' | 'em_analise' | 'aprovada' | 'reprovada'; + risco_desmatamento: 'baixo' | 'medio' | 'alto' | 'critico'; + score_risco: number; + observacoes?: string; + dds_gerada: boolean; + dds_codigo?: string; + avaliador_id?: number; + created_at: string; + updated_at: string; + propriedade?: Propriedade; +} + +export interface Documento { + id: number; + nome: string; + tipo: string; + tamanho: number; + url: string; + propriedade_id?: number; + avaliacao_id?: number; + empresa_id?: number; + uploaded_by: number; + created_at: string; +} + +export interface DashboardStats { + total_empresas: number; + total_propriedades: number; + total_avaliacoes: number; + avaliacoes_aprovadas: number; + avaliacoes_pendentes: number; + dds_geradas: number; + avaliacoes_por_mes: { mes: string; total: number }[]; +} + +export interface LoginCredentials { + email: string; + password: string; +} + +export interface RegistroData { + nome: string; + email: string; + password: string; + empresa_nome?: string; +} diff --git a/frontend/tailwind.config.js b/frontend/tailwind.config.js new file mode 100644 index 0000000..a7051f3 --- /dev/null +++ b/frontend/tailwind.config.js @@ -0,0 +1,28 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: [ + "./index.html", + "./src/**/*.{js,ts,jsx,tsx}", + ], + theme: { + extend: { + colors: { + primary: { + DEFAULT: '#1A7A4C', + hover: '#15634D', + }, + navy: '#2D3142', + gray: { + custom: '#C8C9CB', + text: '#5A5D6B', + muted: '#8E9196', + bg: '#F5F6F8', + } + }, + fontFamily: { + sans: ['Inter', 'system-ui', '-apple-system', 'sans-serif'], + }, + }, + }, + plugins: [], +} diff --git a/frontend/tsconfig.app.json b/frontend/tsconfig.app.json new file mode 100644 index 0000000..a9b5a59 --- /dev/null +++ b/frontend/tsconfig.app.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2022", + "useDefineForClassFields": true, + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "types": ["vite/client"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json new file mode 100644 index 0000000..57855c4 --- /dev/null +++ b/frontend/tsconfig.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + + /* Paths */ + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + } + }, + "include": ["src"] +} diff --git a/frontend/tsconfig.node.json b/frontend/tsconfig.node.json new file mode 100644 index 0000000..8a67f62 --- /dev/null +++ b/frontend/tsconfig.node.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2023", + "lib": ["ES2023"], + "module": "ESNext", + "types": ["node"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/frontend/tsconfig.tsbuildinfo b/frontend/tsconfig.tsbuildinfo new file mode 100644 index 0000000..71c2ad4 --- /dev/null +++ b/frontend/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"root":["./src/App.tsx","./src/main.tsx","./src/api/client.ts","./src/components/DDSModal.tsx","./src/components/DashboardLayout.tsx","./src/components/DataTable.tsx","./src/components/Footer.tsx","./src/components/Modal.tsx","./src/components/Navbar.tsx","./src/components/ProtectedRoute.tsx","./src/components/Sidebar.tsx","./src/components/StatsCard.tsx","./src/contexts/AuthContext.tsx","./src/hooks/useApi.ts","./src/hooks/useAuth.ts","./src/pages/AvaliacaoDetail.tsx","./src/pages/Avaliacoes.tsx","./src/pages/Dashboard.tsx","./src/pages/Documentos.tsx","./src/pages/EmpresaForm.tsx","./src/pages/Empresas.tsx","./src/pages/Landing.tsx","./src/pages/Login.tsx","./src/pages/PropriedadeForm.tsx","./src/pages/Propriedades.tsx","./src/pages/Registro.tsx","./src/pages/Usuarios.tsx","./src/types/index.ts"],"version":"5.9.3"} \ No newline at end of file diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts new file mode 100644 index 0000000..e3e409b --- /dev/null +++ b/frontend/vite.config.ts @@ -0,0 +1,22 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import path from 'path' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], + resolve: { + alias: { + '@': path.resolve(__dirname, './src'), + }, + }, + server: { + port: 3000, + proxy: { + '/api': { + target: 'http://localhost:8100', + changeOrigin: true, + }, + }, + }, +}) diff --git a/next-env.d.ts b/next-env.d.ts new file mode 100644 index 0000000..40c3d68 --- /dev/null +++ b/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information. diff --git a/next.config.ts b/next.config.ts new file mode 100644 index 0000000..9a24a65 --- /dev/null +++ b/next.config.ts @@ -0,0 +1,12 @@ +import type { NextConfig } from 'next' + +const nextConfig: NextConfig = { + eslint: { + ignoreDuringBuilds: true + }, + typescript: { + ignoreBuildErrors: true + } +} + +export default nextConfig diff --git a/package-lock.json b/package-lock.json index 781fdc8..8ce3545 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,9 +8,19 @@ "name": "duorigin-v2", "version": "0.1.0", "dependencies": { + "@prisma/client": "^5.22.0", + "@types/bcryptjs": "^2.4.6", + "@types/leaflet": "^1.9.21", + "bcrypt": "^5.1.1", + "bcryptjs": "^3.0.3", + "jose": "^5.10.0", + "leaflet": "^1.9.4", "next": "14.2.35", + "next-auth": "^4.24.13", + "prisma": "^5.22.0", "react": "^18", - "react-dom": "^18" + "react-dom": "^18", + "react-leaflet": "^5.0.0" }, "devDependencies": { "@types/node": "^20", @@ -20,6 +30,7 @@ "eslint-config-next": "14.2.35", "postcss": "^8", "tailwindcss": "^3.4.1", + "ts-node": "^10.9.2", "typescript": "^5" } }, @@ -36,6 +47,39 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@babel/runtime": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "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==", + "dev": 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", @@ -257,6 +301,26 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "license": "BSD-3-Clause", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, "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", @@ -478,6 +542,15 @@ "node": ">=12.4.0" } }, + "node_modules/@panva/hkdf": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.2.1.tgz", + "integrity": "sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -489,6 +562,80 @@ "node": ">=14" } }, + "node_modules/@prisma/client": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.22.0.tgz", + "integrity": "sha512-M0SVXfyHnQREBKxCgyo7sffrKttwE6R8PMq330MIUF0pTwjUhLbW84pFDlf06B27XyCR++VtjugEnIHdr07SVA==", + "hasInstallScript": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.13" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/debug": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.22.0.tgz", + "integrity": "sha512-AUt44v3YJeggO2ZU5BkXI7M4hu9BF2zzH2iF2V5pyXT/lRTyWiElZ7It+bRH1EshoMRxHgpYg4VB6rCM+mG5jQ==", + "license": "Apache-2.0" + }, + "node_modules/@prisma/engines": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.22.0.tgz", + "integrity": "sha512-UNjfslWhAt06kVL3CjkuYpHAWSO6L4kDCVPegV6itt7nD1kSJavd3vhgAEhjglLJJKEdJ7oIqDJ+yHk6qO8gPA==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "5.22.0", + "@prisma/engines-version": "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2", + "@prisma/fetch-engine": "5.22.0", + "@prisma/get-platform": "5.22.0" + } + }, + "node_modules/@prisma/engines-version": { + "version": "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2.tgz", + "integrity": "sha512-2PTmxFR2yHW/eB3uqWtcgRcgAbG1rwG9ZriSvQw+nnb7c4uCr3RAcGMb6/zfE88SKlC1Nj2ziUvc96Z379mHgQ==", + "license": "Apache-2.0" + }, + "node_modules/@prisma/fetch-engine": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.22.0.tgz", + "integrity": "sha512-bkrD/Mc2fSvkQBV5EpoFcZ87AvOgDxbG99488a5cexp5Ccny+UM6MAe/UFkUC0wLYD9+9befNOqGiIJhhq+HbA==", + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "5.22.0", + "@prisma/engines-version": "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2", + "@prisma/get-platform": "5.22.0" + } + }, + "node_modules/@prisma/get-platform": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.22.0.tgz", + "integrity": "sha512-pHhpQdr1UPFpt+zFfnPazhulaZYCUqeIcPpJViYoq9R+D/yw4fjE+CtnsnKzPYm0ddUbeXUzjGVGIRVgPDCk4Q==", + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "5.22.0" + } + }, + "node_modules/@react-leaflet/core": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@react-leaflet/core/-/core-3.0.0.tgz", + "integrity": "sha512-3EWmekh4Nz+pGcr+xjf0KNyYfC3U2JjnkWsh0zcqaexYqmmB5ZhH37kz41JXGmKzpaMZCnPofBBm64i+YrEvGQ==", + "license": "Hippocratic-2.1", + "peerDependencies": { + "leaflet": "^1.9.0", + "react": "^19.0.0", + "react-dom": "^19.0.0" + } + }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", @@ -519,6 +666,34 @@ "tslib": "^2.4.0" } }, + "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==", + "dev": 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==", + "dev": 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==", + "dev": 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==", + "dev": 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", @@ -530,6 +705,18 @@ "tslib": "^2.4.0" } }, + "node_modules/@types/bcryptjs": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.6.tgz", + "integrity": "sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==", + "license": "MIT" + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -537,6 +724,15 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/leaflet": { + "version": "1.9.21", + "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.21.tgz", + "integrity": "sha512-TbAd9DaPGSnzp6QvtYngntMZgcRk+igFELwR2N99XZn7RXUdKgsXMR+28bUO0rPsWp8MIu/f47luLIQuSLYv/w==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, "node_modules/@types/node": { "version": "20.19.33", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.33.tgz", @@ -1120,6 +1316,12 @@ "win32" ] }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "license": "ISC" + }, "node_modules/acorn": { "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", @@ -1143,6 +1345,31 @@ "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -1164,7 +1391,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -1207,6 +1433,26 @@ "node": ">= 8" } }, + "node_modules/aproba": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", + "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==", + "license": "ISC" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -1448,9 +1694,31 @@ "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/bcrypt": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", + "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.11", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "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/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -1468,7 +1736,6 @@ "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", @@ -1644,6 +1911,15 @@ "node": ">= 6" } }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", @@ -1670,6 +1946,15 @@ "dev": true, "license": "MIT" }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, "node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -1684,6 +1969,27 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "license": "ISC" + }, + "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/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true, "license": "MIT" }, @@ -1787,7 +2093,6 @@ "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" @@ -1844,6 +2149,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "license": "MIT" + }, + "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/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -1851,6 +2171,16 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/diff": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", @@ -2697,18 +3027,40 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, "license": "ISC" }, "node_modules/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, @@ -2760,6 +3112,53 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gauge/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/gauge/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==", + "license": "ISC" + }, + "node_modules/gauge/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/generator-function": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", @@ -3043,6 +3442,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "license": "ISC" + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -3056,6 +3461,19 @@ "node": ">= 0.4" } }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -3098,7 +3516,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", @@ -3109,7 +3526,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, "license": "ISC" }, "node_modules/internal-slot": { @@ -3315,7 +3731,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -3623,6 +4038,15 @@ "jiti": "bin/jiti.js" } }, + "node_modules/jose": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz", + "integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -3722,6 +4146,12 @@ "node": ">=0.10" } }, + "node_modules/leaflet": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", + "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==", + "license": "BSD-2-Clause" + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -3798,6 +4228,37 @@ "dev": true, "license": "ISC" }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -3836,7 +4297,6 @@ "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" @@ -3865,11 +4325,47 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, "license": "MIT" }, "node_modules/mz": { @@ -3975,6 +4471,47 @@ } } }, + "node_modules/next-auth": { + "version": "4.24.13", + "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-4.24.13.tgz", + "integrity": "sha512-sgObCfcfL7BzIK76SS5TnQtc3yo2Oifp/yIpfv6fMfeBOiBJkDWF3A2y9+yqnmJ4JKc2C+nMjSjmgDeTwgN1rQ==", + "license": "ISC", + "dependencies": { + "@babel/runtime": "^7.20.13", + "@panva/hkdf": "^1.0.2", + "cookie": "^0.7.0", + "jose": "^4.15.5", + "oauth": "^0.9.15", + "openid-client": "^5.4.0", + "preact": "^10.6.3", + "preact-render-to-string": "^5.1.19", + "uuid": "^8.3.2" + }, + "peerDependencies": { + "@auth/core": "0.34.3", + "next": "^12.2.5 || ^13 || ^14 || ^15 || ^16", + "nodemailer": "^7.0.7", + "react": "^17.0.2 || ^18 || ^19", + "react-dom": "^17.0.2 || ^18 || ^19" + }, + "peerDependenciesMeta": { + "@auth/core": { + "optional": true + }, + "nodemailer": { + "optional": true + } + } + }, + "node_modules/next-auth/node_modules/jose": { + "version": "4.15.9", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", + "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/next/node_modules/postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", @@ -4003,6 +4540,47 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -4013,11 +4591,29 @@ "node": ">=0.10.0" } }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/oauth": { + "version": "0.9.15", + "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", + "integrity": "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==", + "license": "MIT" + }, "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==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -4146,16 +4742,69 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/oidc-token-hash": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.2.0.tgz", + "integrity": "sha512-6gj2m8cJZ+iSW8bm0FXdGF0YhIQbKrfP4yWTNzxc31U6MOjfEmB1rHvlYvxI1B7t7BCi1F2vYTT6YhtQRG4hxw==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || >=12.0.0" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "license": "ISC", "dependencies": { "wrappy": "1" } }, + "node_modules/openid-client": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.7.1.tgz", + "integrity": "sha512-jDBPgSVfTnkIh71Hg9pRvtJc6wTwqjRkN88+gCFtYWrlP4Yx2Dsrow8uPi3qLr/aeymPF3o2+dS+wOpglK04ew==", + "license": "MIT", + "dependencies": { + "jose": "^4.15.9", + "lru-cache": "^6.0.0", + "object-hash": "^2.2.0", + "oidc-token-hash": "^5.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/openid-client/node_modules/jose": { + "version": "4.15.9", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", + "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/openid-client/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/openid-client/node_modules/object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -4251,7 +4900,6 @@ "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" @@ -4503,6 +5151,28 @@ "dev": true, "license": "MIT" }, + "node_modules/preact": { + "version": "10.28.3", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.3.tgz", + "integrity": "sha512-tCmoRkPQLpBeWzpmbhryairGnhW9tKV6c6gr/w+RhoRoKEJwsjzipwp//1oCpGPOchvSLaAPlpcJi9MwMmoPyA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/preact-render-to-string": { + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.6.tgz", + "integrity": "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==", + "license": "MIT", + "dependencies": { + "pretty-format": "^3.8.0" + }, + "peerDependencies": { + "preact": ">=10" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -4513,6 +5183,31 @@ "node": ">= 0.8.0" } }, + "node_modules/pretty-format": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz", + "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==", + "license": "MIT" + }, + "node_modules/prisma": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.22.0.tgz", + "integrity": "sha512-vtpjW3XuYCSnMsNVBjLMNkTj6OZbudcPPTPYHqX0CJfpcdWciI1dM8uHETwmDxxiqEwCIE6WvXucWUetJgfu/A==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/engines": "5.22.0" + }, + "bin": { + "prisma": "build/index.js" + }, + "engines": { + "node": ">=16.13" + }, + "optionalDependencies": { + "fsevents": "2.3.3" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -4588,6 +5283,20 @@ "dev": true, "license": "MIT" }, + "node_modules/react-leaflet": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/react-leaflet/-/react-leaflet-5.0.0.tgz", + "integrity": "sha512-CWbTpr5vcHw5bt9i4zSlPEVQdTVcML390TjeDG0cK59z1ylexpqC6M1PJFjV8jD7CF+ACBFsLIDs6DRMoLEofw==", + "license": "Hippocratic-2.1", + "dependencies": { + "@react-leaflet/core": "^3.0.0" + }, + "peerDependencies": { + "leaflet": "^1.9.0", + "react": "^19.0.0", + "react-dom": "^19.0.0" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -4598,6 +5307,20 @@ "pify": "^2.3.0" } }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -4712,7 +5435,6 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, "license": "ISC", "dependencies": { "glob": "^7.1.3" @@ -4729,7 +5451,6 @@ "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", @@ -4790,6 +5511,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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/safe-push-apply": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", @@ -4838,7 +5579,6 @@ "version": "7.7.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -4847,6 +5587,12 @@ "node": ">=10" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC" + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -5046,6 +5792,15 @@ "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-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -5233,7 +5988,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -5389,6 +6143,33 @@ "node": ">=14.0.0" } }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "license": "ISC", + "engines": { + "node": ">=8" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -5480,6 +6261,12 @@ "node": ">=8.0" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, "node_modules/ts-api-utils": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", @@ -5500,6 +6287,57 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "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/ts-node/node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -5712,9 +6550,40 @@ "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/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true, "license": "MIT" }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -5820,6 +6689,35 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wide-align/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/wide-align/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/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -5935,9 +6833,24 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, "license": "ISC" }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": 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", diff --git a/package.json b/package.json index 4a1f393..cbf8acf 100644 --- a/package.json +++ b/package.json @@ -6,21 +6,40 @@ "dev": "next dev", "build": "next build", "start": "next start", - "lint": "next lint" + "lint": "next lint", + "db:generate": "prisma generate", + "db:push": "prisma db push", + "db:migrate": "prisma migrate dev", + "db:seed": "prisma db seed", + "db:studio": "prisma studio" + }, + "prisma": { + "seed": "npx ts-node --compiler-options {\"module\":\"CommonJS\"} prisma/seed.ts" }, "dependencies": { + "@prisma/client": "^5.22.0", + "@types/bcryptjs": "^2.4.6", + "@types/leaflet": "^1.9.21", + "bcrypt": "^5.1.1", + "bcryptjs": "^3.0.3", + "jose": "^5.10.0", + "leaflet": "^1.9.4", + "next": "14.2.35", + "next-auth": "^4.24.13", + "prisma": "^5.22.0", "react": "^18", "react-dom": "^18", - "next": "14.2.35" + "react-leaflet": "^5.0.0" }, "devDependencies": { - "typescript": "^5", "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", + "eslint": "^8", + "eslint-config-next": "14.2.35", "postcss": "^8", "tailwindcss": "^3.4.1", - "eslint": "^8", - "eslint-config-next": "14.2.35" + "ts-node": "^10.9.2", + "typescript": "^5" } } diff --git a/prisma/README.md b/prisma/README.md new file mode 100644 index 0000000..eaa0fc8 --- /dev/null +++ b/prisma/README.md @@ -0,0 +1,192 @@ +# DuOrigin v2 - Prisma Database Layer + +Este diretório contém o schema Prisma e scripts de seed para o DuOrigin v2. + +## 📁 Estrutura + +``` +prisma/ +├── schema.prisma # Schema do banco de dados +├── seed.ts # Script de seed com dados demo +└── README.md # Esta documentação +``` + +## 🗄️ Modelos de Dados + +| Modelo | Descrição | Tabela | +|--------|-----------|--------| +| `User` | Usuários do sistema (autenticação) | `users` | +| `Company` | Empresas/operadores EUDR | `companies` | +| `Producer` | Produtores rurais | `producers` | +| `Area` | Propriedades/glebas com geolocalização | `areas` | +| `Product` | Commodities EUDR (soja, café, etc.) | `products` | +| `Lot` | Lotes de produto para rastreabilidade | `lots` | +| `DdsStatement` | Declarações de Due Diligence | `dds_statements` | +| `AuditLog` | Trilha de auditoria | `audit_logs` | + +## 🔗 Relacionamentos + +``` +Company + └── Producer (1:N) + ├── Area (1:N) + │ └── Lot (1:N) + └── Lot (1:N) + +Product + └── Lot (1:N) + +Company + └── DdsStatement (1:N) + └── lot_ids (JSON array) + +User + └── AuditLog (1:N) +``` + +## 🚀 Setup + +### 1. Configurar Variável de Ambiente + +Crie ou edite `.env` na raiz do projeto: + +```env +# Via túnel SSH (recomendado para dev local) +DATABASE_URL="postgresql://duorigin:DuOrigin2026!@localhost:5433/duorigin" + +# Conexão direta (se PostgreSQL aceitar conexões externas) +# DATABASE_URL="postgresql://duorigin:DuOrigin2026!@198.199.84.130:5432/duorigin" +``` + +### 1.1 Criar Túnel SSH (se necessário) + +Se o PostgreSQL não aceita conexões externas, crie um túnel SSH: + +```bash +# Criar túnel (porta local 5433 -> servidor 5432) +ssh -i ~/.ssh/digitalocean_jarvis -L 5433:localhost:5432 -fN root@198.199.84.130 + +# Verificar se túnel está ativo +ss -tlnp | grep 5433 + +# Matar túnel quando terminar +pkill -f "ssh.*5433.*5432" +``` + +### 2. Gerar Prisma Client + +```bash +npx prisma generate +``` + +### 3. Aplicar Schema (se banco novo) + +```bash +# Criar migration inicial +npx prisma migrate dev --name init + +# Ou sincronizar sem migration (dev) +npx prisma db push +``` + +### 4. Popular com Dados Demo + +```bash +npx prisma db seed +``` + +## 📊 Dados de Demonstração + +O seed cria os seguintes dados: + +### Usuários +| Email | Senha | Role | +|-------|-------|------| +| demo@duorigin.com | DuoDemo2026 | admin | +| operador@duorigin.com | DuoDemo2026 | operator | + +### Empresas (3) +- AgroCerrado Exportações Ltda (GO) +- Fazendas Unidas do Brasil S.A. (MT) +- Cooperativa Agrícola Planalto Central (MG) + +### Produtores (5) +Produtores rurais vinculados às empresas, com CAR válido. + +### Áreas (5) +Propriedades rurais no Cerrado com coordenadas reais: +- 3 áreas com risco baixo (sem desmatamento) +- 1 área com risco médio (alerta) +- 1 área com risco alto (desmatamento confirmado) + +### Lotes (10) +Lotes de soja e café em diferentes status: +- 4 aprovados +- 2 em revisão +- 2 rejeitados +- 2 pendentes + +### Declarações DDS (5) +Due Diligence Statements em vários status: +- 2 aprovadas (com EU reference) +- 1 submetida (aguardando) +- 1 rejeitada +- 1 rascunho + +## 🛠️ Comandos Úteis + +```bash +# Abrir Prisma Studio (GUI) +npx prisma studio + +# Resetar banco e re-seed +npx prisma migrate reset + +# Verificar schema +npx prisma validate + +# Formatar schema +npx prisma format + +# Gerar diagrama ERD +npx prisma-erd-generator +``` + +## 📦 Uso no Código + +```typescript +import { prisma } from '@/lib/prisma'; + +// Buscar todos os lotes com risco alto +const highRiskLots = await prisma.lot.findMany({ + where: { risk_score: { gte: 70 } }, + include: { + area: true, + producer: true, + product: true, + }, +}); + +// Buscar empresa com produtores e áreas +const company = await prisma.company.findUnique({ + where: { id: 1 }, + include: { + producers: { + include: { areas: true }, + }, + }, +}); +``` + +## 🔒 Segurança + +- Nunca commitar `.env` com credenciais reais +- Em produção, usar SSL: `?sslmode=require` +- Sempre usar prepared statements (Prisma faz isso automaticamente) + +## 📝 Notas + +- O campo `lot_ids` em `DdsStatement` é um JSON array de IDs +- O campo `geojson` em `Area` armazena polígonos GeoJSON +- Timestamps são `DateTime?` para compatibilidade com banco existente +- Passwords são hasheados com bcrypt (salt rounds: 10) diff --git a/prisma/schema.prisma b/prisma/schema.prisma new file mode 100644 index 0000000..09b6103 --- /dev/null +++ b/prisma/schema.prisma @@ -0,0 +1,195 @@ +// DuOrigin v2 - Prisma Schema +// EUDR Compliance Platform for Brazilian Agribusiness +// Generated from production PostgreSQL database (jarvis-do) + +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +// ============================================ +// Users & Authentication +// ============================================ + +model User { + id Int @id @default(autoincrement()) + email String @unique + hashed_password String + full_name String? + role String? @default("operator") // admin, operator, viewer + is_active Boolean? @default(true) + created_at DateTime? @default(now()) + + // Relations + auditLogs AuditLog[] + + @@index([id]) + @@map("users") +} + +// ============================================ +// Companies (Empresas) +// ============================================ + +model Company { + id Int @id @default(autoincrement()) + name String + cnpj String? @unique + country String? @default("BR") + state String? + city String? + eu_operator_id String? // EU Operator ID for EUDR + created_at DateTime? @default(now()) + + // Relations + producers Producer[] + ddsStatements DdsStatement[] + + @@index([id]) + @@index([cnpj]) + @@map("companies") +} + +// ============================================ +// Producers (Produtores Rurais) +// ============================================ + +model Producer { + id Int @id @default(autoincrement()) + name String + cpf_cnpj String? @unique + company_id Int? + state String? + city String? + car_code String? // CAR - Cadastro Ambiental Rural + created_at DateTime? @default(now()) + + // Relations + company Company? @relation(fields: [company_id], references: [id]) + areas Area[] + lots Lot[] + + @@index([id]) + @@index([cpf_cnpj]) + @@map("producers") +} + +// ============================================ +// Areas (Propriedades Rurais / Glebas) +// ============================================ + +model Area { + id Int @id @default(autoincrement()) + name String + producer_id Int? + geojson String? @db.Text // GeoJSON polygon + area_ha Float? // Area in hectares + biome String? // Cerrado, Amazônia, Mata Atlântica, etc. + risk_level String? // low, medium, high, critical + deforestation_flag String? // none, alert, confirmed + lat_center Float? // Latitude center point + lon_center Float? // Longitude center point + created_at DateTime? @default(now()) + + // Relations + producer Producer? @relation(fields: [producer_id], references: [id]) + lots Lot[] + + @@index([id]) + @@map("areas") +} + +// ============================================ +// Products (Commodities EUDR) +// ============================================ + +model Product { + id Int @id @default(autoincrement()) + name String + hs_code String? // Harmonized System code + eudr_category String? // cattle, cocoa, coffee, oil palm, rubber, soya, wood + description String? + created_at DateTime? @default(now()) + + // Relations + lots Lot[] + + @@index([id]) + @@map("products") +} + +// ============================================ +// Lots (Lotes de Produto) +// ============================================ + +model Lot { + id Int @id @default(autoincrement()) + reference String @unique + product_id Int? + area_id Int? + producer_id Int? + quantity_kg Float? + harvest_date String? + risk_score Float? // 0-100 risk score + status String? @default("pending") // pending, approved, rejected, review + created_at DateTime? @default(now()) + + // Relations + product Product? @relation(fields: [product_id], references: [id]) + area Area? @relation(fields: [area_id], references: [id]) + producer Producer? @relation(fields: [producer_id], references: [id]) + + @@index([id]) + @@index([reference]) + @@map("lots") +} + +// ============================================ +// DDS Statements (Due Diligence Statements) +// ============================================ + +model DdsStatement { + id Int @id @default(autoincrement()) + reference_number String @unique + company_id Int? + status String? @default("draft") // draft, submitted, approved, rejected + risk_assessment String? // low, medium, high + lot_ids String? @db.Text // JSON array of lot IDs + submission_date String? + eu_reference String? // EU system reference after submission + notes String? @db.Text + created_at DateTime? @default(now()) + updated_at DateTime? @updatedAt + + // Relations + company Company? @relation(fields: [company_id], references: [id]) + + @@index([id]) + @@index([reference_number]) + @@map("dds_statements") +} + +// ============================================ +// Audit Logs (Trilha de Auditoria) +// ============================================ + +model AuditLog { + id Int @id @default(autoincrement()) + entity_type String // User, Company, Producer, Area, Lot, DdsStatement + entity_id Int? + action String // create, update, delete, login, export + user_id Int? + details String? @db.Text // JSON with additional details + ip_address String? + created_at DateTime? @default(now()) + + // Relations + user User? @relation(fields: [user_id], references: [id]) + + @@index([id]) + @@map("audit_logs") +} diff --git a/prisma/seed.ts b/prisma/seed.ts new file mode 100644 index 0000000..a714294 --- /dev/null +++ b/prisma/seed.ts @@ -0,0 +1,104 @@ +import { PrismaClient } from '@prisma/client' +import bcrypt from 'bcryptjs' + +const prisma = new PrismaClient() + +async function main() { + console.log('🌱 Seeding database...') + + // Create admin user + const adminPassword = await bcrypt.hash('admin123', 10) + const admin = await prisma.user.upsert({ + where: { email: 'admin@duorigin.com' }, + update: {}, + create: { + email: 'admin@duorigin.com', + hashedPassword: adminPassword, + fullName: 'Administrador', + role: 'admin', + isActive: true, + }, + }) + console.log('✅ Admin user created:', admin.email) + + // Create operator user + const operatorPassword = await bcrypt.hash('operator123', 10) + const operator = await prisma.user.upsert({ + where: { email: 'operador@duorigin.com' }, + update: {}, + create: { + email: 'operador@duorigin.com', + hashedPassword: operatorPassword, + fullName: 'Operador Teste', + role: 'operator', + isActive: true, + }, + }) + console.log('✅ Operator user created:', operator.email) + + // Create sample company + const company = await prisma.company.upsert({ + where: { cnpj: '12345678000190' }, + update: {}, + create: { + name: 'Fazenda Modelo LTDA', + cnpj: '12345678000190', + country: 'BR', + state: 'MT', + city: 'Cuiabá', + euOperatorId: 'EU-OP-BR-001', + }, + }) + console.log('✅ Company created:', company.name) + + // Create sample propriedade + const propriedade = await prisma.propriedade.upsert({ + where: { cpfCnpj: '11122233344' }, + update: {}, + create: { + name: 'Fazenda Santa Clara', + cpfCnpj: '11122233344', + companyId: company.id, + state: 'MT', + city: 'Sorriso', + carCode: 'MT-5107008-001', + }, + }) + console.log('✅ Propriedade created:', propriedade.name) + + // Create sample avaliacao + const avaliacao = await prisma.avaliacao.create({ + data: { + name: 'Área de Soja - Talhão 1', + propriedadeId: propriedade.id, + areaHa: 150.5, + biome: 'Cerrado', + riskLevel: 'low', + deforestationFlag: 'clean', + latCenter: -12.5489, + lonCenter: -55.7189, + geojson: JSON.stringify({ + type: 'Polygon', + coordinates: [[ + [-55.72, -12.54], + [-55.71, -12.54], + [-55.71, -12.55], + [-55.72, -12.55], + [-55.72, -12.54], + ]], + }), + }, + }) + console.log('✅ Avaliacao created:', avaliacao.name) + + console.log('🎉 Seed completed!') +} + +main() + .catch((e) => { + console.error('❌ Seed error:', e) + process.exit(1) + }) + .finally(async () => { + await prisma.$disconnect() + }) diff --git a/public/logo-duorigin.jpg b/public/logo-duorigin.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cee0a5eaa6105d8065b15ba1f3a2739af3d897cc GIT binary patch literal 33526 zcmb4qWmp|ev*6(F?k+)s1c%@f+%34fyAv$9OMu`KEV#Q{aCdiimpysk{r27;clUX= z=1fmbcXd~FS9P_Wd0%+n08pjGCB*?SFfiZ?=mOriz!oG$MD!GtzqHeg|0Bi!I}*;=#K{Om zasj$29YM@NGGT&nOtXJ++P}Erzc}At+|AkE8APM-7k5-q5&_}HAe`3hzu|`e4L7oP z{7WARqT#c#cKOTeFZ`_?qKU1lGUy2lx(NX%Knailg#Xqb^bP{MTmay@1ptWH|B5qA z1%QTN0Ki@PuQfco+Oiu3P=LBfD!N!gs}q501LqJz6^)}kPr}me~=K6P>_&N z(C{$OAV7kHhlNK$LPbSELP18uz{NyE$3aI%!6L-M!NVgUAV9?=A|b*j!Nn)Q|62$c zBoq`h6f`0X3?e=n3L5_ZH@tTPXt3ZA;BydQ|hN#^kGtL z_#`0!&HQgZ1^`uq7C@te2Ot>$MI{Do_;32zP++vl3ILg~3P{~wh5bbVZ2y0FfQtC5 zbKzk)NkMeYFI8fK=-mMfs!0G8xFS^|I0LpqA}EneQV>!J>aQ_^nNUGy13)+_0LFkx z1pv}efFOBir3SVFCLmf_C9I?n3?~GYND5v6i-3S-0sx6n|L_6OdjU+4Xh0$ufC^xu zf+wQFR;qwX2iN?9rC%usCWx7=0wTq>Eaj+?wl%ubGz_W)<&;8?2gSk(0^pdzUjPL` zAR84*Q&12VOd0`H7yxLB<|<%@^An5R-u+ye@e;XjVVKctYww%RLYiUASk+4aAAdSa z)-JcysZC^1#JN&emm8u5{6SSoL{-W5C#3}x#L$Ohv*8T%OaB$LQY9OK_K4S;V_d*k zL)~D>v*EUM#da*M;lf65uH-pg`M#JdWH&9(RC;8V_p3N#(uG6ICrYM21m~AqzV86! z^Zk!?Pp83pkl0iK{-m%#Hhi2QLoRwyHk#-MaR0wd5NH8-IB~3nog`|ei322g9VhRu zI;2$gU*tL=N6%b`E~Y2Ag_^~mcm{9ZdLH*)Z6nuQ9jZ=JvQwfSpL`ioVdU4d^t1n# zM6N*P4<0`ZDh?i10T6@-0Q78H08A+$a4)UF$Ron=c>gTi=s-Wy;|>MGN#ZQC=axxx zZl|6dW#8_`Gh<*J`n2GTt$pOkdVxg7t!ngfySYO5x#rV<;+kD7m7 z4*;7)3$Boi1tkT*gKN-&1O6ax0pRiev48olt%gPSM0uux;kjom$tetlo_^t6~SCN(V>XOy(#p5gC6L@p+ z_DU0eqU$GGL%cyEuvAt4QLj_RZFgCJ**Yc~=3>pom9deVf5gJ~-qb!SCgrw6FJnH9 zN)VhD5)i}^1!Dl90C?D3T1YV3U{VDj96c6LfTBWhY3I7O846wpnNuHq zHCq%=8q1~%P!)9XbzjZYzQ25ZV|*fP$@=1<=i}~qQvSW+kl)Sfu_GZN*02d|3|s*q zMH5vZ`vU5f{@DuPfD|gI&%uLy7P!AgA`y&M%u)L0;sS|H=}o2PR?r@IB{A$ znbsn~nIpJ*5~-Sf79bH0o4zb>@niDxaBU@tIJ{gVP#@qAeq3!XllRr<$lEH?`a|Y|gT@;M1So%yx4`s=f`tmLtoHxQ6J#&g zT}9Q_%MkN1A12+;^*Yk8hpv34d2c!xcok%KKBE}5x$Jh;XKChMA1^=7$A5-ia|qmr zJHLwAp3RC;V{Sda9=Nj8G;6MLO&~bGwYFYU$OZ$*l>ABkbMrO+_GEB{>d=4G3NqWj zO-w~yJncoV>++EGdvV#g>GqXP9R{UcuU~U;{qBX?wnIrSdf@orv;F2Sk3>vNOgugVkxYK5xnRDCXZW5*EN#@rQy0nPyP7G{~t!0Z{$`0?4rd z2v}@mE^$6~DBm+4asA{|Zbv=G#Yx)qmdso4UR+mDL~gF`R-z@QV^%NskG&mu#yXPf z-vRBqU#zWb46nYP4=#Tl^N7l1n z6~id~B(;Ut(}g&(clJe!UqE93DY-v-CuFVy@J(OyOE&CZ(f$I17-WGIpbBah04kA+ z3ILM+#*&8u=$!y)kjVx_F;x=(Rtf~z3aEerCOE#QQ-LRk;4JfPxqm2MPQ9(42 z;Q!Pa)Z|c9KpT@&5yP;6uJx01X6(sJ)5GVOr>pxM7O%;0%)jm%vIm2ia&Ft-eNLx-?&>T-_)0ZJ& zzal##43x8_HSk>4vS{PY61b?nqd6ZVj@a9Lly^DEjK24~tdZebh_)TQlHjy8k6yfk zQJuUYtguV+_|&}YX6mbZ!>?m1ztbV2S;-}k#r&sWW~9K&eeZ7_&io69 z)CFs4bn9A97v9^UVtsr=t!#eU=P}VDQCo*ZRmHD1O&6QSKlbT&*F`<%CqEMr$FJb0 z$V={KAxmJ#&#VPq?^_&2GO>3(t`Z#!Pu8%0DveUB^i>uofB`hLb~-ji+39IjmO%kJ=?A8~N` zyy~fsYX8Bx&Lhq|!Os&XiUEfTMo)tA%-}*>yztV%NlmHlkpS#IZ*3SeG?tHfOsSA@h&QilIz zDzGkb`0(p^`=*flV%WxkTU4C{udJzmV5ERSB(MC^|7v6;nAA|y9K?i75I`RWJ;8oI zlKlQ=N;9+TF4Mt3jXPphzHw#k!s{o02BC4kIYsEjk=(lQbxS9%+$%Hjtg_utRVP_* z?kX>D|He<6BWu6-ba$SBLi-+CsNz|U?0LI|f_Tq0^|MhM40V>>IzpxV^z~F$yS#kj zymG?ZllS^K(_ueP^gDntV*Q7`f1tNu`p7Og?7d z2hG5lE)2yPzkoZ9<`P`@K1$LPO4jiWPjo2*3H=QTQx>H|ho8aq>ty$yV)yP_fa2xT zWY?|_%>MNa&GzLT)Bg9dz~C{O(PvQ4135HO&;!g68yhO|pP}gAndRSk{uSuIw{EMC{! z;4R;|U-zj6n#fIK<-Y?8PH8I*GZ}ohPY%fOT+5igs-lkKuoHhO1r6Ar7S#sLQdKc1 z8Cl7zuy78N%{Uq<7{d9#(l;Fs2^*-KqV8J;@@nHPZH!IBZ+$M^T^g(*mi6toV&)ot z`yG=sWoU059YdDz+iarVfmlaMf4i}GIj`?eXXVy`{l5QZ??m=Ec;}B(9`mY+6PHHf zt~Vs5lS{!&EjR@j>=_lQFu9DDAqz{L8PVy6Bavnb)g2D|V zj>p8v@`!ZJnuIb|A+N=zeZSt+QIx^Z@=qhWM|BU0s{urHSveU1Fk*9|JCMNc_H-6zOOR#`*_y~E^!DACj zG4kYD3dtnfZ7z?)LpM7pPiaD6!@+=IgKq6#Bx!fY5d&)0_TG*M4-h?X^)#jfvIXfd z^@RNc_6!*wGoV@dDsV$f4&i8M>?93QR|C(i_kl{7P-p>3{|{=qAyHwYj?x8qekqN@ z^gUON#9ZBFGyBFM5w!$~+WOe?iCl4IK!5#dh$Y0IkZByfKzu>Fisf0XcsMJl!HhP41hbAHfvUfqm7;xS%Zok3C)qBXwm-bbA=GWw z#({{uAx(-{l!+L!jmO8*y;{_Tor3u0@dDC$OJSqNbWlm7T6=v%v{utGVK(l_|-?FO%ag77e{;UYb1E z(RPW;@0^K$$wX-?r(;bYW|w^!fVg4&$sJSsYo4@1q>QvYeA$q?&#@#iLPAX`N@H2N zsuaC{C!L19Jm zXAbHyq}^Hw3Uyu9tMws}n#%J+hvd@et?pEO$tzfps;+w?UbN$i-j5S~+{vFyqn4&8 zjlMVb_>*{3^K}rF`5V&NV4!h4kAy$w+$WVOA&qf{cn)gKERJCldzN{GAi-{fqTG-S z-|x*0kDK3Pn~G_3OC#fr&Gb=28^&dyG#b~)6K)Tr77 ziO>_rf5IA^5ikW9bg!34v{a$AxfF>KecYE3=zbV; zQZZ5zvKS&S3p1bMY_6KC;RpGns#ot)nH4FS!zU=pvA0I+45dE}#$m9B+va`_8MOk7 z_b~CT@w^LE zSF?Sjcht4C6;5;~-Q5u#T4~m;Diaol4;}eqJhD3>VvKaTVVE4M^iBF_Uj)e)Tw;-8 z7|hV0u^SVYpci*$J^;3Kpij<&ze0!an?D!YJFp=eoIM+LX=3VLUc;xV8LK-VU)1^z zOpz9e8W6;yme`406WCT{7$qfq8a20^58MuOj31rL^*Fc1&SWAS3XoqCe=)s3q=~P7 zX`Y{560sDxKex*(imch^m)U8hKMgC3&t0Q;=WD?rq7pEqVaHv^GRty_xG}htN8F)1?M#Ed07vfwZQkx7e&K)Cn100k){p$DnF3e!#%= zvk{-3R>A@@?Zs)%m?Wh*1M!E_&d8t#<~%ZF?gqghd1rz$Th`w(^{~};FxW!n`0Ock zk}D{@j7_47Zf#`in}&5lJ9}SesEc@+VFWIo=L?ebhTvc|8Ovdi%{)m1eM2#DVo>ASy6!o)X{|`eUCE#Z)y%J{?<9BCBkuvtzLR>i;F`> zjGV*PAI7rS-huCI_27(2Kj(~DqT}>5v~5K8%r#{%wHhirKSy7lF16vHDq<@SvQ-)S zrj~qd-Sk6h^R!6vBkHkKkxbG?J zsHwkR_%HenyW8M$93`=BKd~ff%3peQRCRt%K0i%;YIJ^s)_rMDzv>8CYvY43Dfg#Z zw!&a=lS`nCo9fUmc8Lr9nc!wdL7JqW);{9}3mP5)UGHo0(H~SCrR-55)FSiZ#Z}hK zo&1)9v`Kx@Qv;RAQdgxXre)+EmazT5W6hTtTNRgtSaH~~w8}=U6r?sg&~h*NEZvcAjbZi8d@QE4n)&2jF10k(tN@PKX+333%;eDWbKU1m`u`I;Yr3=>`~Sp%8y zqU9hD=Vaj~ETNYcv9$Lwn*a*sYtWbQ@c6#7EN#zEkhoF7b9pj|i}gS>A?cz5vw^(p z9KRXlZFQAa)79BkXqH?p z7Y-;>gV4o3tB|p}AB=gwQ0X2n)Ei2Tv;IkP>E&Xp%+a{;qhA`8OHYp$+bCLU z_p#Ut3x!fKIhC$|v==r>BPQrUT}AB}C^xo%_bh)dZ-Hrcx^YiNeReh^LkbrG%XoRWW86$O!dK6YX#2 zO2vT^)jpf#G5=X@K$>9`6~~#qmcFp~DVYT4=E#1jP9`jlMyT!M@3s#x;npXYW@>Bc zKNj)Bh6pK99BCNbjfQtD*|{Vz$i-eAAifdqv7d^H=Zeqx3ANFP4>T#~N20@KWJLOA z2^AIfH@pJ~9iVkE9U1@z0S*lgKtueyI0o&#gF!%|p`w$KvnXJYQm_i?8`v}ZfBR?o z3p(`^0DHZ82W(gMN~7JJYBsHH0yp+*oFx=C)T;4%Z)EZGUX@f3J!wn4gRQ&-aASy& zL^YRA(p~3uh4mX|vD3AZWRb;3-dgFahpTVIxF8nilfidcz+{5J8tsg{!JfF0`x>3q z0_3}Slx!qa1}M$x5srdt*k6$ z3P<4)d=9>w-xw@S&BaAmHpEzr9A+chbZN;XA#||b1rIVKqo!(VYKNuNezB^2@??wh z^upN2q%^j6?+ zl_^%`R+ST#VHVk5bleBfPx1IPG+`X5RpI}Bz^8{IAha4LVUJPYd%(QNK~H+<)5^Pa z!Or)b>2Ubi{6^t=dg0spY))N)ya!(q+)Ce_xo^W(>+beR(<-o(gUz&$gOArY(yWxV zB(L$1*7qPQ%|&?LQL2${>JJ40TbNCfhHD2QZ$;R_SCoMI8%zm0OedtG#2raRJg%dd zS*hocyT7}`1Ff3!fJo=TzT?DMC9-< znwb#Zf%dPdGJ&dZNFyOCT=PLG0hH~nZj_qM=rfj~rMS5!A}XSe3}2Iq6D@zt!f7Vq z$r}lSn%y_wjVeg2iJYd|6E?ZmMWmbNit^BaG4wRZ6?-T2gyVC2z8iiG9TnYzR+L5( z(vf#;uIv-}fdz|bVo~%?khCE~LBL9Eeb4-22ZAs5OKxOde&g~ETEiU^NKX==og@fw za3~mf2p9-(7*H?zdpr(_hE9fx!6KvxMNYwL;NXM_+E5Z!(szuDH~iK`$til3u$8tQH?0ItApHy8z&EjGM}xfhZgGB zMP>896LRdu>z4CRv;oh;Eyds7lAd*tb>@VTq_-1a`O)@KF@EjLvu$%S z(Bj{7aP{x)Nm=1C%tfH^3@}Gl2@z28_9*A=Y+JyM^BPA{d1)Ukadfz4rPX@el_wlk zKcIj8{!BsEoBO!y(0;swY2zJybH-s$V|Ww!R3SB9a#QwHA@lD8^fuJ_=4-8_uw{)n zl6-k8Z29AY=dPn|59g!9^r-p+vRYqy`dEW&=w=Kj-=dk?J5cAjl4W_@@LD>zepjKD zaH`utvs59edzY2lLbA(1k~ZsDhWzbC!H2guijPfW58ml_0BzqD{FfzmN46d0%lyZV ztj^#EL|a~atniEsn%3R4&Zp!pLTnxj$f%R+%2`pOA zs@8EAp-+axUVyJY2o7!?< z5DV;dnu+`u=Z5%+mAx`4x#SPCgIMB>YUH%A+QHG3{SWevqdz1F+s<3yXGvol)nN}# z%_H@3cx)fwog)=^w(42lnzzr67wVr4S#f`K6Ths){J`x{xSTI^8M~Je>_A&DWW1Pr zEBOv|TP@hmBSe80e))PBGJvTuU7odSIXj0!lkki=_yNv_inqr89iW9a7F72&+u-E& zZ;pG`-bc@p*&dD6c6~UrgB%daU=u%ByLG z!HIlP+5=t}wzBUyis@9%gbatb?J?VLYgvYRQ4)VoN&M+0byhW!qe%+!si{=LJaX-+ zyht1C`pL9?nXXsq+_;J}ey5h!dAh7WFOM}3SwMBR3o(P&JjcBb;aCHVX^`@b@;hKy zTynS^jx)@nwW#{3El7Oyd$hDVinIVymvarzz@p{8?vZC;O$pz=n@72-K+5B_C7-;% zanR{!<)xnktJQ2dC?EP^;FfFM3J0g7F=paQRXKmfJO`V{$WzOnoXWXe^nZ$1w-ra0 zCE%GR`qji9h5K_WH^`=ew_}VVe2cBF0mpT0HghV!(4(8A%{dQKqU7=y5`%kVi@jX5 zBum@ge$57>&qw8R;wy%X;OJ9bp<%)&3s#&vWwse3_f4 zn0N>X84E$T+J_A&Zufj^7CO{I5_-b>a35-Vo{BOz^i;IcVXy+)(&AmYtQD`!Xq*-! ze(oS)_DVq;EW>F$%HF#*&Kyb9O(~7fQoNL#T4jt1fEg5pRU=Q7uNv|GEFNrPX+fIR z9&hYm#&Uz{Xd9lnI&2sOPT5P2|1kW3QCA;{JK|L8EA$)>y*~JnR&`5 z+$)g9!G$}GXLBYz#x-Zp;#}JyK`n-%J-^-598WVi*P-c!Uj4eO?smL4rxEHjY!7^$GFtQ1)d>O+PEgfz>a@hx9b}vl-P!wZC}`kamrm-m89I&S7MG_?Nwv`XXmA4^38Kw*nYjJb56(l zzOm`#KD+&qut_U&#tzG_5fA>Je)BX5T%8_s(NUtsb56rPS&F>Rp`Q}*9M0=Z0^G-T zV-hlgo}<-E$+2Ih`br^VEDqOXE-pr*TK^>ODfv!vzUCN}#UZ+n8HMz75_OpinSTmnX5EooMAcH&}`|Y=#r4Mm=)CsOmAau917SgC>BA zb_-#%qr#rx{Ce(wqQf_U(#-MU&5yOPf6?PtFP$IK`liZ5M{Ws=OQkua4LpoMnGxhG zKe)+fdG-pMo(a}ko@e6KqP7eM;)|6u+MdYe%8D1sQKl1(eRm`As|apBBe(X`2rQXs z4-JcLCZXH2UZ4Il%oA&)nvvqOYrlK=qKnlxETMNGAjB^gh2@}XLv5rs&drWrOJ&(%1{DF1Npt;?u5wxz~iDAK|yx)U`a zkvr-hde*$hFsi5~p}*?waUq@emqT3Pb`^9-x&pLObXrL7)V-Fz=3{b3a8UEs3zl+B zlU+%#PeVd3O>Y-P=CNr`QCuStX$IG3*<_bytmgeVv5E9Mb8nQ#@?lWhW6IJAt9%zb1$a1T( zjN*TmfyG{s^~{b(N36S@Q!^hh*zn0isLH>eod;Q#)2)u?9e`~+`{=MFH9KAZA`eL@ zUhU^z%C-IDL|?tgjnfIbGi@+U`??b9S-W@L*qbeRaAGf`4_bJlKdMJ$H*wPlYB;{x zU_#WRqwxFZy;1WfC1Koogeu9q02MutrH9(c3v4MbqE1f^IZzxHfMIlTiUN9mYIz4xU1*GI_n_HxN? z21aUVBfkg;1_ZrROn6;0X(bRuaA%Ib!kAT^Bh={!IZ0@)V8e>F?K{XtB#ixz;uvVn zUb?r+<-HFg?s08l$vq>56tB^tX&#yDk(GD{&P!&e8w4zt$HGiWTOjQ8^V9KWy!21b z98pOH5Z2t0PB?}JJm&?y_6IixiT_{gSq_Cat z;-HoA*eXOk*5?p^b`~`#n`LfDn{M)ac&b=_6imLr%ibDwdT7(k?GZ}LnS*%#ZNhzS zv64}wAA{D^(AoU*nelf-755b(qwQ2>Qb= z;=(p==C(do{m5IB_I@q#E3~Eh5%FoBBf8okRZmrp$=(n0)bd1x1uSGZW^BUqF3ZE^ zYhnS2G$}J@*<-ZU17qfhralhb?;cyq`P{8LT}v61A!iOvle;cRheR_cu+2cDeKsx#fl2-%E?LK} zbd$Ge*F`J~QxI#j!S<+KrFg1vR6ZHh58Q^gF)ciHyL)jo)}ZR5ftvx~Rv7k57z%6?(xy$`O3Ivfgj<;&Bim4-L*S`&( zLo*j{e~i{wsM@XMrp@&)zXObU=Wc1ttwY#%+*bPB&$63uJqRAR$b@qjVz;a~83b%F z%B{;@a@|#ZqwdEI-!qgJmbAB^McO=DI}Ajnx_cr|Ng98lv5fDZAxuc#CCR{6&BpB3 z`kYP5-B0yvYkah>$&Wb*%b~{OvVohJ;Y3(UCA~4DiSC`}WEPu<&Tm1(8Kf5Nev#)O zT!qYK5n$@h+R6V(V9S<#%wA5Ans)2KxE3fq^6|wSJ3X*Nv}UL(;P86Hb|0(cJ9TtT zBUuO;#p^!3<+AOLiwvrC)2LiPwr0Xw6N4 zX&2My?3GRF!AP2JiTi}Z%{A1n?&mB{NU^t2&g;Cy>KF+hqJ5SqkeBhgi`$)Y3VK5q04r6R zP%OPaIUOuY@=U7V@Mv6h|F{8_RRv=k*dIO=Sh*+DOksr65G{=Cvkuem55W?fC3>jlevW<~s($ea zU^V%BNJwSHw%mH@b|=AA{O-5}e1?x+Ux^S#R}sp1lV}i#Fz*&iNw!CdJCHEk!_)V9 zpmf}Odu9xwdEA%8N0Ri0KyoSwBFk~og4Gr}31xJjIgWCar{?^o9)}R43Be?$4);T( zv-^1vxe09+(KIwU(z(|pi_&<7(Z7xNCNHseirJ1kHB39Y>McJBq0O-G6duu|(oQ<@ zw)1vX@(xhR_YjAB6R;bJR8$Y$EjpGw80Y@*Ls~pAf;%MJYZ);iK>56Pb~cGkW+w0x z)P}jx4WzhisxN5-*GW>Rb7bP%m0Z-^Erb)!`fgt(5X|#0x&wPB|;cb9*w0);V`xgGI1>$ z$Av?fQEfFg*KnuS->zFVf5V9B?c^ikcyafLm>=r|q9_g+HhS5tWyycJq#Vbl^x|QU z!S)`&*~t%)EA30z_@Pnzs*v{cKAILTW9Q1=wa-ZztKB}r{K>=p3~pNPMBa5~ZaLT1 zj+VU%_**NISo6|HHk6;gEcli5~tN42VX^$Ab$>(n50r%yhFBZOGSNK%`689Q3Kt^I;`S8xbd zLu(EqMC;|G>~#j}OQ4uK$RM~U4j=hK8c!ojC8cS0W=)m(TpKk$kg%W>IpAGPN(pSk zqhN>$gkW)wD0|K5(N3yg{}uD}>PI>?QHpLc$)sn#pV(2=D~=cj-U{FHj4(pmW}G^s zR|`Tiy!$eN7uG0)#hNUJVPE}{r#rq*ud(_i|E_zs?ME5`PQ)l=qLMvCn2V%(y(XPl z7~Y5)HS@|TC>dcv4js>YbLbuDfFZ50@8-It__NcM;$vXwj$o36kv#s^#8_KJQR``a zl#{jILzT*&&;;vYilQTbe*WmH%7!FR#*IY+Nr#VQD@YywBb}7sW1AWqu)xNBrOYz! zI#o5@xv<*njYr8WS>n}@yA=8phUgDfs!*l)eoG}2ZD~~z1=-mPlUXg7YiWB@%E^$4 z42p+Z2uGzW%5H6BuDw-(OO0*~%%lumLFo7kE4Y4zd%Vw%MaBFV;~w^OpFiwk#lDEj zfR}ib(+|Bd@GcmnHxoh?WF+UYddsH+$`=l~g0hIAqx6%@sYT-M7dfOMh`n%r`4~O5 z^E|bhVFRbOKQz@PFd}Royx%n6HiXJ}GE^^$br_=9lJ_|8Lu#F3|D9bFX(2` zKb7IgWtPl&HS?ddx{cE7NO?wW8{&3x+PzgjtpEb4HqU$x-12b`l0@;jzm^In7EF_$kX(m3LFQ!QOZ66|?tleT(yk3va%Hec~C-=c*_U8Z=X5Fk3 zv{o9vinEi{-;60XP$*EU%&i+}kqr#0KeG+KJL@ls$jhtms?-G5uEVKRDz?_P^ZMPj z)@N3$xAUzLI(|s#=h5`<C#{{lH{sM80K?7AH+wv2{=;-)$oUF?IcX4p^zPd7R%@WykIU0%!&=PqU>FCV^fpz z_|0Lw!vR@E{jSa&Mp@@I6{kj5!IDjNBYF)m3cu$ynaf(02NMZQ9dAxcE2}Nk8P0NI zQk&nqp8?2|^xv#O8J<10RD7<3{DE*DOW?`rQfgs>ol8fco@B0h7lz}rGHZ=H6xpv1@e}H8(IiHL z_-NmD65}$@=Qq?(s_83piiiv03yd~2?^au#W_>>MU9QpDiDE|&@~#vkM# z33I~BjjHsAfW=n<}S; zD3>q8(E4_sg{3U1Mv+V6(FmwU+CH5~Gu>&QRZLR4i(8pX-vqNZK1w|f+vuoJTdFsJ zHgVxZAPv=d7fps#&T?XAe-h&@RPo3#)mztFHk(xrgave7C|47z2QTP2yj|e1@hmfC ze@6%iG%~jm@5I^-j`{ps<12)OAy0kC`X>{MZL8;QBsA6@)2|Fpus`yw;5Kk%G4$53 zahLFUp}&DiJw8S1}fU?+Xsu4N#{HrNc-hzN4AwzBJF@Ju$^4#t7@->%Io)wj9k zz-MqmAW0aA*wv&T#US<)?!gezTBzE@Z7lZ^X}OUnWLWAk^)Fsjhy4g)6w(*M5rW)V zWq{jQ<}Ut`zA&od9Iig9bv4ym<04YTlhGa7VnsDXkU=guc*VXHF`$oz(5Z4-+s5m(7nj zZd%c9uZGLu;N6p^>=yyc7!TCi??4fXhbOneT@dVKjp9lW`mcJ`2iD&{W$!?G)^+6s zO`#8Qhx8^(YVGfVMK|9_3m1Zg?cD9;5{tCIhwP&nPp-Ni6)V(HtD;cqB=G?(wd zr#HWAfr*YE=D#mq#)e1N7sj1 zh#%AQ_o&>MWWjh2d}fBW0C;)>B6K1>MkL1K!w=bT%h~X0(6I%{QGtKp!)|O}Ej)dB zqx^DMLn(NNnGOnnOh2Gi<%!_$ASPgJ_(m^rF))*wll+oq{i87!Xt*TLwg-!fy?CJ`el#p-GZ-zh$ymw66dj9=ip5u<<7B@`ke2+RL*mzoK9e^RSD zJosi#j(P7uC>qUqd*}G1GJ6=ayA7w*?A<`pX{U3M18vGn7GdNWcR_4t%4qx&F`{K$ z&-|mVBJ#OPJ`bGW$W1UbNuUeWS>r8|^Xl;1)DuZy%mxq9d{?#pp}Z-zNte|#hHliP zw99UXr!MLZBq0L_vN9_Vd&Pn{ql}w=Ra8sL(GU+Eh07|HSgOTmtXWL@MwV*x#g??Q z*U^&e;Yt1P`~ymr z7vBN9i$(qr<~lw*jKpkSZ6z#xk@%i@?DJXVWpEyWgRpf;fhm7@*%xAs(7PUIn}aoj zs3ucZL>@oz5}0fyICh{8G`&|?p=KY7oNr>RZyEY9aZBYFK0>{spQQoO(rQ4C0UlA7 zdd&7rroho#O3o4zzcupZPJ;>R?S;I%0SBq#KAH7Z^C$C{OMMs%LzqrYQS60`tScX; zla!eVn0}HXHt&uOB}j$>QP&ETQzpV_rZd(YFN;{A8b&rtUA_d`7j~I*+N?`})@9>$ z&}Gf!;@}le=Wiw_T=tI&DDg^V;!Cd^Te{6{6SzM3Ydc1p#8-F3$|x1WAq(cs$&tT= z0}^*07)6Zg1!ZmEgZ zZ}QhS!%>M-L8qj!@h$}D>R`MgYKcOcuuV2owyKEj1t3aVzw=$cTx zeZJagNWS5~)I^rA>rm0;ssSZ(7y0`rRgU6e|2rUQg|0)IX*QQ3zafuM1%02WpLI_D z-KA*oOnP1J5iVWNufqLY^N&K*&pZ_9>v2na=_EH1nADp%6gA8(w2A}Wp7RNcX7G)Z8Lvj!F|ti?^}#0cB|@&OGP7_7RL2n`xuQAF{o^630DjDjv_7rX5_#> zzT_ggha?UJUXVk8JhB^7lUd$!&6f|vcK=f4Wd2lDKWvf`K}j?9fDk66ELvA zS6GpLX*Eh!k{>r=7QT2;LJAnCo;snWR!ODY6&OOuhjVE~B#A1urwomU6{QG545!l_ z;Tp8Dx4NeM!8d-i>SU#*6Of`gR&-e=(@5X_Hi}p)QE2hNI%Y&#t<+ep$L}jY;w!w7 zL0Xt|B(k>pupkhar1*MMjG*ok?T*Y~9npanHvERE_u$o^3#kM5L*4c%5VC!GmT&=c z7@^xjPHhazkhH!vNaVhw^^FE??a#efieIh8!tHjcq%B7`xW4sbLbiP7YRADJ%$;4M z<{<;fLBoWMTq8PZR4SfnfvuKbk(-!N_q{)$;2UndLAA%$6z1IrA@MATg`=+if`4SC zxbLY;F2kEX;LgLW`wmc+SI~BowByExVr@JpD53PMv0B#?#Kqk8PJE6ekhep7;nr=R z;}KeD^(hOXmtOr4rPZswSX^~<{zAck_!u`kE_hgjO;cH)j^5pd?L;Iq()_$4M3$2+ zfhC^1tzhNv%!T?Z+a{sgNP>}def9VqAQl)Mwb%D$gGPgbPSDj)Ru21fej~(jOs_ft zPhM|y2NgcDr#M%U^$sL6y#pgjERtF}prZ*Mze%B0CKWQ@QRy zl1QBLx4DG#I`Tb2+WSB)E~FUo!t|X>)YUszF8>~dCtNznp{1%?0r=jw0NVDQovS;- zxLGq`S&_#4cwS+os-iRqGP%M1+a7N2q7s5_x%ZhK6xHT0(M_-4hL_&((nAF4q)H{F zI!;-uV*SC#=D6n}i&5jKEsVdIyc*xRh*JzY&{$?m^aWN zsVe(57l>R^SV7hDN_HM!vV ze1PNA9(yb$6_GUAS?lQgHHhu2j?sfHs0o%;LNt%%A0o4;R<= z$&AyOk2?E9*V9Ke8%+`W=d2fH*JbVcLtWwml#9P=CA=F;@FUl}UI2^NF0cvE$5B#z zF%+`=)7xB!XT>zGCOEVs$5~7xg-Xx27#f%oiHzblOO)9(q1a1h|Es5~42$afx_4j( zkQ};OkZwezh7zQ^8)>9Lx;q7FkdC3d8-|dOR1i_RkwzNd`Tak<^J$)E?mc(kQ?vKl zd#%%JJ?mdnK6plAGjfK9Sk|Q&H>7O&I%Dd|pfqhR&S?Ck_n5!crI@t+XVzS~P-TUn z6qM1&M@t^JeZuA3F?8ORkN(@%ukDZU=PFgF)RUaQsb{3!UtF(;OwMk^aLST@+SCjM zM<+x{ibmXxp1sVXpCqWqbILc0Wxo;LXTdFy`z^L1dAU~;Tf8ZTH@<9sX2;FH>76f( zpozIo#Xo0GmYLXn_n7-o%Ottt>M4k+*-S_FzTF?cPwbe1v3}btSQ1twge%?zGYeo! zSN9}DsLpn1A5SoO8fHKFO|iZ?tFE4pB-9OSd}VIse@J9UUN3f=eVcz_8!f!NpiYJ! zIaxd9u;*R&Li(SQGQB=ug&Q)H^t6^!XYU2v15jK{k=HYyn?ry8-tr`Nr+ zrC^7kuM@lDQU1vcRu~9_`TCDSAB>dm1fH1Z_xgO!SL8~?4L|+$*PWoI3D0kB6#4a- z5zYR1@oV3v!Tv6Kc>LoR@!WVbY3-TGiw_3=y$#@UUXeDJvp*~mxK z419BbpV0Iqg9cagAdM)Q%|9>2h+NyBY013{^IgF6{!v8 zN!>r<0ZJtYFeDw{2Mb*mh7}aVEBvsvvZk$3Z#x|qj6ME?l|7T*V^+m>M#4(V;W*(? z7F=krdGTPZi8eTPFx$75e!{^&Tj$p2XyNYB%jP97h48SPeC_u4s8M8yCqH}ivxEtZ&+#nj*ur8BfW96SSL1V1lx{wP6m;n>Wo21^2`a#drRlx zk@{Oa3r4lqOM4Rnt3}`Iq;?ZWHa@?=eS=mlwJbC%Cs!1vV5%svhv$2*_R(si>V#xj zAr0d_N~PnzOG-=pGEh!BQ1@!a zM}aD8M^o!N%@Hl%T!!1rsG5coaHOOItzEWyi%F=ag7ERz*i??sjtA6e)fMfl1`A*T z>l;nOExEDJJM>AI%lzhF1+OX-J}dYCelJ;PatO(@GQ}!wR@OcpK-HMD4Fg)x(YABZ zoPUs3#zB8u8V3K34hUVU!zUZzwBK0gQ-yI8&~w3#45baLn+wi3ceUN)l#2w@!fIX5I7}Nk;p!lZB0sNZ2kwxa&A&CMH8z& zt%jYEM=ow=DVezO5GEKfQg3FmFVkz)FbF)lhBAF^QM8qo5-yE@MPAyWtwXoP%bf+~ z*0FyPN^lpOOBOG3Tg8v`QH@F~xZ6Gq3+55^S}Y1AV#qcXCc|I+v8a1y_x=OB2D6|M zv#(9tJHsiqwZliS8H>=KvL6*Tjr=v*tsIC@-~mqz+?pF$`>KTZnS+7)QcQM%4t3xF z#q$aFJN2tUP0sg_pUn%?rGa18U4ILt9*(_#CE3i3@k5|5WWef5>orxGpHQQvUBY$! zb=K4>H`88Jg2Hp4RJ)||fekbJ()%Bvx$!D4gERs0&7?i(XYRb z3Myjv^9wq9E8WS}i6yBaG9@0(^1}B3i@kaelesVuVu*?Qc@HAjU?c_#R(@ko7ao_8 zKpXgM{jSqXhF{C%`w?^A3#SQ>sy}rQBbnzvUidi>4?73waaq#RS%rjt4{?U66RM}q zu4;fllFdZKJ?E)jBjxV|6Ya6VIH}zT2BvJScI{Xl_rdAJS+9!aDa-8O2FJ3Fw3`5a z1y|pLfMmBBc&(HJD$o!vg%bREqTUDvpaB2*2^oZO0>wqR1Y=qF%~d?=R4GYf5mWEz zNO<}~g6YgG%Q-+frGis(a^FY%=?gxof9_c8*wMH2$^gSK-)NI7R23r2*iLPN9{P|7 z%m37Efd5K0kvvnRdW~@jSczvrv^i7~3cTtEJr7m{08L5o8~%5@cKm}l-=YCj6=X9=l~lN2I%_1rvLyO1eX9jsF*$w z-RB#~=E2YD6+p2(pJ~H$8bb8(`~R~9Gy{wR^mHFxcS8ZBwh=)HRS2+YrS8m7_MQ6_ zDQSeXM*C$744_d4Q2hZIInoTqV5oSxaLJhT7_*1VB=W7_LLk_5NTM$Q^9m*do0x+z z#TEnT6uDCO`dQpDF_4A;P?=Fv5THs2(wB!4DQyAR&jtShpXft*9e9uYU}o4Lz?2?j z>bME;^h4Em#()7R3^hSS$ol}}9fnFlH_A8^3gtzp8=d_|4iE+ph!sHb1VaRMlYiBv zsx?S##E;N5s3M8LJSFq~ZD4xFd9{V$|2oBt7>B7`mWNfl5N#G;l?RAavREWLpMin% z{hR+IA!C5#flt2*iO0XlCJ64TfzPApQozp($3;JaLkig zPd|VGrbE|yV@fpl1qTIR)-sf%D2&Ps0ROe`Y?m{m?`>81PhyE~HZ)+sP_zK5RkF&# z7lN$;0Q@6wAOXf6y(^x!U=%!#U_1e#Wj)eSfGJ;KZdw$E>_&M&vli`S?+D8;R zAQ%9taEwGh|1{!FCqq>j4B#W*FY;BIrt3-~ax5|W!5C5ib|V;Q8pj?|r2`;>Na31b z6o76VBN%vY77U=G{HJa~I0-<$n#*7kUBCc3D2xCS9xN$92c|>C#Wq6F z_OO5r1pqV-qXW5)Xy+ouXn^{kFN4uRB^WwxNG%YV0;ni}hFlzA9t@&UXbs)em43X7 zX}M*eDuM`ML%ML~wiJZzHX*Wx}SACLHUl4r~mN7$rNK-Q{>v)1yVE{U~ zz8?xG0N-#4$&M0oCZC~_v)4W65lN7KK}H6kil!uD*S`gTBzXYO)VZPsyvHeDXwJ*h zPwlkjGcdz}2`-Wr4aR{61K2~b8NeDW91;u#Q0O>=f#Ph&a~5_W6O{!R00DH!@dW_| zm6WKvI{i|0fL^P4tZVZ-Ng(t^n#(5ugzP2c_yZtpx@HJfV}u>>40`|~ZixZ(L+DV5 zz~RWBVL+-f9nY|*CscF|ARh#Pi(o)=3;-!1hX&Bl6a^s9`$0;l@vspZNjeZ%9XZvB z%m8d;vvkO*2pZzG2B19s0BDph9DpI)Lw;P)fk2B7e(1({xQo@7@D7uAX*hCdWEKs9 z5P175o+}M9qfBp}3@#%V#SAK%i4-2biwYw)8qcsb_i}71PL*vbVZNcTVf$z6H8&|_ z6?*0w=sEA9ObTfsy`@zw6t?9PzYgdQD=Y^MX?z-TwFe| z;ZM7+YOOZcBWn9LOi`A0?8Xd|c3umc5a16h47*i)*R#0cead31DBqM=IK^t)PyAH} zj*ZK(XL5|Z4~9?~k#(%V-8eBFHfbkH>W z;p8U&y_`z#C*4Z_+{b8Hq@!vs<$R|S?HtHV)=NyKRmU!II?kZ^wx}7w-gPf2DM{=y z-;UMsIJKHswoX9BhF&mt(7U_+!u_Z@>MwgMYH%CeSb1u^Pw2O5aTl7YPA$-)?pKk| zL~}Rr4*)E-hlZ5!tZz(7(Sz5|jap4Z9I(u`!<->-p@Cy^Q;~&d>I*$mn;4DT@n-hw z1m#~mxyC+_ln#IXc+934CVr|EaNZ-0#jX~oxrJo`JpnagiAy^w!&c16&#Ax82;$xb zT!=~Eq}LNC8HACbl`H8{wsV9go3T53n0=iIR8*GvOlZwHRPnb5w{)8e#4<$?Ma(i~ zR7^cy+n{a|{W_w$LXyQ*E->wGL8UXP+Q}15qW*YyscDN4-rkLELdr$f=p-h&(BYDA zDUEX{q}fZ~Vd6VwQRL12iOYya*QDjfAuKkHO*i(yv}kB-?LvGJxqz7P|I4HxmkqrVcZArQ_h&a7B0ix_hxMUHi>g>Z5Da_~>;Fmp3(N7Wfu_k4_WENYXN-vaucZDk zOE+2H9M1FE>=Z{6amy&@%{7%mc`-gbO-<1(mkmxwJ=mwXseCYKcycYoh<7PUsA|uB z!820Y1LiL0fSPgWOVOUv{Q$+5a+~gdzP0k)ji!*m zz-m^-`s(NujK_NFEht1VoqkAg?&wYUwNEV%1$b<&y8pa>DqEs5512cBOWE~|uX$AT zmX-*@@PnftpOj$u=)DQ3zBi)Z6erRTWBWU}H?Cw#p?b!7Gf>cEd93by6`BG`AUF*y;Ak;X6PK(ymOV8quf zZ*3p?<|W>WWcfyq;)=_TwBJqpLgMp;38g#wSaDovvP*=f&01A=qbWmU(MrWl0MsjN z+l-uioW|8p$+10z+FZ%-;@jAuXgxMpMCbO>navQ_;j>(Yz7MNnUjtv%)&y<`v>Hpj zHh28Ju9Btd{*HD2)rYm;+a`Y|blYiu(z*>dbhUAN73K*}4}N{=eR{nv_5-!m`|);~ zdSJ7IVc}rrgGBq*D&?lw&EwnrRTGS@ovW0$1McBLTOZI~_Y>6Q8q4=cMl8PE&h&nA z5^_4yai^c=-`~s$FovEXo@j#>>ykfAi(?r*eeD(b2gv^ekn@!FzvLg17xdpW{a^0y zzl|Q5{DaaVxA~A{9%T0KbO4$9`~SQj^tf-fkMBN++T(9&KceF1(Z1YOIPF*~z+(V= ze7{>^vt}1bJ-F!}t_WoMIH@EF7y9vGbkC^aq}>dmo|d;9-|?=UhrMQ=#68CCPWS!g zPN%&oeAVtVO#VQ3xBP<2$*5iES77M`&EZ z;jhH(RZqj-{KS>py$segLtlr0L_s1e3($m%$fOr^AUvKmHv9m>i@Lg?(0dB>epBrcmL&H62w@-DzF z5qOdI#@Fq8E#G@C7h`TRk9sF6uD(eZ$nNWQ+#FYLr(vE|1opvH3GT&rSB=g`56Ba| z4~ z^Dg*GW&9ECYqfq7yrca7)2lU?9jz!bz1Gd+*W980gxmzBx;$I~;|yBe`rHfRBK-4b zT&CEsb$chiS`FMLG&YeGtbE_r`a5w!UjQSwa1f{>$fY;9>f)|v8wv(m99k#UBxRl?!*k= zedP^js_{B}Cx^nGiBjZ@cBj#=wch?<^t0odjnhMwP^sI7cjfkY6FISO!hX~Y7>_6o z1&lu)h*X{*{}c*xsjxq5e`A}|+LA`ZuM1t4iJ=T+DtY3-W6Rrm)!1m>izW~s`u!h} zJ15;f!_wdSlkki{9yKjim@U(JQQ?gJf}Liw*U6%3vN&PV{-j*+rzLh^7?)Ak-b9Q$ z^m;By40qBu!i32uW>@3h{#tx@L)*FZ_Gs$bRNCDzW08hFQZ4{R6P8 zzQEJmw}f0IM@Sd=(P*^0%tTqrMtSKgA;D-!xhhpgU`NeEx{i*t#o=ipU9g_Z4xUp61oCM zn4T$*00m^_$t9ix`$}B^#xdb_NPec$uZU8>uP`B$&W<{XC+!5MprB%n@-DWLr=HGd z&tCZ5pPv!+CO9*adQ^m9VpUt|@0vFml}v^9Gz!v}k|OU7Ld0va3>xOwUj>?>N`rnd z>JcPUC!d(X(bVw%T2aFUNl||}Zm?YRz%CG_x2jt)Wa%q9QR;T-`ityOZ#FtRRI`u? z8mXS~w4eU?3fFT@0XYXdx_vWkZrh`;I%E(E$JPD4nSV$dD+!ercp)-U$sDQ#L%!eT zoQU(ap+dH=Qp2eJgY zs=;%6|3s^J>_I>wnQH{xe`;%7;^-r4^gP~piV_cZEaL)`0IdNnb&DeWn-JTcXFuFB zYN3ExrXfBPCkMajnt|dBYGI3>P30T;GsxBQP4^JnO{IAE@So3B6XXG|EXdk9YTUb{ zK8-qJwt|(awBHZohXHLECzs;)y}K);>86R3PG~4gAR%+F}i>iJN{B%m!Hyk;1R>hy<4fMonWQi_Bh0Du+lX1JMZ9A*5Nw8s z;LNmprCg)8z{Zu$M8crkV~DNO_`_mvhGE8XN~yAN;_HO~6?@IO15>elx1RCHmxJ5Z zXzuf_?`|OffR7~aW}UQ6i*I79BU&kzU)4_!uoGmGeO+IVoF0GXBAJE_ToV2RQhFv4 zeb8vOXft!_6XbT85RJY(A;fKEzwOqb6F;)^`YyKNNuGl8HKCUHK(z~un*1dbfM>55 z^)BwQu<$g{Qo!oXH?O+Pau-kpNg0?N8me0A_xqXyikeandTFPF&bS5=+N8gREut_G=>R(WpvRrL=IP4<4hqVy+sxMa z^*9>)Z}79j`7`3&yR00X*A{yivT}vLqO6i^jNelU+l_N&)B~K4x+UDs*9QZ zD7#Zc#oso6Db`4H8tVM1Ufg-r(O_8}GCGh>vqzprA>plsrGCWyaQCMx^bY)Xc!aIB z$?^wcUO$p(MWKE*DVTaZyJ$$(^#aRyd>Ehz2;Y?We3OJekDmcm)yC=owVW9FJJA$v zrbLit7$yi!Yjx=7YE_NOqV0-Ri;agEcPva}3z3xF#A!TA){bAZrsW+>c4$;(>F+0w z_cWF&^!in5eSgiAK}e$7Odo$Xc#E+99yf24r}~caJiu4dDWcNbeG)BgB7FW}@M&n$ zV&TL@dSLs{TSpl4Ge=FUKVCnI*x!Rqyl%wmucq+5DBA*8V0%}EX$H|RnGzrS-By+c z@9BK{NXM?$q66eS;?&OFx0v+9wb+SlHTqjKak8Lu?P$}v2-kKOE4cyt^N&y1-GG5e z(>YY1Q1PW^go$nX3ts~lpZU2}=)Jam!P7b72H zv;(FQL%$6IRZ%15xGzs+X(24pI5JbJXaoKYhmBe5E?2JHn}-{8j6a zOco>8)tKv*J}8?*UO0L*yH??Q!Q@o%%jDhkZ$UhyXg^}_YWuKzC(ODp;-BQ(!%Ng@ zBXzm9Elm;Ph#C6J3?-Gy!f9G$bv<{C+U)s{w>QCdu8o>oKe&bSsmTt-jFjY()6Grz zQQ{}sTf$kqxidF|BE>VCHvfr;5}jY6tSZ^mk! z+oMuehT&12>nO6)Y}cg|e|ha4!f*Npzn z8#e36KYuyw_8Lr1wWIyH5rP6zJFj%A@0lB9V}0Lz+Mxj#Rnjctjpak#(x_^(AR~(5yQ!S~mt9XEFpD|j|s+-4s%!UIp?v10f%HCF}PWIK)E9{$3EVEI0gyO&=v;Rck$E1|9>fI=#wF)3s?i+MODi?X};3 zwNZVW)+-G|d8hJsub38^&>;>dE2_a}CDS`%!#~ZkWb4)Co#LCMlToctH!|p|H@vq& z^kFOJCi5ToZnlxmTC9A{3baP&Ru+!+i98TS{NC2;x}x0WKX4vE+0d0+w7L!9^0RKj zJ}li4d9>s~VD1|WuVBcQ{%mH5LK8aH;n4}ErtcDaDXoz{y=G9yXbPot3r}<_gI$0> zR7IBB?YGed3=%Fu1HA@cB=fBGagOPW|?4y__56wCw42o+p(6s)H{K$~f zqa9n_qUGB$e8aRyhRdGW~DU``;MoYv~SUD^g2VvwqiO}K zow;Dc+bA^eAXZZf=p8#<$uoM8b!f%1*i8O%n`m0eIL6j>s(t}&^7v&q=~TLj$K&J6 zgj<8bs*i^!w;gJ-Hu~+<&+-t^p=axBc_oqYwC0Y2_#F;Rh~>GO*#j{^07q4bH_#KJZ`fmjL5?sLsR|% zomJy?2!I8ZtQhRR+m|Z9{;Lm~$AX$}@KD|PyST@wA{7nc3~px9uY!>*avD`D)Ex&* z?CU4(2~NX0$}CF#@=DBlxVG#qKKCM5@jX_*0Aw#+fT@6_4z3-*Be~Qo;eP1W z9zpgW$jd^ZK{}YH+C#HxASFv(IU2X_D!N_pWQ9uoS$WBr=9+{&wNz9bYda*I$=1l? z{65Imc%(sV4dIP_{-l_5X<;f2!7#u@xMEe%7y9(e;WAjT!-39Q4;nq9V9uX%KO&Ax zb#Nr9CYnLoff&q|#l8gT`q=boq2-hJ`5G7O<@`7MCTqGDqXFzIQ_~&lkPyOBWhsUW z_Ekyl=gX^dd<`ob#;)y~npB@%=O24B1m{iew5me<6>5)kCtb5Xyn72RNOU4wFHt{l=%H)BRaleo3E4>bv-C>BOFcB~}9j*J!J@d(x?>oq7`B*m^gzdH1q0x{P zV;9tnQ!_T;q&-8aL!>&c@646tXYnr75GfcBHg&>zlb_}-@a9@?D>7GzsMyQtvfHTa z^mnjO;NwI(NUP80V({z&Pay&sq0~Pv^JKJk_hPUtxfO8gj_hsl?IT&Mttcb)EAZfI z($~z;t-5wT6jDr%AbiQy4RI(Zl-7|NBa9Y>$7b?{|1!PFxAGY^*aJw$2lM9Cm5+GC zbj$>1hAQl^VfH+>7MhJF9%1q5d+;!h!06$IPHW*J@loDISZ$1BZLM_-()Y~_7{4Y& zP#o+8jN6|y$<*p0%PX72nRMkA7GxHl{Rb74Dj(P;RBj%ebAu*utJAppq9we~tlJVm z<9ot!O6<+rj}!NbOJ+n^${bUx6T^d)JhosC9&YKgTn%Uyhur9!s(y_ zZ!yt+z$>2VrvVn~qPc$5^zyvd5q?`yxQUnG691tEQ?*5O!@r*Eg)YJq=LKI@^@fwS zb5&*tH==8WH!smjDfgJkV_vW~$I36>wR<=%AbRkt5cfj+G5T|bDMW=v>0Mfahbzu_ zox8!lNtyo#tuoY&fWXt-g#w9YuEE(&cB)jv0xa#Ad2>O_K-smmP;BA}JhX8y{g3;` zP_cMts@@*~f1_I(0+T&AvAw|>3x7;`Y+#1kw&B3|Ek%7V-mkEmJ)6_|<;X#X=VJCI zinipcB9X7T2Vb&|)6fY(0rfXAx`YUW6&W~|c7f<{MaUkGkWmtp^MGOAo`%L}fn0{F z$gOW+0HtBB*1dLW)GZ%>vLerqB=aY>V-8|gD4Jj9SAU28p?-TW@-U2w>zQd|#q8;< z$;u3F#O$k%%wwZEmyt4uno*qHb}q7gV`W7Aj7$ZqJ=e3LYpW{Rhc^n)5zK9GRHQGp zRY4M8{#Q&EA$Y7eWP;T;OGZf2qQff9IpdR!MloTDu9#n!rLTWrJZs>~DYoE>fK@(j z9!Lne6OmXARbHdDncl1{Q~m=ebEJ_qxfaVpHy7+jE}EzKWO|1n`;|5&zUQjyUCfbH z$5;c~Fqt=hHy64ehC2*1!s7xm0;oOR*;lQ64(h;$A#Mc=jdqAWO>xWWp@psx7mNF} z4LsS}#BE+SErl43A>IKttqT1ZW9Lh3>V-4xpYN85WobEIR3@^qY8z^2c$h}JrMd0K zts9zZL(P65$L}UK#d;gq$*#Da5vL~w@y5rz)diL0vvqF_&6PgsH(P^!LQgi z5q`g-$sqkTP*lI2sE3@tH!mJi|4OJH0LQly3op%tA|(WrS_Yf`a`hG&UIA2IoLA`6 z(u;-&!#|Zr-Q#OaI!uOyV%)skMZI*UusB?zXYI zCnVI=<~kr2c)r+ss42(~**Z4Wt@$X-sm1DcpOc!a`<7s57; z9m-zt)V?+ek~5MkU)=j`FY@OD|JCoWypXMvK&HEhi@8S+E1&(uKDTSOfXNTKeY030 zbF)`eeo;jbuZU5XMJvBFHk(DG@8y*VXKZaKJDnmYDi$=poiWBppw>OR{ox8(6Xq)R z_jBUiqC$_-xbRzJ-k-)xn>DaQxyj0y4Tz^ozA+b`HFB?jA1>f&tan`f&g*;?zgwy7 zin-hP7}#Ux|8z)X$fYE)5I&llF%z;Mu1be2WAORIi82yS-5{)4XpM%A3A9+}1%0d``m+ zScN;f75;(wVv7f))5@0@-?y&?5tGwaUOE2&FD4C`LG_BfMv$vIQA{#LU5Cn1pNdvZ z<(vX&t|O-8Y<;(MBIA1}I!q;le}hx{Sy(j{@fO$K@PgARyzqB3h`me60a-Z`8+L(3 zIy_EZsPTDAar6sjJCvdLnua`}BnSN*EsTpZ+ixVOQrBIsK0+YOWP1u>V+L%e``Y zWKKXOM0b4TT@12u9wCk1`Z;0lu}wtdzJB;Rja-!aM66Dvox_)gh>sR?A+$qi?#7gY zO)F0G#G%=o8#ag)11%R)!Whgp9ElFvXB%Q}l|B0z8yIw)Mu6Ms-WbKR!Jq@d3d2Zc zf8EEpL>Rw=HsW4h)`bXNKJ%>!eQ7zVWXK;|af=%oMUMVgDACH%WUXGe#^@YO?X}h8 z&m`BL#UJVv^%3MpILBH>aQg-zoK{d~OSaznKTjBJ{;|d9FCEDyWJ`FP__wkKQYILQ zmaK)Ig0tMBJOOI?8hxO(F&IH|ux*=o5D}TM%`nQ&5pbi(6LTe&$Twk z3S|>qBPF;E1hE_ivGsNiT2P*roL{vLa1<@>MNYRQ1ca_wk3l$3nKK4_!aOS#*;^(n zjK5MVdGQBi9o_8Lxz%a1Pu4lsPGsZ?^0(!$g{5Gwp5DRw_!@9#6s(9$vxCwh+i~0J zHSeQN^P{C|Xt%kGp=elV96^29qz|_WW~XZyD3vp4iwiJ_GEh`e3k0kfhL-h@uRisE zg+wIp45>>uGB8N^4{k%o{{;A{NFNiv6SE+B?*4bue$wGQJERNxjaW_vJ zNSn)_<`~(*esfkacDeJ`(<4D5`Z1jnp9M05K3SzT$9`IfA}JM_EKJM$S(v!oX59YK zvpgq1OTCx*ddZakx3&M@zCJ0_-uypa4#fwANT@DS?ZZFdD^8g;vLu`V;>0QS8ba!0 zjec$RR1|Jj$6CkrrkU_4vU1P1ojvc^C0{X-y#5G2q!XR)*EjK>xuI;SV76 z^pjz27(hm>Re2LV6SG%M)huv)#z#Nok;gb>Pb>_BZ{nem4iqzaB-6+gE(npw3%Ygh6iaJ}9i$&Ly$ zuZCv!Eyv#oyv9WT)^-KH!tl|F_BuUB*=CX7>XNKGWpRgL`z zWJ3aVFES|4rI<>eM5!8I4tzn~jyki%goUhu2WYq?TdeWdU-GWhkU%z+?&qw({08-z@*`LLt*imM7Wq4&z<6X zv`R5r-gQ?ZmhUzTZAe(iUfbh+)>iE2K^DF$Fr;4t2N0xqoDMCVBKe9T1 znQ&8bj-cA-EGT*o_o`xfXv>dG+T2I$LFy6;0f@kQ35{pgawp&ka1Y$!ZqB579hQ+$xrqhzHOMX1S}bCJ&pDTW6~S3x2$ zFFvqdHg#8XQsEl}+&ji5&lp5-8 z8Otx9Y;FP@vNG=EiO4qGg9byt&|%5j-V)={lSfEJXTOcJC04jJdJ*z4@(zc+r{l3u z=*`j@XuP}j5ymPe_laL`H~%6e=IF^zyVa+rK=aTPBW19_P{fOFH- z(Ds31Zq^p_1ALULMt1aO-ed7%7N{M5(vFYO6S)hjO2KlSIL05W-89yq=3&T72kh`? z^64+4V@SlB($KU!`Q+X!NJU>*reO7^Y2kevaWRH*YDe^!{-nfoGjtY)8_Np-0R^jep5F?VvEN~_A|ZX{_Z6>qR4 zw{2m`Mr0bTzFj`>$R>olK+G-PV|0m9Z@@10kB1S^l0>V<(O34!(Kqq;%u46~fJO(G zbhh@#e#&%a(p|n$1q6?+siM(u6zc{g&7 zzb#JDMh6}L1KKwwG9HH|=ckawJe{Sd3j6%ou}&G|cJ0%umPIQokp@gX-FC z*UFmCy&fB|m*ZLtb@|qYd6_A?j12{38X89}CqFo%{o0vzoqFpA)5m>>pvP+rFBZr-qeN zTHI#!Vfz&FXg_qNH!cWbX_%xigbR#MTo0o{yw!Er$Rr}5I>`J*N?T7UOBL&@FbJ9`IQhr!GO)@avyiwAvvRU?;N~!0+q$!y zTghb2s5T?BBf~GMH<8P-?6qYZHJ52cV3(0y$Y<41E>Ch3Gjx8FyP_e2yTw;&(aoEs z6Nu?(L6U7lwj!H~9TR6{x-0TE;RPwDUM6Yk5wuiv#6F?pA#~jQ9)DbQgA1}wyCZ50 zA{W9cKr(;1>>Z`2#s@zh>ID12nNx53fvT+_CLd}`@!q8}|`Vg`4&y|F8o zku;)Pk?q)WvW=RQ;G{5DfljADSF$$a80WIu15W%?SFo0;Cxg3wlJe;LI$x#AXaj-! zdFT^@wwYkeRraRc<)#vxH`9u;t&YTHJUu0XLhXt$F1r%eFU}%H-;=Zna>mayP(?+&NuCmfH(*AioLXWT%BNsrRk=;!_fPm9I5S2H zhLW3c)!1t%87CxaC(_lILzffO7$Cc$J4_?#EOg(+&0hAOH!H=l^;(T8HJiKY`eH?q z#yNI}43G%EVzmEo#uZ<0SQ1Ev|C&rzt!jX^1)@q~RENJ zWnA@>xHH0(`rBvD?&zgn`g^d<8S|Olo_nAA{DQD!!NH0m#r4)Q@yot*=Czx%+)t*N zU_tIqLV`N7ZcIJFChp1VD`&(mmV}I8K!YARCEIFb_s|+uu?L>`I(V`Of*&|Nz;BL| z!woFxMl;4(3q}aN?F-;Cw`IM_^GTJ0)9|1#y!8$bwvsHqKouV*C}=sWYwz^^O`CmW zx}yOjfpbOH_fL$6)`WA8n8Fj{6~H8nL=bz%JJEMwxrnO7eBMpNgftU|#5g0;?Cs9S zF9fS_uK z+T+H!Vr&2MC>flyvK~NL(^+lrLP057SU}64^q*{#N1=f{S-NEwls^0N)0HyiB@xPv zz){$*pTkOqf}f>Dq-8+PQ`3A$QROj6;__C+`_O)-(B{%_N-7UckS#zteHA+<(+n|~^-=$pJyS&M zBfjR-F-WF4RiFfI##Y}g7;P02{SV+<9fW>Il$u_X^V>xOG1-vzxkK2L7LD4g*dqpx&D+$-H zT*BYe>#Qwgs~B-rA}6NqEoVxi4L7lQ-;2UDFkK8ELYFT3mNUpekLBrv(?W2p@D}JPlMFLOORJ zip&0NMSr7gt8T^g9&3%U^Wevcpb&-|yP_uPgMR^o3G0XIvR{i&@g#Z8aWu z9f9TFybiB!dVL*7wa(a!=QfQLzw)EB=YzWzI?ky3|0;j5E~{E`NG!uV;Qd<0$Q|wX zNVuxHL3wpYbr+LZmHkNdSD5jzW<1}x#jOd6oFYBkud!*y$Zy7`#;Ax2PgbiJo=W3s zizmohgXHfGKegvd6)tEdHe6YmI4TbodHnFxe(JJm1x#05%@ygY8gnlqPcVX8#<&{R zhD=azIIAjb)>)Bkx+@n{3SHSfm@)Uy$_6dn-F(=Mz9K|ax zqu%QP>WMw)OB~PYYhBH}IXBN@#BRZEfmiaXj_E;8Okxs0Vw+m!wMcGYEHV=R_v8Nn DdE_Y! literal 0 HcmV?d00001 diff --git a/src/app/(dashboard)/areas/page.tsx b/src/app/(dashboard)/areas/page.tsx new file mode 100644 index 0000000..976805a --- /dev/null +++ b/src/app/(dashboard)/areas/page.tsx @@ -0,0 +1,84 @@ +'use client' +import { useEffect, useState } from 'react' +import dynamic from 'next/dynamic' +import { Area, Producer } from '@/types' +import { RiskBadge } from '@/components/RiskBadge' +import FileUpload from '@/components/FileUpload' + +const MapView = dynamic(() => import('@/components/MapView'), { + ssr: false, + loading: () =>
Carregando mapa...
+}) + +export default function AreasPage() { + const [areas, setAreas] = useState([]) + const [producers, setProducers] = useState([]) + const [loading, setLoading] = useState(true) + + useEffect(() => { + Promise.all([ + fetch('/api/areas').then(r => r.json()), + fetch('/api/producers').then(r => r.json()) + ]).then(([areasData, producersData]) => { + setAreas(areasData) + setProducers(producersData) + setLoading(false) + }) + }, []) + + const totalHa = areas.reduce((s, a) => s + (a.area_ha || 0), 0) + + if (loading) return
Carregando...
+ + return ( +
+
+
+

Áreas Georreferenciadas

+

{areas.length} áreas mapeadas • {totalHa.toLocaleString()} ha total

+
+
+ + + +
+

Upload GeoJSON/KML

+ alert(`Arquivo: ${f.name}`)} accept=".geojson,.kml,.json" /> +
+ +
+ + + + + + + + + + + + + {areas.map(a => ( + + + + + + + + + ))} + {areas.length === 0 && ( + + )} + +
NomeProdutorBiomaÁrea (ha)RiscoDesmatamento
{a.name}{producers.find(p => p.id === a.producer_id)?.name || 'N/A'}{a.biome || 'N/A'}{(a.area_ha || 0).toLocaleString()} + + {a.deforestation_flag || 'N/A'} + +
Nenhuma área cadastrada
+
+
+ ) +} diff --git a/src/app/(dashboard)/audit/page.tsx b/src/app/(dashboard)/audit/page.tsx new file mode 100644 index 0000000..349b35a --- /dev/null +++ b/src/app/(dashboard)/audit/page.tsx @@ -0,0 +1,76 @@ +'use client' +import { useEffect, useState } from 'react' +import { AuditLog } from '@/types' + +const actionColors: Record = { + create: '#4caf50', + update: '#2196f3', + submit: '#ff9800', + approve: '#4caf50', + reject: '#f44336', + flag: '#ff9800', + block: '#f44336', + delete: '#9e9e9e' +} + +export default function AuditPage() { + const [logs, setLogs] = useState([]) + const [loading, setLoading] = useState(true) + + useEffect(() => { + fetch('/api/audit').then(r => r.json()).then(data => { + setLogs(data) + setLoading(false) + }) + }, []) + + if (loading) return
Carregando...
+ + return ( +
+
+

Histórico de Auditoria

+

Registro imutável de todas as ações do sistema

+
+
+
+
+ {logs.map(log => ( +
+
+
+
+ + {log.action} + + + {log.created_at ? new Date(log.created_at).toLocaleString('pt-BR') : ''} + +
+
{log.details || 'Ação registrada'}
+
+ {log.entity_type} #{log.entity_id} • User #{log.user_id || 'system'} +
+
+
+ ))} + {logs.length === 0 && ( +
Nenhum log de auditoria
+ )} +
+
+
+ ) +} diff --git a/src/app/(dashboard)/companies/page.tsx b/src/app/(dashboard)/companies/page.tsx new file mode 100644 index 0000000..a790210 --- /dev/null +++ b/src/app/(dashboard)/companies/page.tsx @@ -0,0 +1,104 @@ +'use client' +import { useEffect, useState } from 'react' +import { Company, Producer } from '@/types' + +export default function CompaniesPage() { + const [companies, setCompanies] = useState([]) + const [producers, setProducers] = useState([]) + const [loading, setLoading] = useState(true) + const [showModal, setShowModal] = useState(false) + const [form, setForm] = useState({ name: '', cnpj: '', state: '', city: '', eu_operator_id: '' }) + + useEffect(() => { + Promise.all([ + fetch('/api/companies').then(r => r.json()), + fetch('/api/producers').then(r => r.json()) + ]).then(([companiesData, producersData]) => { + setCompanies(companiesData) + setProducers(producersData) + setLoading(false) + }) + }, []) + + const handleCreate = async () => { + if (!form.name) return + const res = await fetch('/api/companies', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(form) + }) + if (res.ok) { + const newCompany = await res.json() + setCompanies([newCompany, ...companies]) + setShowModal(false) + setForm({ name: '', cnpj: '', state: '', city: '', eu_operator_id: '' }) + } + } + + if (loading) return
Carregando...
+ + return ( +
+
+
+

Empresas

+

Gestão de empresas operadoras EUDR

+
+ +
+
+ {companies.map(c => ( +
+
+
{c.name}
+
CNPJ: {c.cnpj || 'N/A'} • {c.city || ''}/{c.state || ''}
+
EU Operator: {c.eu_operator_id || 'N/A'}
+
+
+
{producers.filter(p => p.company_id === c.id).length}
+
produtores
+
+
+ ))} + {companies.length === 0 &&
Nenhuma empresa cadastrada
} +
+ + {/* Modal */} + {showModal && ( +
setShowModal(false)}> +
e.stopPropagation()}> +

Nova Empresa

+
+
+ + setForm({...form, name: e.target.value})} className="w-full bg-[#F5F6F8] border border-gray-200 rounded-lg px-4 py-3 text-[#2D3142] focus:border-[#1A7A4C] focus:outline-none" /> +
+
+ + setForm({...form, cnpj: e.target.value})} className="w-full bg-[#F5F6F8] border border-gray-200 rounded-lg px-4 py-3 text-[#2D3142] focus:border-[#1A7A4C] focus:outline-none" /> +
+
+
+ + setForm({...form, state: e.target.value})} className="w-full bg-[#F5F6F8] border border-gray-200 rounded-lg px-4 py-3 text-[#2D3142] focus:border-[#1A7A4C] focus:outline-none" /> +
+
+ + setForm({...form, city: e.target.value})} className="w-full bg-[#F5F6F8] border border-gray-200 rounded-lg px-4 py-3 text-[#2D3142] focus:border-[#1A7A4C] focus:outline-none" /> +
+
+
+ + setForm({...form, eu_operator_id: e.target.value})} className="w-full bg-[#F5F6F8] border border-gray-200 rounded-lg px-4 py-3 text-[#2D3142] focus:border-[#1A7A4C] focus:outline-none" /> +
+
+
+ + +
+
+
+ )} +
+ ) +} diff --git a/src/app/(dashboard)/dashboard/page.tsx b/src/app/(dashboard)/dashboard/page.tsx new file mode 100644 index 0000000..e2b0987 --- /dev/null +++ b/src/app/(dashboard)/dashboard/page.tsx @@ -0,0 +1,127 @@ +'use client' +import { useEffect, useState } from 'react' +import StatsCard from '@/components/StatsCard' +import { StatusBadge, RiskBadge } from '@/components/RiskBadge' +import DDSCard from '@/components/DDSCard' + +interface DashboardStats { + total_companies: number + total_producers: number + total_areas: number + total_lots: number + total_dds: number + dds_by_status: { draft: number; submitted: number; approved: number; rejected: number } + risk_distribution: { pending: number; verified: number; flagged: number; blocked: number } + recent_audit: Array<{ id: number; entity_type: string; action: string; details: string | null; created_at: string | null }> +} + +export default function DashboardPage() { + const [stats, setStats] = useState(null) + const [dds, setDds] = useState([]) + const [lots, setLots] = useState([]) + const [loading, setLoading] = useState(true) + + useEffect(() => { + Promise.all([ + fetch('/api/dashboard/stats').then(r => r.json()), + fetch('/api/dds').then(r => r.json()), + fetch('/api/lots').then(r => r.json()) + ]).then(([statsData, ddsData, lotsData]) => { + setStats(statsData) + setDds(ddsData) + setLots(lotsData) + setLoading(false) + }) + }, []) + + if (loading || !stats) { + return
Carregando dashboard...
+ } + + const ddsApproved = stats.dds_by_status.approved + const lotsBlocked = stats.risk_distribution.blocked + const highRiskLots = lots.filter(l => l.status === 'flagged' || l.status === 'blocked') + + return ( +
+
+
+

Dashboard

+

Visão geral do compliance EUDR

+
+
Última atualização: {new Date().toLocaleString('pt-BR')}
+
+ +
+ + + + + + 0 ? `${Math.round(ddsApproved / stats.total_dds * 100)}%` : '0%'} /> + + +
+ +
+
+

📄 Declarações Recentes

+
+ {dds.slice(0, 4).map((d: any) => )} + {dds.length === 0 &&
Nenhuma DDS encontrada
} +
+
+
+

📋 Auditoria Recente

+
+ {stats.recent_audit.slice(0, 6).map(log => ( +
+
+
{log.details || 'Ação registrada'}
+
{log.entity_type} • {log.action}
+
+
{log.created_at ? new Date(log.created_at).toLocaleDateString('pt-BR') : ''}
+
+ ))} + {stats.recent_audit.length === 0 &&
Nenhum log de auditoria
} +
+
+
+ +
+

🏷️ Lotes com Alertas

+
+ + + + + + + + + + + + {highRiskLots.map(lot => ( + + + + + + + + ))} + {highRiskLots.length === 0 && ( + + + + )} + +
ReferênciaProdutorQtd (kg)ScoreStatus
{lot.reference}{lot.producer?.name || 'N/A'}{(lot.quantity_kg || 0).toLocaleString()} + = 70 ? 'low' : (lot.risk_score || 0) >= 40 ? 'medium' : 'high'} /> +
Nenhum lote com alerta
+
+
+
+ ) +} diff --git a/src/app/(dashboard)/dds/page.tsx b/src/app/(dashboard)/dds/page.tsx new file mode 100644 index 0000000..34685da --- /dev/null +++ b/src/app/(dashboard)/dds/page.tsx @@ -0,0 +1,166 @@ +'use client' +import { useEffect, useState } from 'react' +import DDSCard from '@/components/DDSCard' +import { StatusBadge } from '@/components/RiskBadge' +import { DdsStatement, Company } from '@/types' + +export default function DDSPage() { + const [ddsList, setDdsList] = useState([]) + const [companies, setCompanies] = useState([]) + const [loading, setLoading] = useState(true) + const [showModal, setShowModal] = useState(false) + const [selectedCompany, setSelectedCompany] = useState('') + const [assessment, setAssessment] = useState('standard') + const [generating, setGenerating] = useState(false) + + useEffect(() => { + Promise.all([ + fetch('/api/dds').then(r => r.json()), + fetch('/api/companies').then(r => r.json()) + ]).then(([ddsData, companiesData]) => { + setDdsList(ddsData) + setCompanies(companiesData) + setLoading(false) + }) + }, []) + + const handleGenerate = async () => { + if (!selectedCompany) return + setGenerating(true) + + const res = await fetch('/api/dds', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + company_id: parseInt(selectedCompany), + risk_assessment: assessment + }) + }) + + if (res.ok) { + const newDDS = await res.json() + const company = companies.find(c => c.id === parseInt(selectedCompany)) + newDDS.company = company + setDdsList([newDDS, ...ddsList]) + setShowModal(false) + setSelectedCompany('') + setAssessment('standard') + } + setGenerating(false) + } + + const handleSubmit = async (id: number) => { + const res = await fetch(`/api/dds/${id}/submit`, { method: 'POST' }) + if (res.ok) { + const updated = await res.json() + setDdsList(ddsList.map(d => d.id === id ? { ...d, ...updated } : d)) + } + } + + if (loading) return
Carregando...
+ + const statusCounts = { + draft: ddsList.filter(d => d.status === 'draft').length, + submitted: ddsList.filter(d => d.status === 'submitted').length, + approved: ddsList.filter(d => d.status === 'approved').length, + rejected: ddsList.filter(d => d.status === 'rejected').length + } + + return ( +
+
+
+

Declarações de Due Diligence

+

Gerar, revisar e enviar DDS para o sistema da UE

+
+ +
+ +
+ {(['draft', 'submitted', 'approved', 'rejected'] as const).map(s => ( +
+
{statusCounts[s]}
+ +
+ ))} +
+ +
+ {ddsList.map(dds => ( +
+ + {dds.status === 'draft' && ( + + )} +
+ ))} + {ddsList.length === 0 && ( +
Nenhuma DDS encontrada
+ )} +
+ + {/* Modal Gerar Nova DDS */} + {showModal && ( +
setShowModal(false)}> +
e.stopPropagation()}> +

Gerar Nova DDS

+ +
+
+ + +
+ +
+ + +
+ +
+ ℹ️ A DDS será gerada com base nos dados cadastrados da empresa, seus produtores, áreas e lotes associados. +
+
+ +
+ + +
+
+
+ )} +
+ ) +} diff --git a/src/app/(dashboard)/due-diligence/page.tsx b/src/app/(dashboard)/due-diligence/page.tsx new file mode 100644 index 0000000..3dbd029 --- /dev/null +++ b/src/app/(dashboard)/due-diligence/page.tsx @@ -0,0 +1,137 @@ +'use client' +import { useEffect, useState } from 'react' +import { Lot, Area, Producer } from '@/types' +import { RiskBadge, StatusBadge } from '@/components/RiskBadge' + +const CHECKLIST = [ + { key: 'geolocation_provided', label: 'Geolocalização fornecida', weight: 20 }, + { key: 'deforestation_free', label: 'Livre de desmatamento pós 2020', weight: 25 }, + { key: 'legal_compliance', label: 'Conformidade legal (CAR)', weight: 20 }, + { key: 'producer_identified', label: 'Produtor identificado', weight: 10 }, + { key: 'supply_chain_mapped', label: 'Cadeia mapeada', weight: 10 }, + { key: 'quantity_verified', label: 'Quantidade verificada', weight: 5 }, + { key: 'harvest_date_valid', label: 'Data colheita válida', weight: 5 }, + { key: 'documentation_complete', label: 'Documentação completa', weight: 5 }, +] + +function evaluateLot(lot: Lot, areas: Area[], producers: Producer[]) { + const area = areas.find(a => a.id === lot.area_id) + const producer = producers.find(p => p.id === lot.producer_id) + const checks: Record = { + geolocation_provided: !!area, + deforestation_free: area?.deforestation_flag === 'clean', + legal_compliance: !!producer?.car_code, + producer_identified: !!lot.producer_id, + supply_chain_mapped: !!lot.producer_id && !!lot.area_id, + quantity_verified: (lot.quantity_kg || 0) > 0, + harvest_date_valid: !!lot.harvest_date, + documentation_complete: false, + } + checks.documentation_complete = checks.geolocation_provided && checks.producer_identified && checks.harvest_date_valid + let score = 0 + CHECKLIST.forEach(c => { if (checks[c.key]) score += c.weight }) + const flags: string[] = [] + if (!checks.geolocation_provided) flags.push('MISSING_GEOLOCATION') + if (!checks.deforestation_free) flags.push('DEFORESTATION_ALERT') + if (!checks.legal_compliance) flags.push('MISSING_CAR') + const level = score >= 80 ? 'low' : score >= 50 ? 'medium' : score >= 25 ? 'high' : 'critical' + return { checks, score, level, flags } +} + +export default function DueDiligencePage() { + const [lots, setLots] = useState([]) + const [areas, setAreas] = useState([]) + const [producers, setProducers] = useState([]) + const [loading, setLoading] = useState(true) + const [selectedLot, setSelectedLot] = useState(null) + + useEffect(() => { + Promise.all([ + fetch('/api/lots').then(r => r.json()), + fetch('/api/areas').then(r => r.json()), + fetch('/api/producers').then(r => r.json()) + ]).then(([lotsData, areasData, producersData]) => { + setLots(lotsData) + setAreas(areasData) + setProducers(producersData) + if (lotsData.length > 0) setSelectedLot(lotsData[0]) + setLoading(false) + }) + }, []) + + if (loading) return
Carregando...
+ + const result = selectedLot ? evaluateLot(selectedLot, areas, producers) : null + + return ( +
+
+

Motor de Due Diligence

+

Avaliação EUDR — Checklist, scoring de risco e flags

+
+ +
+
+

Selecionar Lote

+
+ {lots.map(l => ( + + ))} + {lots.length === 0 &&
Nenhum lote cadastrado
} +
+
+ +
+ {selectedLot && result ? ( + <> +
+
+

Resultado: {selectedLot.reference}

+ +
+
+
+
= 80 ? 'text-green-500' : result.score >= 50 ? 'text-yellow-500' : 'text-red-500'}`}>{result.score}
+
Score /100
+
+
+
= 80 ? 'bg-green-500' : result.score >= 50 ? 'bg-yellow-500' : 'bg-red-500'}`} style={{ width: `${result.score}%` }} /> +
+
+ + {result.flags.length > 0 && ( +
+
⚠️ Flags
+ {result.flags.map(f =>
• {f}
)} +
+ )} +
+ +
+

Checklist EUDR

+
+ {CHECKLIST.map(c => ( +
+
+ {result.checks[c.key] ? '✅' : '❌'} + {c.label} +
+ {c.weight} pts +
+ ))} +
+
+ + ) : ( +
Selecione um lote para avaliar
+ )} +
+
+
+ ) +} diff --git a/src/app/(dashboard)/layout.tsx b/src/app/(dashboard)/layout.tsx new file mode 100644 index 0000000..a4cfb93 --- /dev/null +++ b/src/app/(dashboard)/layout.tsx @@ -0,0 +1,35 @@ +'use client' +import { useSession } from 'next-auth/react' +import { useRouter } from 'next/navigation' +import { useEffect } from 'react' +import Sidebar from '@/components/Sidebar' + +export default function DashboardLayout({ children }: { children: React.ReactNode }) { + const { data: session, status } = useSession() + const router = useRouter() + + useEffect(() => { + if (status === 'unauthenticated') { + router.push('/login') + } + }, [status, router]) + + if (status === 'loading') { + return ( +
+
Carregando...
+
+ ) + } + + if (!session) { + return null + } + + return ( +
+ +
{children}
+
+ ) +} diff --git a/src/app/(dashboard)/lots/page.tsx b/src/app/(dashboard)/lots/page.tsx new file mode 100644 index 0000000..a635a50 --- /dev/null +++ b/src/app/(dashboard)/lots/page.tsx @@ -0,0 +1,169 @@ +'use client' +import { useEffect, useState } from 'react' +import { Lot, Producer, Product, Area } from '@/types' +import { StatusBadge } from '@/components/RiskBadge' + +export default function LotsPage() { + const [lots, setLots] = useState([]) + const [producers, setProducers] = useState([]) + const [products, setProducts] = useState([]) + const [areas, setAreas] = useState([]) + const [loading, setLoading] = useState(true) + const [showModal, setShowModal] = useState(false) + const [form, setForm] = useState({ reference: '', product_id: '', area_id: '', producer_id: '', quantity_kg: '', harvest_date: '' }) + + useEffect(() => { + Promise.all([ + fetch('/api/lots').then(r => r.json()), + fetch('/api/producers').then(r => r.json()), + fetch('/api/products').then(r => r.json()), + fetch('/api/areas').then(r => r.json()) + ]).then(([lotsData, producersData, productsData, areasData]) => { + setLots(lotsData) + setProducers(producersData) + setProducts(productsData) + setAreas(areasData) + setLoading(false) + }) + }, []) + + const handleCreate = async () => { + if (!form.reference) return + const res = await fetch('/api/lots', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + reference: form.reference, + product_id: form.product_id ? parseInt(form.product_id) : null, + area_id: form.area_id ? parseInt(form.area_id) : null, + producer_id: form.producer_id ? parseInt(form.producer_id) : null, + quantity_kg: form.quantity_kg ? parseFloat(form.quantity_kg) : null, + harvest_date: form.harvest_date || null + }) + }) + if (res.ok) { + const newLot = await res.json() + setLots([newLot, ...lots]) + setShowModal(false) + setForm({ reference: '', product_id: '', area_id: '', producer_id: '', quantity_kg: '', harvest_date: '' }) + } + } + + if (loading) return
Carregando...
+ + const statusCounts = { + verified: lots.filter(l => l.status === 'verified').length, + pending: lots.filter(l => l.status === 'pending').length, + flagged: lots.filter(l => l.status === 'flagged').length, + blocked: lots.filter(l => l.status === 'blocked').length + } + + return ( +
+
+
+

Lotes EUDR

+

{lots.length} lotes rastreados

+
+ +
+ +
+ {(['verified', 'pending', 'flagged', 'blocked'] as const).map(s => ( +
+
{statusCounts[s]}
+ +
+ ))} +
+ +
+ + + + + + + + + + + + + + + {lots.map(l => ( + + + + + + + + + + + ))} + {lots.length === 0 && ( + + )} + +
ReferênciaProdutoProdutorÁreaQtd (kg)ColheitaScoreStatus
{l.reference}{l.product?.name || products.find(p => p.id === l.product_id)?.name || 'N/A'}{l.producer?.name || producers.find(p => p.id === l.producer_id)?.name || 'N/A'}{l.area?.name || areas.find(a => a.id === l.area_id)?.name || 'N/A'}{(l.quantity_kg || 0).toLocaleString()}{l.harvest_date || 'N/A'} + = 80 ? 'text-green-500' : (l.risk_score || 0) >= 50 ? 'text-yellow-500' : 'text-red-500'}`}> + {l.risk_score || 0} + +
Nenhum lote cadastrado
+
+ + {/* Modal */} + {showModal && ( +
setShowModal(false)}> +
e.stopPropagation()}> +

Novo Lote

+
+
+ + setForm({...form, reference: e.target.value})} placeholder="LOT-2025-XXX" className="w-full bg-[#F5F6F8] border border-gray-200 rounded-lg px-4 py-3 text-[#2D3142] focus:border-[#1A7A4C] focus:outline-none" /> +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + setForm({...form, quantity_kg: e.target.value})} className="w-full bg-[#F5F6F8] border border-gray-200 rounded-lg px-4 py-3 text-[#2D3142] focus:border-[#1A7A4C] focus:outline-none" /> +
+
+ + setForm({...form, harvest_date: e.target.value})} className="w-full bg-[#F5F6F8] border border-gray-200 rounded-lg px-4 py-3 text-[#2D3142] focus:border-[#1A7A4C] focus:outline-none" /> +
+
+
+
+ + +
+
+
+ )} +
+ ) +} diff --git a/src/app/(dashboard)/producers/page.tsx b/src/app/(dashboard)/producers/page.tsx new file mode 100644 index 0000000..5bb8e97 --- /dev/null +++ b/src/app/(dashboard)/producers/page.tsx @@ -0,0 +1,127 @@ +'use client' +import { useEffect, useState } from 'react' +import { Producer, Company, Area } from '@/types' + +export default function ProducersPage() { + const [producers, setProducers] = useState([]) + const [companies, setCompanies] = useState([]) + const [areas, setAreas] = useState([]) + const [loading, setLoading] = useState(true) + const [showModal, setShowModal] = useState(false) + const [form, setForm] = useState({ name: '', cpf_cnpj: '', company_id: '', state: '', city: '', car_code: '' }) + + useEffect(() => { + Promise.all([ + fetch('/api/producers').then(r => r.json()), + fetch('/api/companies').then(r => r.json()), + fetch('/api/areas').then(r => r.json()) + ]).then(([producersData, companiesData, areasData]) => { + setProducers(producersData) + setCompanies(companiesData) + setAreas(areasData) + setLoading(false) + }) + }, []) + + const handleCreate = async () => { + if (!form.name) return + const res = await fetch('/api/producers', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ ...form, company_id: form.company_id ? parseInt(form.company_id) : null }) + }) + if (res.ok) { + const newProducer = await res.json() + setProducers([newProducer, ...producers]) + setShowModal(false) + setForm({ name: '', cpf_cnpj: '', company_id: '', state: '', city: '', car_code: '' }) + } + } + + if (loading) return
Carregando...
+ + return ( +
+
+
+

Produtores

+

{producers.length} produtores cadastrados

+
+ +
+
+ + + + + + + + + + + + + {producers.map(p => ( + + + + + + + + + ))} + {producers.length === 0 && ( + + )} + +
NomeCPF/CNPJEmpresaLocalizaçãoCARÁreas
{p.name}{p.cpf_cnpj || 'N/A'}{companies.find(c => c.id === p.company_id)?.name || 'N/A'}{p.city || ''}/{p.state || ''}{p.car_code || 'N/A'}{areas.filter(a => a.producer_id === p.id).length}
Nenhum produtor cadastrado
+
+ + {/* Modal */} + {showModal && ( +
setShowModal(false)}> +
e.stopPropagation()}> +

Novo Produtor

+
+
+ + setForm({...form, name: e.target.value})} className="w-full bg-[#F5F6F8] border border-gray-200 rounded-lg px-4 py-3 text-[#2D3142] focus:border-[#1A7A4C] focus:outline-none" /> +
+
+ + setForm({...form, cpf_cnpj: e.target.value})} className="w-full bg-[#F5F6F8] border border-gray-200 rounded-lg px-4 py-3 text-[#2D3142] focus:border-[#1A7A4C] focus:outline-none" /> +
+
+ + +
+
+
+ + setForm({...form, state: e.target.value})} className="w-full bg-[#F5F6F8] border border-gray-200 rounded-lg px-4 py-3 text-[#2D3142] focus:border-[#1A7A4C] focus:outline-none" /> +
+
+ + setForm({...form, city: e.target.value})} className="w-full bg-[#F5F6F8] border border-gray-200 rounded-lg px-4 py-3 text-[#2D3142] focus:border-[#1A7A4C] focus:outline-none" /> +
+
+
+ + setForm({...form, car_code: e.target.value})} className="w-full bg-[#F5F6F8] border border-gray-200 rounded-lg px-4 py-3 text-[#2D3142] focus:border-[#1A7A4C] focus:outline-none" /> +
+
+
+ + +
+
+
+ )} +
+ ) +} diff --git a/src/app/(dashboard)/products/page.tsx b/src/app/(dashboard)/products/page.tsx new file mode 100644 index 0000000..4c9d05e --- /dev/null +++ b/src/app/(dashboard)/products/page.tsx @@ -0,0 +1,107 @@ +'use client' +import { useEffect, useState } from 'react' +import { Product } from '@/types' + +const categoryEmoji: Record = { + soya: '🫘', + coffee: '☕', + wood: '🪵', + cocoa: '🍫', + cattle: '🐄', + oil_palm: '🌴', + rubber: '🏭' +} + +export default function ProductsPage() { + const [products, setProducts] = useState([]) + const [loading, setLoading] = useState(true) + const [showModal, setShowModal] = useState(false) + const [form, setForm] = useState({ name: '', hs_code: '', eudr_category: '', description: '' }) + + useEffect(() => { + fetch('/api/products').then(r => r.json()).then(data => { + setProducts(data) + setLoading(false) + }) + }, []) + + const handleCreate = async () => { + if (!form.name) return + const res = await fetch('/api/products', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(form) + }) + if (res.ok) { + const newProduct = await res.json() + setProducts([newProduct, ...products]) + setShowModal(false) + setForm({ name: '', hs_code: '', eudr_category: '', description: '' }) + } + } + + if (loading) return
Carregando...
+ + return ( +
+
+
+

Produtos Regulados EUDR

+

7 categorias regulamentadas pelo EUDR

+
+ +
+
+ {products.map(p => ( +
+
{categoryEmoji[p.eudr_category || ''] || '📦'}
+
{p.name}
+
HS Code: {p.hs_code || 'N/A'}
+
Categoria EUDR: {p.eudr_category || 'N/A'}
+
+ ))} + {products.length === 0 &&
Nenhum produto cadastrado
} +
+ + {/* Modal */} + {showModal && ( +
setShowModal(false)}> +
e.stopPropagation()}> +

Novo Produto

+
+
+ + setForm({...form, name: e.target.value})} className="w-full bg-[#F5F6F8] border border-gray-200 rounded-lg px-4 py-3 text-[#2D3142] focus:border-[#1A7A4C] focus:outline-none" /> +
+
+ + setForm({...form, hs_code: e.target.value})} className="w-full bg-[#F5F6F8] border border-gray-200 rounded-lg px-4 py-3 text-[#2D3142] focus:border-[#1A7A4C] focus:outline-none" /> +
+
+ + +
+
+ + setForm({...form, description: e.target.value})} className="w-full bg-[#F5F6F8] border border-gray-200 rounded-lg px-4 py-3 text-[#2D3142] focus:border-[#1A7A4C] focus:outline-none" /> +
+
+
+ + +
+
+
+ )} +
+ ) +} diff --git a/src/app/(dashboard)/settings/page.tsx b/src/app/(dashboard)/settings/page.tsx new file mode 100644 index 0000000..1b35b31 --- /dev/null +++ b/src/app/(dashboard)/settings/page.tsx @@ -0,0 +1,68 @@ +'use client' +import { useSession } from 'next-auth/react' + +export default function SettingsPage() { + const { data: session } = useSession() + + return ( +
+
+

Configurações

+

Configurações do sistema DUORIGIN

+
+
+
+

👤 Usuário Atual

+
+
Email: {session?.user?.email}
+
Nome: {session?.user?.name || 'N/A'}
+
Perfil: {session?.user?.role || 'operator'}
+
+
+ +
+

🔗 Integração EU

+
+
+ + +
+
+ + +
+
✓ Conexão ativa (mock)
+
+
+ +
+

📧 Notificações

+
+ {['Alertas de desmatamento', 'DDS aprovada/rejeitada', 'Novos lotes flagged', 'Relatórios semanais'].map(n => ( + + ))} +
+
+ +
+

⚙️ Sistema

+
+
Versão: 2.0.0
+
Backend: Next.js API Routes ✓
+
Database: PostgreSQL (Prisma) ✓
+
+
+
+
+ ) +} diff --git a/src/app/api/areas/[id]/route.ts b/src/app/api/areas/[id]/route.ts new file mode 100644 index 0000000..f7380ed --- /dev/null +++ b/src/app/api/areas/[id]/route.ts @@ -0,0 +1,42 @@ +import { NextResponse } from 'next/server' +import { prisma } from '@/lib/prisma' + +export async function GET(request: Request, { params }: { params: { id: string } }) { + try { + const area = await prisma.area.findUnique({ + where: { id: parseInt(params.id) }, + include: { producer: true, lots: true } + }) + if (!area) { + return NextResponse.json({ error: 'Área não encontrada' }, { status: 404 }) + } + return NextResponse.json(area) + } catch (error) { + console.error('Error fetching area:', error) + return NextResponse.json({ error: 'Erro ao buscar área' }, { status: 500 }) + } +} + +export async function PUT(request: Request, { params }: { params: { id: string } }) { + try { + const body = await request.json() + const area = await prisma.area.update({ + where: { id: parseInt(params.id) }, + data: body + }) + return NextResponse.json(area) + } catch (error) { + console.error('Error updating area:', error) + return NextResponse.json({ error: 'Erro ao atualizar área' }, { status: 500 }) + } +} + +export async function DELETE(request: Request, { params }: { params: { id: string } }) { + try { + await prisma.area.delete({ where: { id: parseInt(params.id) } }) + return NextResponse.json({ ok: true }) + } catch (error) { + console.error('Error deleting area:', error) + return NextResponse.json({ error: 'Erro ao deletar área' }, { status: 500 }) + } +} diff --git a/src/app/api/areas/route.ts b/src/app/api/areas/route.ts new file mode 100644 index 0000000..3e70fab --- /dev/null +++ b/src/app/api/areas/route.ts @@ -0,0 +1,52 @@ +import { NextResponse } from 'next/server' +import { prisma } from '@/lib/prisma' + +export async function GET() { + try { + const areas = await prisma.area.findMany({ + include: { producer: true }, + orderBy: { created_at: 'desc' } + }) + return NextResponse.json(areas) + } catch (error) { + console.error('Error fetching areas:', error) + return NextResponse.json({ error: 'Erro ao buscar áreas' }, { status: 500 }) + } +} + +export async function POST(request: Request) { + try { + const body = await request.json() + + // Calculate area from GeoJSON if provided + if (body.geojson && !body.area_ha) { + try { + const geo = JSON.parse(body.geojson) + if (geo.geometry?.coordinates) { + // Simple area calculation (approximate) + body.area_ha = calculateAreaHa(geo.geometry.coordinates) + } + } catch { + // Ignore GeoJSON parsing errors + } + } + + const area = await prisma.area.create({ data: body }) + return NextResponse.json(area) + } catch (error) { + console.error('Error creating area:', error) + return NextResponse.json({ error: 'Erro ao criar área' }, { status: 500 }) + } +} + +function calculateAreaHa(coordinates: number[][][]): number { + // Simplified area calculation using shoelace formula + // This is approximate - for precise calculations use a proper geo library + if (!coordinates || !coordinates[0]) return 0 + const ring = coordinates[0] + let area = 0 + for (let i = 0; i < ring.length - 1; i++) { + area += ring[i][0] * ring[i + 1][1] - ring[i + 1][0] * ring[i][1] + } + return Math.abs(area / 2) * 111 * 111 * 100 // Convert degrees to hectares (approximate) +} diff --git a/src/app/api/audit/route.ts b/src/app/api/audit/route.ts new file mode 100644 index 0000000..df72e2b --- /dev/null +++ b/src/app/api/audit/route.ts @@ -0,0 +1,26 @@ +import { NextResponse } from 'next/server' +import { prisma } from '@/lib/prisma' + +export async function GET() { + try { + const logs = await prisma.auditLog.findMany({ + orderBy: { created_at: 'desc' }, + take: 100 + }) + return NextResponse.json(logs) + } catch (error) { + console.error('Error fetching audit logs:', error) + return NextResponse.json({ error: 'Erro ao buscar logs de auditoria' }, { status: 500 }) + } +} + +export async function POST(request: Request) { + try { + const body = await request.json() + const log = await prisma.auditLog.create({ data: body }) + return NextResponse.json(log) + } catch (error) { + console.error('Error creating audit log:', error) + return NextResponse.json({ error: 'Erro ao criar log de auditoria' }, { status: 500 }) + } +} diff --git a/src/app/api/auth/[...nextauth]/route.ts b/src/app/api/auth/[...nextauth]/route.ts new file mode 100644 index 0000000..e10628f --- /dev/null +++ b/src/app/api/auth/[...nextauth]/route.ts @@ -0,0 +1,6 @@ +import NextAuth from 'next-auth' +import { authOptions } from '@/lib/auth' + +const handler = NextAuth(authOptions) + +export { handler as GET, handler as POST } diff --git a/src/app/api/auth/login/route.ts b/src/app/api/auth/login/route.ts new file mode 100644 index 0000000..eadc98f --- /dev/null +++ b/src/app/api/auth/login/route.ts @@ -0,0 +1,57 @@ +import { NextRequest } from 'next/server' +import prisma from '@/lib/prisma' +import { createToken, jsonResponse, errorResponse } from '@/lib/auth' +import { verifyPassword } from '@/lib/password' + +interface LoginRequest { + email: string + password: string +} + +interface TokenResponse { + accessToken: string + tokenType: string +} + +export async function POST(request: NextRequest) { + try { + const body: LoginRequest = await request.json() + + if (!body.email || !body.password) { + return errorResponse('Email e senha são obrigatórios', 400) + } + + const user = await prisma.user.findUnique({ + where: { email: body.email }, + }) + + if (!user) { + return errorResponse('Credenciais inválidas', 401) + } + + const validPassword = await verifyPassword(body.password, user.hashed_password) + if (!validPassword) { + return errorResponse('Credenciais inválidas', 401) + } + + if (!user.is_active) { + return errorResponse('Usuário desativado', 403) + } + + const accessToken = await createToken({ + id: user.id, + email: user.email, + role: user.role || 'operator', + }) + + const response: TokenResponse = { + accessToken, + tokenType: 'bearer', + } + + return jsonResponse(response) + } catch (error) { + console.error('Login error:', error) + return errorResponse('Erro interno do servidor', 500) + } +} diff --git a/src/app/api/auth/me/route.ts b/src/app/api/auth/me/route.ts new file mode 100644 index 0000000..1f2aebd --- /dev/null +++ b/src/app/api/auth/me/route.ts @@ -0,0 +1,43 @@ +import { NextRequest } from 'next/server' +import prisma from '@/lib/prisma' +import { requireAuth, jsonResponse, errorResponse } from '@/lib/auth' + +interface UserOut { + id: number + email: string + fullName: string | null + role: string | null + isActive: boolean | null + createdAt: Date | null +} + +export async function GET(request: NextRequest) { + try { + const authUser = await requireAuth(request) + + const user = await prisma.user.findUnique({ + where: { id: authUser.id }, + }) + + if (!user) { + return errorResponse('Usuário não encontrado', 404) + } + + const response: UserOut = { + id: user.id, + email: user.email, + fullName: user.full_name, + role: user.role, + isActive: user.is_active, + createdAt: user.created_at, + } + + return jsonResponse(response) + } catch (error) { + if (error instanceof Error && error.message === 'Unauthorized') { + return errorResponse('Não autorizado', 401) + } + console.error('Me error:', error) + return errorResponse('Erro interno do servidor', 500) + } +} diff --git a/src/app/api/auth/register/route.ts b/src/app/api/auth/register/route.ts new file mode 100644 index 0000000..45ecb95 --- /dev/null +++ b/src/app/api/auth/register/route.ts @@ -0,0 +1,35 @@ +import { NextResponse } from 'next/server' +import { prisma } from '@/lib/prisma' +import bcrypt from 'bcryptjs' + +export async function POST(request: Request) { + try { + const body = await request.json() + const { email, password, full_name, role = 'operator' } = body + + if (!email || !password) { + return NextResponse.json({ error: 'Email e senha são obrigatórios' }, { status: 400 }) + } + + const existing = await prisma.user.findUnique({ where: { email } }) + if (existing) { + return NextResponse.json({ error: 'Email já cadastrado' }, { status: 400 }) + } + + const hashed_password = await bcrypt.hash(password, 10) + + const user = await prisma.user.create({ + data: { email, hashed_password, full_name, role } + }) + + return NextResponse.json({ + id: user.id, + email: user.email, + full_name: user.full_name, + role: user.role + }) + } catch (error) { + console.error('Register error:', error) + return NextResponse.json({ error: 'Erro ao registrar usuário' }, { status: 500 }) + } +} diff --git a/src/app/api/auth/registro/route.ts b/src/app/api/auth/registro/route.ts new file mode 100644 index 0000000..31955bb --- /dev/null +++ b/src/app/api/auth/registro/route.ts @@ -0,0 +1,67 @@ +import { NextRequest } from 'next/server' +import prisma from '@/lib/prisma' +import { jsonResponse, errorResponse } from '@/lib/auth' +import { hashPassword } from '@/lib/password' + +interface UserCreate { + email: string + password: string + fullName?: string + role?: 'admin' | 'operator' | 'viewer' +} + +interface UserOut { + id: number + email: string + fullName: string | null + role: string | null + isActive: boolean | null + createdAt: Date | null +} + +export async function POST(request: NextRequest) { + try { + const body: UserCreate = await request.json() + + if (!body.email || !body.password) { + return errorResponse('Email e senha são obrigatórios', 400) + } + + // Check if email already exists + const existingUser = await prisma.user.findUnique({ + where: { email: body.email }, + }) + + if (existingUser) { + return errorResponse('Email já cadastrado', 400) + } + + // Hash password + const hashedPassword = await hashPassword(body.password) + + // Create user + const user = await prisma.user.create({ + data: { + email: body.email, + hashed_password: hashedPassword, + full_name: body.fullName || null, + role: body.role || 'operator', + is_active: true, + }, + }) + + const response: UserOut = { + id: user.id, + email: user.email, + fullName: user.full_name, + role: user.role, + isActive: user.is_active, + createdAt: user.created_at, + } + + return jsonResponse(response, 201) + } catch (error) { + console.error('Register error:', error) + return errorResponse('Erro interno do servidor', 500) + } +} diff --git a/src/app/api/avaliacoes/[id]/gerar-dds/route.ts b/src/app/api/avaliacoes/[id]/gerar-dds/route.ts new file mode 100644 index 0000000..20dbc85 --- /dev/null +++ b/src/app/api/avaliacoes/[id]/gerar-dds/route.ts @@ -0,0 +1,133 @@ +import { NextRequest } from 'next/server' +import prisma from '@/lib/prisma' +import { requireAuth, jsonResponse, errorResponse } from '@/lib/auth' + +interface RouteParams { + params: Promise<{ id: string }> +} + +interface DDSOut { + id: number + referenceNumber: string + companyId: number | null + status: string | null + riskAssessment: string | null + lotIds: string | null + submissionDate: string | null + euReference: string | null + notes: string | null + createdAt: Date | null + updatedAt: Date | null +} + +// Generate unique DDS reference number +function generateReferenceNumber(): string { + const timestamp = Date.now().toString(36).toUpperCase() + const random = Math.random().toString(36).substring(2, 8).toUpperCase() + return `DDS-${timestamp}-${random}` +} + +// Perform risk assessment based on area data +function assessRisk(area: { + risk_level: string | null + deforestation_flag: string | null + area_ha: number | null +}): string { + if (area.deforestation_flag === 'confirmed' || area.risk_level === 'critical') { + return 'high' + } + if (area.risk_level === 'high' || area.deforestation_flag === 'alert') { + return 'medium' + } + return 'low' +} + +export async function POST(request: NextRequest, { params }: RouteParams) { + try { + const user = await requireAuth(request) + const { id } = await params + const areaId = parseInt(id) + + if (isNaN(areaId)) { + return errorResponse('ID inválido', 400) + } + + const area = await prisma.area.findUnique({ + where: { id: areaId }, + include: { + producer: { + include: { company: true }, + }, + lots: true, + }, + }) + + if (!area) { + return errorResponse('Avaliação não encontrada', 404) + } + + // Get optional body data + let notes = '' + try { + const body = await request.json() + notes = body.notes || '' + } catch { + // No body is fine + } + + // Generate DDS + const referenceNumber = generateReferenceNumber() + const riskAssessment = assessRisk(area) + + // Get lot IDs associated with this area + const lotIds = area.lots.map(l => l.id) + + const dds = await prisma.ddsStatement.create({ + data: { + reference_number: referenceNumber, + company_id: area.producer?.company_id || null, + status: 'draft', + risk_assessment: riskAssessment, + lot_ids: JSON.stringify(lotIds), + notes, + }, + }) + + // Log audit + await prisma.auditLog.create({ + data: { + entity_type: 'DdsStatement', + entity_id: dds.id, + action: 'create', + user_id: user.id, + details: JSON.stringify({ + referenceNumber, + areaId, + riskAssessment, + }), + }, + }) + + const response: DDSOut = { + id: dds.id, + referenceNumber: dds.reference_number, + companyId: dds.company_id, + status: dds.status, + riskAssessment: dds.risk_assessment, + lotIds: dds.lot_ids, + submissionDate: dds.submission_date, + euReference: dds.eu_reference, + notes: dds.notes, + createdAt: dds.created_at, + updatedAt: dds.updated_at, + } + + return jsonResponse(response, 201) + } catch (error) { + if (error instanceof Error && error.message === 'Unauthorized') { + return errorResponse('Não autorizado', 401) + } + console.error('Generate DDS error:', error) + return errorResponse('Erro interno do servidor', 500) + } +} diff --git a/src/app/api/avaliacoes/[id]/route.ts b/src/app/api/avaliacoes/[id]/route.ts new file mode 100644 index 0000000..7ff6c52 --- /dev/null +++ b/src/app/api/avaliacoes/[id]/route.ts @@ -0,0 +1,163 @@ +import { NextRequest } from 'next/server' +import prisma from '@/lib/prisma' +import { requireAuth, jsonResponse, errorResponse } from '@/lib/auth' + +interface AvaliacaoCreate { + name?: string + producerId?: number + geojson?: string + areaHa?: number + biome?: string + latCenter?: number + lonCenter?: number +} + +interface AvaliacaoOut { + id: number + name: string + producerId: number | null + geojson: string | null + areaHa: number | null + biome: string | null + riskLevel: string | null + deforestationFlag: string | null + latCenter: number | null + lonCenter: number | null + createdAt: Date | null +} + +interface RouteParams { + params: Promise<{ id: string }> +} + +export async function GET(request: NextRequest, { params }: RouteParams) { + try { + await requireAuth(request) + const { id } = await params + const avaliacaoId = parseInt(id) + + if (isNaN(avaliacaoId)) { + return errorResponse('ID inválido', 400) + } + + const avaliacao = await prisma.area.findUnique({ + where: { id: avaliacaoId }, + include: { producer: true, lots: true }, + }) + + if (!avaliacao) { + return errorResponse('Avaliação não encontrada', 404) + } + + const response: AvaliacaoOut = { + id: avaliacao.id, + name: avaliacao.name, + producerId: avaliacao.producer_id, + geojson: avaliacao.geojson, + areaHa: avaliacao.area_ha, + biome: avaliacao.biome, + riskLevel: avaliacao.risk_level, + deforestationFlag: avaliacao.deforestation_flag, + latCenter: avaliacao.lat_center, + lonCenter: avaliacao.lon_center, + createdAt: avaliacao.created_at, + } + + return jsonResponse(response) + } catch (error) { + if (error instanceof Error && error.message === 'Unauthorized') { + return errorResponse('Não autorizado', 401) + } + console.error('Get avaliacao error:', error) + return errorResponse('Erro interno do servidor', 500) + } +} + +export async function PUT(request: NextRequest, { params }: RouteParams) { + try { + await requireAuth(request) + const { id } = await params + const avaliacaoId = parseInt(id) + + if (isNaN(avaliacaoId)) { + return errorResponse('ID inválido', 400) + } + + const existing = await prisma.area.findUnique({ + where: { id: avaliacaoId }, + }) + + if (!existing) { + return errorResponse('Avaliação não encontrada', 404) + } + + const body: AvaliacaoCreate = await request.json() + + const avaliacao = await prisma.area.update({ + where: { id: avaliacaoId }, + data: { + name: body.name ?? existing.name, + producer_id: body.producerId ?? existing.producer_id, + geojson: body.geojson ?? existing.geojson, + area_ha: body.areaHa ?? existing.area_ha, + biome: body.biome ?? existing.biome, + lat_center: body.latCenter ?? existing.lat_center, + lon_center: body.lonCenter ?? existing.lon_center, + }, + }) + + const response: AvaliacaoOut = { + id: avaliacao.id, + name: avaliacao.name, + producerId: avaliacao.producer_id, + geojson: avaliacao.geojson, + areaHa: avaliacao.area_ha, + biome: avaliacao.biome, + riskLevel: avaliacao.risk_level, + deforestationFlag: avaliacao.deforestation_flag, + latCenter: avaliacao.lat_center, + lonCenter: avaliacao.lon_center, + createdAt: avaliacao.created_at, + } + + return jsonResponse(response) + } catch (error) { + if (error instanceof Error && error.message === 'Unauthorized') { + return errorResponse('Não autorizado', 401) + } + console.error('Update avaliacao error:', error) + return errorResponse('Erro interno do servidor', 500) + } +} + +export async function DELETE(request: NextRequest, { params }: RouteParams) { + try { + await requireAuth(request) + const { id } = await params + const avaliacaoId = parseInt(id) + + if (isNaN(avaliacaoId)) { + return errorResponse('ID inválido', 400) + } + + const existing = await prisma.area.findUnique({ + where: { id: avaliacaoId }, + }) + + if (!existing) { + return errorResponse('Avaliação não encontrada', 404) + } + + await prisma.area.delete({ + where: { id: avaliacaoId }, + }) + + return jsonResponse({ deleted: true }) + } catch (error) { + if (error instanceof Error && error.message === 'Unauthorized') { + return errorResponse('Não autorizado', 401) + } + console.error('Delete avaliacao error:', error) + return errorResponse('Erro interno do servidor', 500) + } +} diff --git a/src/app/api/avaliacoes/route.ts b/src/app/api/avaliacoes/route.ts new file mode 100644 index 0000000..8a57ce0 --- /dev/null +++ b/src/app/api/avaliacoes/route.ts @@ -0,0 +1,136 @@ +import { NextRequest } from 'next/server' +import prisma from '@/lib/prisma' +import { requireAuth, jsonResponse, errorResponse } from '@/lib/auth' + +// Avaliacoes = Areas no schema (áreas de produção) +interface AvaliacaoCreate { + name: string + producerId?: number + geojson?: string + areaHa?: number + biome?: string + latCenter?: number + lonCenter?: number +} + +interface AvaliacaoOut { + id: number + name: string + producerId: number | null + geojson: string | null + areaHa: number | null + biome: string | null + riskLevel: string | null + deforestationFlag: string | null + latCenter: number | null + lonCenter: number | null + createdAt: Date | null +} + +// Validate GeoJSON structure +function validateGeojson(geojson: string): { valid: boolean; error?: string } { + try { + const parsed = JSON.parse(geojson) + if (!parsed.type || !parsed.coordinates) { + return { valid: false, error: 'GeoJSON inválido: falta type ou coordinates' } + } + return { valid: true } + } catch { + return { valid: false, error: 'GeoJSON inválido: JSON mal formatado' } + } +} + +export async function GET(request: NextRequest) { + try { + await requireAuth(request) + + const url = new URL(request.url) + const producerId = url.searchParams.get('producerId') + + const where = producerId ? { producer_id: parseInt(producerId) } : {} + + const avaliacoes = await prisma.area.findMany({ + where, + orderBy: { created_at: 'desc' }, + include: { producer: true }, + }) + + const response: AvaliacaoOut[] = avaliacoes.map((a) => ({ + id: a.id, + name: a.name, + producerId: a.producer_id, + geojson: a.geojson, + areaHa: a.area_ha, + biome: a.biome, + riskLevel: a.risk_level, + deforestationFlag: a.deforestation_flag, + latCenter: a.lat_center, + lonCenter: a.lon_center, + createdAt: a.created_at, + })) + + return jsonResponse(response) + } catch (error) { + if (error instanceof Error && error.message === 'Unauthorized') { + return errorResponse('Não autorizado', 401) + } + console.error('List avaliacoes error:', error) + return errorResponse('Erro interno do servidor', 500) + } +} + +export async function POST(request: NextRequest) { + try { + await requireAuth(request) + + const body: AvaliacaoCreate = await request.json() + + if (!body.name) { + return errorResponse('Nome é obrigatório', 400) + } + + // Validate GeoJSON if provided + if (body.geojson) { + const validation = validateGeojson(body.geojson) + if (!validation.valid) { + return errorResponse(validation.error || 'GeoJSON inválido', 400) + } + } + + const avaliacao = await prisma.area.create({ + data: { + name: body.name, + producer_id: body.producerId || null, + geojson: body.geojson || null, + area_ha: body.areaHa || null, + biome: body.biome || null, + risk_level: 'low', + deforestation_flag: 'none', + lat_center: body.latCenter || null, + lon_center: body.lonCenter || null, + }, + }) + + const response: AvaliacaoOut = { + id: avaliacao.id, + name: avaliacao.name, + producerId: avaliacao.producer_id, + geojson: avaliacao.geojson, + areaHa: avaliacao.area_ha, + biome: avaliacao.biome, + riskLevel: avaliacao.risk_level, + deforestationFlag: avaliacao.deforestation_flag, + latCenter: avaliacao.lat_center, + lonCenter: avaliacao.lon_center, + createdAt: avaliacao.created_at, + } + + return jsonResponse(response, 201) + } catch (error) { + if (error instanceof Error && error.message === 'Unauthorized') { + return errorResponse('Não autorizado', 401) + } + console.error('Create avaliacao error:', error) + return errorResponse('Erro interno do servidor', 500) + } +} diff --git a/src/app/api/companies/[id]/route.ts b/src/app/api/companies/[id]/route.ts new file mode 100644 index 0000000..67c7bb7 --- /dev/null +++ b/src/app/api/companies/[id]/route.ts @@ -0,0 +1,42 @@ +import { NextResponse } from 'next/server' +import { prisma } from '@/lib/prisma' + +export async function GET(request: Request, { params }: { params: { id: string } }) { + try { + const company = await prisma.company.findUnique({ + where: { id: parseInt(params.id) }, + include: { producers: true } + }) + if (!company) { + return NextResponse.json({ error: 'Empresa não encontrada' }, { status: 404 }) + } + return NextResponse.json(company) + } catch (error) { + console.error('Error fetching company:', error) + return NextResponse.json({ error: 'Erro ao buscar empresa' }, { status: 500 }) + } +} + +export async function PUT(request: Request, { params }: { params: { id: string } }) { + try { + const body = await request.json() + const company = await prisma.company.update({ + where: { id: parseInt(params.id) }, + data: body + }) + return NextResponse.json(company) + } catch (error) { + console.error('Error updating company:', error) + return NextResponse.json({ error: 'Erro ao atualizar empresa' }, { status: 500 }) + } +} + +export async function DELETE(request: Request, { params }: { params: { id: string } }) { + try { + await prisma.company.delete({ where: { id: parseInt(params.id) } }) + return NextResponse.json({ ok: true }) + } catch (error) { + console.error('Error deleting company:', error) + return NextResponse.json({ error: 'Erro ao deletar empresa' }, { status: 500 }) + } +} diff --git a/src/app/api/companies/route.ts b/src/app/api/companies/route.ts new file mode 100644 index 0000000..4401ebc --- /dev/null +++ b/src/app/api/companies/route.ts @@ -0,0 +1,25 @@ +import { NextResponse } from 'next/server' +import { prisma } from '@/lib/prisma' + +export async function GET() { + try { + const companies = await prisma.company.findMany({ + orderBy: { created_at: 'desc' } + }) + return NextResponse.json(companies) + } catch (error) { + console.error('Error fetching companies:', error) + return NextResponse.json({ error: 'Erro ao buscar empresas' }, { status: 500 }) + } +} + +export async function POST(request: Request) { + try { + const body = await request.json() + const company = await prisma.company.create({ data: body }) + return NextResponse.json(company) + } catch (error) { + console.error('Error creating company:', error) + return NextResponse.json({ error: 'Erro ao criar empresa' }, { status: 500 }) + } +} diff --git a/src/app/api/dashboard/stats/route.ts b/src/app/api/dashboard/stats/route.ts new file mode 100644 index 0000000..65b432f --- /dev/null +++ b/src/app/api/dashboard/stats/route.ts @@ -0,0 +1,100 @@ +import { NextRequest } from 'next/server' +import prisma from '@/lib/prisma' +import { requireAuth, jsonResponse, errorResponse } from '@/lib/auth' + +interface DashboardStats { + totalEmpresas: number + totalPropriedades: number + totalAvaliacoes: number + totalLotes: number + totalDds: number + ddsByStatus: Record + riskDistribution: Record + recentActivity: Array<{ + id: number + entityType: string + action: string + createdAt: string + }> +} + +export async function GET(request: NextRequest) { + try { + await requireAuth(request) + + // Get counts + const [ + totalEmpresas, + totalPropriedades, + totalAvaliacoes, + totalLotes, + allDds, + allAreas, + recentAudit, + ] = await Promise.all([ + prisma.company.count(), + prisma.producer.count(), + prisma.area.count(), + prisma.lot.count(), + prisma.ddsStatement.findMany(), + prisma.area.findMany({ + select: { risk_level: true }, + }), + prisma.auditLog.findMany({ + orderBy: { created_at: 'desc' }, + take: 10, + }), + ]) + + // Calculate DDS by status + const ddsByStatus: Record = { + draft: 0, + submitted: 0, + approved: 0, + rejected: 0, + } + for (const dds of allDds) { + const status = dds.status || 'draft' + ddsByStatus[status] = (ddsByStatus[status] || 0) + 1 + } + + // Calculate risk distribution from areas + const riskDistribution: Record = { + low: 0, + medium: 0, + high: 0, + critical: 0, + } + for (const area of allAreas) { + const risk = area.risk_level || 'low' + riskDistribution[risk] = (riskDistribution[risk] || 0) + 1 + } + + // Format recent activity + const recentActivity = recentAudit.map((a) => ({ + id: a.id, + entityType: a.entity_type, + action: a.action, + createdAt: a.created_at?.toISOString() || '', + })) + + const response: DashboardStats = { + totalEmpresas, + totalPropriedades, + totalAvaliacoes, + totalLotes, + totalDds: allDds.length, + ddsByStatus, + riskDistribution, + recentActivity, + } + + return jsonResponse(response) + } catch (error) { + if (error instanceof Error && error.message === 'Unauthorized') { + return errorResponse('Não autorizado', 401) + } + console.error('Dashboard stats error:', error) + return errorResponse('Erro interno do servidor', 500) + } +} diff --git a/src/app/api/dds/[id]/route.ts b/src/app/api/dds/[id]/route.ts new file mode 100644 index 0000000..6345c2b --- /dev/null +++ b/src/app/api/dds/[id]/route.ts @@ -0,0 +1,42 @@ +import { NextResponse } from 'next/server' +import { prisma } from '@/lib/prisma' + +export async function GET(request: Request, { params }: { params: { id: string } }) { + try { + const dds = await prisma.ddsStatement.findUnique({ + where: { id: parseInt(params.id) }, + include: { company: true } + }) + if (!dds) { + return NextResponse.json({ error: 'DDS não encontrada' }, { status: 404 }) + } + return NextResponse.json(dds) + } catch (error) { + console.error('Error fetching DDS:', error) + return NextResponse.json({ error: 'Erro ao buscar DDS' }, { status: 500 }) + } +} + +export async function PUT(request: Request, { params }: { params: { id: string } }) { + try { + const body = await request.json() + const dds = await prisma.ddsStatement.update({ + where: { id: parseInt(params.id) }, + data: body + }) + return NextResponse.json(dds) + } catch (error) { + console.error('Error updating DDS:', error) + return NextResponse.json({ error: 'Erro ao atualizar DDS' }, { status: 500 }) + } +} + +export async function DELETE(request: Request, { params }: { params: { id: string } }) { + try { + await prisma.ddsStatement.delete({ where: { id: parseInt(params.id) } }) + return NextResponse.json({ ok: true }) + } catch (error) { + console.error('Error deleting DDS:', error) + return NextResponse.json({ error: 'Erro ao deletar DDS' }, { status: 500 }) + } +} diff --git a/src/app/api/dds/[id]/submit/route.ts b/src/app/api/dds/[id]/submit/route.ts new file mode 100644 index 0000000..1848111 --- /dev/null +++ b/src/app/api/dds/[id]/submit/route.ts @@ -0,0 +1,41 @@ +import { NextResponse } from 'next/server' +import { prisma } from '@/lib/prisma' + +export async function POST(request: Request, { params }: { params: { id: string } }) { + try { + const dds = await prisma.ddsStatement.findUnique({ + where: { id: parseInt(params.id) } + }) + + if (!dds) { + return NextResponse.json({ error: 'DDS não encontrada' }, { status: 404 }) + } + + // Simulate EU submission + const euReference = `EU-${Math.random().toString(36).substring(2, 8).toUpperCase()}${Math.random().toString(36).substring(2, 8).toUpperCase()}` + + const updated = await prisma.ddsStatement.update({ + where: { id: parseInt(params.id) }, + data: { + status: 'submitted', + submission_date: new Date().toISOString(), + eu_reference: euReference + } + }) + + // Create audit log + await prisma.auditLog.create({ + data: { + entity_type: 'DDS', + entity_id: dds.id, + action: 'submit', + details: `DDS ${dds.reference_number} enviada para sistema EU` + } + }) + + return NextResponse.json(updated) + } catch (error) { + console.error('Error submitting DDS:', error) + return NextResponse.json({ error: 'Erro ao enviar DDS' }, { status: 500 }) + } +} diff --git a/src/app/api/dds/route.ts b/src/app/api/dds/route.ts new file mode 100644 index 0000000..462933c --- /dev/null +++ b/src/app/api/dds/route.ts @@ -0,0 +1,42 @@ +import { NextResponse } from 'next/server' +import { prisma } from '@/lib/prisma' + +export async function GET() { + try { + const dds = await prisma.ddsStatement.findMany({ + include: { company: true }, + orderBy: { created_at: 'desc' } + }) + return NextResponse.json(dds) + } catch (error) { + console.error('Error fetching DDS:', error) + return NextResponse.json({ error: 'Erro ao buscar DDS' }, { status: 500 }) + } +} + +export async function POST(request: Request) { + try { + const body = await request.json() + + // Generate reference number + const now = new Date() + const dateStr = now.toISOString().slice(0, 10).replace(/-/g, '') + const randomStr = Math.random().toString(36).substring(2, 10).toUpperCase() + const reference_number = `DDS-BR-${dateStr}-${randomStr}` + + const dds = await prisma.ddsStatement.create({ + data: { + reference_number, + company_id: body.company_id, + status: 'draft', + risk_assessment: body.risk_assessment || 'standard', + lot_ids: body.lot_ids, + notes: body.notes + } + }) + return NextResponse.json(dds) + } catch (error) { + console.error('Error creating DDS:', error) + return NextResponse.json({ error: 'Erro ao criar DDS' }, { status: 500 }) + } +} diff --git a/src/app/api/empresas/[id]/route.ts b/src/app/api/empresas/[id]/route.ts new file mode 100644 index 0000000..e49f2fb --- /dev/null +++ b/src/app/api/empresas/[id]/route.ts @@ -0,0 +1,162 @@ +import { NextRequest } from 'next/server' +import prisma from '@/lib/prisma' +import { requireAuth, jsonResponse, errorResponse } from '@/lib/auth' + +interface CompanyCreate { + name?: string + cnpj?: string + country?: string + state?: string + city?: string + euOperatorId?: string +} + +interface CompanyOut { + id: number + name: string + cnpj: string | null + country: string | null + state: string | null + city: string | null + euOperatorId: string | null + createdAt: Date | null +} + +interface RouteParams { + params: Promise<{ id: string }> +} + +export async function GET(request: NextRequest, { params }: RouteParams) { + try { + await requireAuth(request) + const { id } = await params + const empresaId = parseInt(id) + + if (isNaN(empresaId)) { + return errorResponse('ID inválido', 400) + } + + const empresa = await prisma.company.findUnique({ + where: { id: empresaId }, + include: { producers: true }, + }) + + if (!empresa) { + return errorResponse('Empresa não encontrada', 404) + } + + const response: CompanyOut = { + id: empresa.id, + name: empresa.name, + cnpj: empresa.cnpj, + country: empresa.country, + state: empresa.state, + city: empresa.city, + euOperatorId: empresa.eu_operator_id, + createdAt: empresa.created_at, + } + + return jsonResponse(response) + } catch (error) { + if (error instanceof Error && error.message === 'Unauthorized') { + return errorResponse('Não autorizado', 401) + } + console.error('Get empresa error:', error) + return errorResponse('Erro interno do servidor', 500) + } +} + +export async function PUT(request: NextRequest, { params }: RouteParams) { + try { + await requireAuth(request) + const { id } = await params + const empresaId = parseInt(id) + + if (isNaN(empresaId)) { + return errorResponse('ID inválido', 400) + } + + const existing = await prisma.company.findUnique({ + where: { id: empresaId }, + }) + + if (!existing) { + return errorResponse('Empresa não encontrada', 404) + } + + const body: CompanyCreate = await request.json() + + // Check if CNPJ already exists for another company + if (body.cnpj && body.cnpj !== existing.cnpj) { + const cnpjExists = await prisma.company.findUnique({ + where: { cnpj: body.cnpj }, + }) + if (cnpjExists) { + return errorResponse('CNPJ já cadastrado', 400) + } + } + + const empresa = await prisma.company.update({ + where: { id: empresaId }, + data: { + name: body.name ?? existing.name, + cnpj: body.cnpj ?? existing.cnpj, + country: body.country ?? existing.country, + state: body.state ?? existing.state, + city: body.city ?? existing.city, + eu_operator_id: body.euOperatorId ?? existing.eu_operator_id, + }, + }) + + const response: CompanyOut = { + id: empresa.id, + name: empresa.name, + cnpj: empresa.cnpj, + country: empresa.country, + state: empresa.state, + city: empresa.city, + euOperatorId: empresa.eu_operator_id, + createdAt: empresa.created_at, + } + + return jsonResponse(response) + } catch (error) { + if (error instanceof Error && error.message === 'Unauthorized') { + return errorResponse('Não autorizado', 401) + } + console.error('Update empresa error:', error) + return errorResponse('Erro interno do servidor', 500) + } +} + +export async function DELETE(request: NextRequest, { params }: RouteParams) { + try { + await requireAuth(request) + const { id } = await params + const empresaId = parseInt(id) + + if (isNaN(empresaId)) { + return errorResponse('ID inválido', 400) + } + + const existing = await prisma.company.findUnique({ + where: { id: empresaId }, + }) + + if (!existing) { + return errorResponse('Empresa não encontrada', 404) + } + + await prisma.company.delete({ + where: { id: empresaId }, + }) + + return jsonResponse({ deleted: true }) + } catch (error) { + if (error instanceof Error && error.message === 'Unauthorized') { + return errorResponse('Não autorizado', 401) + } + console.error('Delete empresa error:', error) + return errorResponse('Erro interno do servidor', 500) + } +} diff --git a/src/app/api/empresas/route.ts b/src/app/api/empresas/route.ts new file mode 100644 index 0000000..c2a25e3 --- /dev/null +++ b/src/app/api/empresas/route.ts @@ -0,0 +1,104 @@ +import { NextRequest } from 'next/server' +import prisma from '@/lib/prisma' +import { requireAuth, jsonResponse, errorResponse } from '@/lib/auth' + +interface CompanyCreate { + name: string + cnpj?: string + country?: string + state?: string + city?: string + euOperatorId?: string +} + +interface CompanyOut { + id: number + name: string + cnpj: string | null + country: string | null + state: string | null + city: string | null + euOperatorId: string | null + createdAt: Date | null +} + +export async function GET(request: NextRequest) { + try { + await requireAuth(request) + + const empresas = await prisma.company.findMany({ + orderBy: { created_at: 'desc' }, + }) + + const response: CompanyOut[] = empresas.map((e) => ({ + id: e.id, + name: e.name, + cnpj: e.cnpj, + country: e.country, + state: e.state, + city: e.city, + euOperatorId: e.eu_operator_id, + createdAt: e.created_at, + })) + + return jsonResponse(response) + } catch (error) { + if (error instanceof Error && error.message === 'Unauthorized') { + return errorResponse('Não autorizado', 401) + } + console.error('List empresas error:', error) + return errorResponse('Erro interno do servidor', 500) + } +} + +export async function POST(request: NextRequest) { + try { + await requireAuth(request) + + const body: CompanyCreate = await request.json() + + if (!body.name) { + return errorResponse('Nome é obrigatório', 400) + } + + // Check if CNPJ already exists + if (body.cnpj) { + const existing = await prisma.company.findUnique({ + where: { cnpj: body.cnpj }, + }) + if (existing) { + return errorResponse('CNPJ já cadastrado', 400) + } + } + + const empresa = await prisma.company.create({ + data: { + name: body.name, + cnpj: body.cnpj || null, + country: body.country || 'BR', + state: body.state || null, + city: body.city || null, + eu_operator_id: body.euOperatorId || null, + }, + }) + + const response: CompanyOut = { + id: empresa.id, + name: empresa.name, + cnpj: empresa.cnpj, + country: empresa.country, + state: empresa.state, + city: empresa.city, + euOperatorId: empresa.eu_operator_id, + createdAt: empresa.created_at, + } + + return jsonResponse(response, 201) + } catch (error) { + if (error instanceof Error && error.message === 'Unauthorized') { + return errorResponse('Não autorizado', 401) + } + console.error('Create empresa error:', error) + return errorResponse('Erro interno do servidor', 500) + } +} diff --git a/src/app/api/lots/[id]/route.ts b/src/app/api/lots/[id]/route.ts new file mode 100644 index 0000000..2dfc07e --- /dev/null +++ b/src/app/api/lots/[id]/route.ts @@ -0,0 +1,42 @@ +import { NextResponse } from 'next/server' +import { prisma } from '@/lib/prisma' + +export async function GET(request: Request, { params }: { params: { id: string } }) { + try { + const lot = await prisma.lot.findUnique({ + where: { id: parseInt(params.id) }, + include: { product: true, area: true, producer: true } + }) + if (!lot) { + return NextResponse.json({ error: 'Lote não encontrado' }, { status: 404 }) + } + return NextResponse.json(lot) + } catch (error) { + console.error('Error fetching lot:', error) + return NextResponse.json({ error: 'Erro ao buscar lote' }, { status: 500 }) + } +} + +export async function PUT(request: Request, { params }: { params: { id: string } }) { + try { + const body = await request.json() + const lot = await prisma.lot.update({ + where: { id: parseInt(params.id) }, + data: body + }) + return NextResponse.json(lot) + } catch (error) { + console.error('Error updating lot:', error) + return NextResponse.json({ error: 'Erro ao atualizar lote' }, { status: 500 }) + } +} + +export async function DELETE(request: Request, { params }: { params: { id: string } }) { + try { + await prisma.lot.delete({ where: { id: parseInt(params.id) } }) + return NextResponse.json({ ok: true }) + } catch (error) { + console.error('Error deleting lot:', error) + return NextResponse.json({ error: 'Erro ao deletar lote' }, { status: 500 }) + } +} diff --git a/src/app/api/lots/route.ts b/src/app/api/lots/route.ts new file mode 100644 index 0000000..57fd952 --- /dev/null +++ b/src/app/api/lots/route.ts @@ -0,0 +1,26 @@ +import { NextResponse } from 'next/server' +import { prisma } from '@/lib/prisma' + +export async function GET() { + try { + const lots = await prisma.lot.findMany({ + include: { product: true, area: true, producer: true }, + orderBy: { created_at: 'desc' } + }) + return NextResponse.json(lots) + } catch (error) { + console.error('Error fetching lots:', error) + return NextResponse.json({ error: 'Erro ao buscar lotes' }, { status: 500 }) + } +} + +export async function POST(request: Request) { + try { + const body = await request.json() + const lot = await prisma.lot.create({ data: body }) + return NextResponse.json(lot) + } catch (error) { + console.error('Error creating lot:', error) + return NextResponse.json({ error: 'Erro ao criar lote' }, { status: 500 }) + } +} diff --git a/src/app/api/producers/[id]/route.ts b/src/app/api/producers/[id]/route.ts new file mode 100644 index 0000000..a32f334 --- /dev/null +++ b/src/app/api/producers/[id]/route.ts @@ -0,0 +1,42 @@ +import { NextResponse } from 'next/server' +import { prisma } from '@/lib/prisma' + +export async function GET(request: Request, { params }: { params: { id: string } }) { + try { + const producer = await prisma.producer.findUnique({ + where: { id: parseInt(params.id) }, + include: { company: true, areas: true, lots: true } + }) + if (!producer) { + return NextResponse.json({ error: 'Produtor não encontrado' }, { status: 404 }) + } + return NextResponse.json(producer) + } catch (error) { + console.error('Error fetching producer:', error) + return NextResponse.json({ error: 'Erro ao buscar produtor' }, { status: 500 }) + } +} + +export async function PUT(request: Request, { params }: { params: { id: string } }) { + try { + const body = await request.json() + const producer = await prisma.producer.update({ + where: { id: parseInt(params.id) }, + data: body + }) + return NextResponse.json(producer) + } catch (error) { + console.error('Error updating producer:', error) + return NextResponse.json({ error: 'Erro ao atualizar produtor' }, { status: 500 }) + } +} + +export async function DELETE(request: Request, { params }: { params: { id: string } }) { + try { + await prisma.producer.delete({ where: { id: parseInt(params.id) } }) + return NextResponse.json({ ok: true }) + } catch (error) { + console.error('Error deleting producer:', error) + return NextResponse.json({ error: 'Erro ao deletar produtor' }, { status: 500 }) + } +} diff --git a/src/app/api/producers/route.ts b/src/app/api/producers/route.ts new file mode 100644 index 0000000..fa9c455 --- /dev/null +++ b/src/app/api/producers/route.ts @@ -0,0 +1,26 @@ +import { NextResponse } from 'next/server' +import { prisma } from '@/lib/prisma' + +export async function GET() { + try { + const producers = await prisma.producer.findMany({ + include: { company: true }, + orderBy: { created_at: 'desc' } + }) + return NextResponse.json(producers) + } catch (error) { + console.error('Error fetching producers:', error) + return NextResponse.json({ error: 'Erro ao buscar produtores' }, { status: 500 }) + } +} + +export async function POST(request: Request) { + try { + const body = await request.json() + const producer = await prisma.producer.create({ data: body }) + return NextResponse.json(producer) + } catch (error) { + console.error('Error creating producer:', error) + return NextResponse.json({ error: 'Erro ao criar produtor' }, { status: 500 }) + } +} diff --git a/src/app/api/products/[id]/route.ts b/src/app/api/products/[id]/route.ts new file mode 100644 index 0000000..87ea84b --- /dev/null +++ b/src/app/api/products/[id]/route.ts @@ -0,0 +1,41 @@ +import { NextResponse } from 'next/server' +import { prisma } from '@/lib/prisma' + +export async function GET(request: Request, { params }: { params: { id: string } }) { + try { + const product = await prisma.product.findUnique({ + where: { id: parseInt(params.id) } + }) + if (!product) { + return NextResponse.json({ error: 'Produto não encontrado' }, { status: 404 }) + } + return NextResponse.json(product) + } catch (error) { + console.error('Error fetching product:', error) + return NextResponse.json({ error: 'Erro ao buscar produto' }, { status: 500 }) + } +} + +export async function PUT(request: Request, { params }: { params: { id: string } }) { + try { + const body = await request.json() + const product = await prisma.product.update({ + where: { id: parseInt(params.id) }, + data: body + }) + return NextResponse.json(product) + } catch (error) { + console.error('Error updating product:', error) + return NextResponse.json({ error: 'Erro ao atualizar produto' }, { status: 500 }) + } +} + +export async function DELETE(request: Request, { params }: { params: { id: string } }) { + try { + await prisma.product.delete({ where: { id: parseInt(params.id) } }) + return NextResponse.json({ ok: true }) + } catch (error) { + console.error('Error deleting product:', error) + return NextResponse.json({ error: 'Erro ao deletar produto' }, { status: 500 }) + } +} diff --git a/src/app/api/products/route.ts b/src/app/api/products/route.ts new file mode 100644 index 0000000..26c6cec --- /dev/null +++ b/src/app/api/products/route.ts @@ -0,0 +1,25 @@ +import { NextResponse } from 'next/server' +import { prisma } from '@/lib/prisma' + +export async function GET() { + try { + const products = await prisma.product.findMany({ + orderBy: { created_at: 'desc' } + }) + return NextResponse.json(products) + } catch (error) { + console.error('Error fetching products:', error) + return NextResponse.json({ error: 'Erro ao buscar produtos' }, { status: 500 }) + } +} + +export async function POST(request: Request) { + try { + const body = await request.json() + const product = await prisma.product.create({ data: body }) + return NextResponse.json(product) + } catch (error) { + console.error('Error creating product:', error) + return NextResponse.json({ error: 'Erro ao criar produto' }, { status: 500 }) + } +} diff --git a/src/app/api/propriedades/[id]/route.ts b/src/app/api/propriedades/[id]/route.ts new file mode 100644 index 0000000..c7352a2 --- /dev/null +++ b/src/app/api/propriedades/[id]/route.ts @@ -0,0 +1,162 @@ +import { NextRequest } from 'next/server' +import prisma from '@/lib/prisma' +import { requireAuth, jsonResponse, errorResponse } from '@/lib/auth' + +interface PropriedadeCreate { + name?: string + cpfCnpj?: string + companyId?: number + state?: string + city?: string + carCode?: string +} + +interface PropriedadeOut { + id: number + name: string + cpfCnpj: string | null + companyId: number | null + state: string | null + city: string | null + carCode: string | null + createdAt: Date | null +} + +interface RouteParams { + params: Promise<{ id: string }> +} + +export async function GET(request: NextRequest, { params }: RouteParams) { + try { + await requireAuth(request) + const { id } = await params + const propId = parseInt(id) + + if (isNaN(propId)) { + return errorResponse('ID inválido', 400) + } + + const propriedade = await prisma.producer.findUnique({ + where: { id: propId }, + include: { company: true, areas: true }, + }) + + if (!propriedade) { + return errorResponse('Propriedade não encontrada', 404) + } + + const response: PropriedadeOut = { + id: propriedade.id, + name: propriedade.name, + cpfCnpj: propriedade.cpf_cnpj, + companyId: propriedade.company_id, + state: propriedade.state, + city: propriedade.city, + carCode: propriedade.car_code, + createdAt: propriedade.created_at, + } + + return jsonResponse(response) + } catch (error) { + if (error instanceof Error && error.message === 'Unauthorized') { + return errorResponse('Não autorizado', 401) + } + console.error('Get propriedade error:', error) + return errorResponse('Erro interno do servidor', 500) + } +} + +export async function PUT(request: NextRequest, { params }: RouteParams) { + try { + await requireAuth(request) + const { id } = await params + const propId = parseInt(id) + + if (isNaN(propId)) { + return errorResponse('ID inválido', 400) + } + + const existing = await prisma.producer.findUnique({ + where: { id: propId }, + }) + + if (!existing) { + return errorResponse('Propriedade não encontrada', 404) + } + + const body: PropriedadeCreate = await request.json() + + // Check if CPF/CNPJ already exists for another propriedade + if (body.cpfCnpj && body.cpfCnpj !== existing.cpf_cnpj) { + const cpfExists = await prisma.producer.findUnique({ + where: { cpf_cnpj: body.cpfCnpj }, + }) + if (cpfExists) { + return errorResponse('CPF/CNPJ já cadastrado', 400) + } + } + + const propriedade = await prisma.producer.update({ + where: { id: propId }, + data: { + name: body.name ?? existing.name, + cpf_cnpj: body.cpfCnpj ?? existing.cpf_cnpj, + company_id: body.companyId ?? existing.company_id, + state: body.state ?? existing.state, + city: body.city ?? existing.city, + car_code: body.carCode ?? existing.car_code, + }, + }) + + const response: PropriedadeOut = { + id: propriedade.id, + name: propriedade.name, + cpfCnpj: propriedade.cpf_cnpj, + companyId: propriedade.company_id, + state: propriedade.state, + city: propriedade.city, + carCode: propriedade.car_code, + createdAt: propriedade.created_at, + } + + return jsonResponse(response) + } catch (error) { + if (error instanceof Error && error.message === 'Unauthorized') { + return errorResponse('Não autorizado', 401) + } + console.error('Update propriedade error:', error) + return errorResponse('Erro interno do servidor', 500) + } +} + +export async function DELETE(request: NextRequest, { params }: RouteParams) { + try { + await requireAuth(request) + const { id } = await params + const propId = parseInt(id) + + if (isNaN(propId)) { + return errorResponse('ID inválido', 400) + } + + const existing = await prisma.producer.findUnique({ + where: { id: propId }, + }) + + if (!existing) { + return errorResponse('Propriedade não encontrada', 404) + } + + await prisma.producer.delete({ + where: { id: propId }, + }) + + return jsonResponse({ deleted: true }) + } catch (error) { + if (error instanceof Error && error.message === 'Unauthorized') { + return errorResponse('Não autorizado', 401) + } + console.error('Delete propriedade error:', error) + return errorResponse('Erro interno do servidor', 500) + } +} diff --git a/src/app/api/propriedades/route.ts b/src/app/api/propriedades/route.ts new file mode 100644 index 0000000..dfc36d2 --- /dev/null +++ b/src/app/api/propriedades/route.ts @@ -0,0 +1,112 @@ +import { NextRequest } from 'next/server' +import prisma from '@/lib/prisma' +import { requireAuth, jsonResponse, errorResponse } from '@/lib/auth' + +// Propriedades = Producers no schema (produtores rurais) +interface PropriedadeCreate { + name: string + cpfCnpj?: string + companyId?: number + state?: string + city?: string + carCode?: string +} + +interface PropriedadeOut { + id: number + name: string + cpfCnpj: string | null + companyId: number | null + state: string | null + city: string | null + carCode: string | null + createdAt: Date | null +} + +export async function GET(request: NextRequest) { + try { + await requireAuth(request) + + const url = new URL(request.url) + const companyId = url.searchParams.get('companyId') + + const where = companyId ? { company_id: parseInt(companyId) } : {} + + const propriedades = await prisma.producer.findMany({ + where, + orderBy: { created_at: 'desc' }, + include: { company: true }, + }) + + const response: PropriedadeOut[] = propriedades.map((p) => ({ + id: p.id, + name: p.name, + cpfCnpj: p.cpf_cnpj, + companyId: p.company_id, + state: p.state, + city: p.city, + carCode: p.car_code, + createdAt: p.created_at, + })) + + return jsonResponse(response) + } catch (error) { + if (error instanceof Error && error.message === 'Unauthorized') { + return errorResponse('Não autorizado', 401) + } + console.error('List propriedades error:', error) + return errorResponse('Erro interno do servidor', 500) + } +} + +export async function POST(request: NextRequest) { + try { + await requireAuth(request) + + const body: PropriedadeCreate = await request.json() + + if (!body.name) { + return errorResponse('Nome é obrigatório', 400) + } + + // Check if CPF/CNPJ already exists + if (body.cpfCnpj) { + const existing = await prisma.producer.findUnique({ + where: { cpf_cnpj: body.cpfCnpj }, + }) + if (existing) { + return errorResponse('CPF/CNPJ já cadastrado', 400) + } + } + + const propriedade = await prisma.producer.create({ + data: { + name: body.name, + cpf_cnpj: body.cpfCnpj || null, + company_id: body.companyId || null, + state: body.state || null, + city: body.city || null, + car_code: body.carCode || null, + }, + }) + + const response: PropriedadeOut = { + id: propriedade.id, + name: propriedade.name, + cpfCnpj: propriedade.cpf_cnpj, + companyId: propriedade.company_id, + state: propriedade.state, + city: propriedade.city, + carCode: propriedade.car_code, + createdAt: propriedade.created_at, + } + + return jsonResponse(response, 201) + } catch (error) { + if (error instanceof Error && error.message === 'Unauthorized') { + return errorResponse('Não autorizado', 401) + } + console.error('Create propriedade error:', error) + return errorResponse('Erro interno do servidor', 500) + } +} diff --git a/src/app/api/users/[id]/route.ts b/src/app/api/users/[id]/route.ts new file mode 100644 index 0000000..5602396 --- /dev/null +++ b/src/app/api/users/[id]/route.ts @@ -0,0 +1,67 @@ +import { NextResponse } from 'next/server' +import { prisma } from '@/lib/prisma' +import bcrypt from 'bcryptjs' + +export async function GET(request: Request, { params }: { params: { id: string } }) { + try { + const user = await prisma.user.findUnique({ + where: { id: parseInt(params.id) }, + select: { + id: true, + email: true, + full_name: true, + role: true, + is_active: true, + created_at: true + } + }) + if (!user) { + return NextResponse.json({ error: 'Usuário não encontrado' }, { status: 404 }) + } + return NextResponse.json(user) + } catch (error) { + console.error('Error fetching user:', error) + return NextResponse.json({ error: 'Erro ao buscar usuário' }, { status: 500 }) + } +} + +export async function PUT(request: Request, { params }: { params: { id: string } }) { + try { + const body = await request.json() + const data: any = { + full_name: body.full_name, + role: body.role, + is_active: body.is_active + } + + if (body.password) { + data.hashed_password = await bcrypt.hash(body.password, 10) + } + + const user = await prisma.user.update({ + where: { id: parseInt(params.id) }, + data, + select: { + id: true, + email: true, + full_name: true, + role: true, + is_active: true + } + }) + return NextResponse.json(user) + } catch (error) { + console.error('Error updating user:', error) + return NextResponse.json({ error: 'Erro ao atualizar usuário' }, { status: 500 }) + } +} + +export async function DELETE(request: Request, { params }: { params: { id: string } }) { + try { + await prisma.user.delete({ where: { id: parseInt(params.id) } }) + return NextResponse.json({ ok: true }) + } catch (error) { + console.error('Error deleting user:', error) + return NextResponse.json({ error: 'Erro ao deletar usuário' }, { status: 500 }) + } +} diff --git a/src/app/api/users/route.ts b/src/app/api/users/route.ts new file mode 100644 index 0000000..f2c4c8d --- /dev/null +++ b/src/app/api/users/route.ts @@ -0,0 +1,22 @@ +import { NextResponse } from 'next/server' +import { prisma } from '@/lib/prisma' + +export async function GET() { + try { + const users = await prisma.user.findMany({ + select: { + id: true, + email: true, + full_name: true, + role: true, + is_active: true, + created_at: true + }, + orderBy: { created_at: 'desc' } + }) + return NextResponse.json(users) + } catch (error) { + console.error('Error fetching users:', error) + return NextResponse.json({ error: 'Erro ao buscar usuários' }, { status: 500 }) + } +} diff --git a/src/app/api/usuarios/[id]/route.ts b/src/app/api/usuarios/[id]/route.ts new file mode 100644 index 0000000..c26d97f --- /dev/null +++ b/src/app/api/usuarios/[id]/route.ts @@ -0,0 +1,192 @@ +import { NextRequest } from 'next/server' +import prisma from '@/lib/prisma' +import { requireAdmin, jsonResponse, errorResponse } from '@/lib/auth' +import { hashPassword } from '@/lib/password' + +interface UserUpdate { + email?: string + fullName?: string + role?: 'admin' | 'operator' | 'viewer' + isActive?: boolean + password?: string +} + +interface UserOut { + id: number + email: string + fullName: string | null + role: string | null + isActive: boolean | null + createdAt: Date | null +} + +interface RouteParams { + params: Promise<{ id: string }> +} + +export async function GET(request: NextRequest, { params }: RouteParams) { + try { + await requireAdmin(request) + const { id } = await params + const userId = parseInt(id) + + if (isNaN(userId)) { + return errorResponse('ID inválido', 400) + } + + const user = await prisma.user.findUnique({ + where: { id: userId }, + select: { + id: true, + email: true, + full_name: true, + role: true, + is_active: true, + created_at: true, + }, + }) + + if (!user) { + return errorResponse('Usuário não encontrado', 404) + } + + const response: UserOut = { + id: user.id, + email: user.email, + fullName: user.full_name, + role: user.role, + isActive: user.is_active, + createdAt: user.created_at, + } + + return jsonResponse(response) + } catch (error) { + if (error instanceof Error) { + if (error.message === 'Unauthorized') { + return errorResponse('Não autorizado', 401) + } + if (error.message.includes('Admin')) { + return errorResponse('Acesso negado: requer privilégios de administrador', 403) + } + } + console.error('Get usuario error:', error) + return errorResponse('Erro interno do servidor', 500) + } +} + +export async function PUT(request: NextRequest, { params }: RouteParams) { + try { + await requireAdmin(request) + const { id } = await params + const userId = parseInt(id) + + if (isNaN(userId)) { + return errorResponse('ID inválido', 400) + } + + const existing = await prisma.user.findUnique({ + where: { id: userId }, + }) + + if (!existing) { + return errorResponse('Usuário não encontrado', 404) + } + + const body: UserUpdate = await request.json() + + // Check if email already exists for another user + if (body.email && body.email !== existing.email) { + const emailExists = await prisma.user.findUnique({ + where: { email: body.email }, + }) + if (emailExists) { + return errorResponse('Email já cadastrado', 400) + } + } + + // Prepare update data + const updateData: Record = {} + if (body.email !== undefined) updateData.email = body.email + if (body.fullName !== undefined) updateData.full_name = body.fullName + if (body.role !== undefined) updateData.role = body.role + if (body.isActive !== undefined) updateData.is_active = body.isActive + if (body.password) updateData.hashed_password = await hashPassword(body.password) + + const user = await prisma.user.update({ + where: { id: userId }, + data: updateData, + select: { + id: true, + email: true, + full_name: true, + role: true, + is_active: true, + created_at: true, + }, + }) + + const response: UserOut = { + id: user.id, + email: user.email, + fullName: user.full_name, + role: user.role, + isActive: user.is_active, + createdAt: user.created_at, + } + + return jsonResponse(response) + } catch (error) { + if (error instanceof Error) { + if (error.message === 'Unauthorized') { + return errorResponse('Não autorizado', 401) + } + if (error.message.includes('Admin')) { + return errorResponse('Acesso negado: requer privilégios de administrador', 403) + } + } + console.error('Update usuario error:', error) + return errorResponse('Erro interno do servidor', 500) + } +} + +export async function DELETE(request: NextRequest, { params }: RouteParams) { + try { + const adminUser = await requireAdmin(request) + const { id } = await params + const userId = parseInt(id) + + if (isNaN(userId)) { + return errorResponse('ID inválido', 400) + } + + // Prevent self-deletion + if (adminUser.id === userId) { + return errorResponse('Não é possível excluir seu próprio usuário', 400) + } + + const existing = await prisma.user.findUnique({ + where: { id: userId }, + }) + + if (!existing) { + return errorResponse('Usuário não encontrado', 404) + } + + await prisma.user.delete({ + where: { id: userId }, + }) + + return jsonResponse({ deleted: true }) + } catch (error) { + if (error instanceof Error) { + if (error.message === 'Unauthorized') { + return errorResponse('Não autorizado', 401) + } + if (error.message.includes('Admin')) { + return errorResponse('Acesso negado: requer privilégios de administrador', 403) + } + } + console.error('Delete usuario error:', error) + return errorResponse('Erro interno do servidor', 500) + } +} diff --git a/src/app/api/usuarios/route.ts b/src/app/api/usuarios/route.ts new file mode 100644 index 0000000..272119b --- /dev/null +++ b/src/app/api/usuarios/route.ts @@ -0,0 +1,53 @@ +import { NextRequest } from 'next/server' +import prisma from '@/lib/prisma' +import { requireAdmin, jsonResponse, errorResponse } from '@/lib/auth' + +interface UserOut { + id: number + email: string + fullName: string | null + role: string | null + isActive: boolean | null + createdAt: Date | null +} + +export async function GET(request: NextRequest) { + try { + // Admin only + await requireAdmin(request) + + const usuarios = await prisma.user.findMany({ + orderBy: { created_at: 'desc' }, + select: { + id: true, + email: true, + full_name: true, + role: true, + is_active: true, + created_at: true, + }, + }) + + const response: UserOut[] = usuarios.map((u) => ({ + id: u.id, + email: u.email, + fullName: u.full_name, + role: u.role, + isActive: u.is_active, + createdAt: u.created_at, + })) + + return jsonResponse(response) + } catch (error) { + if (error instanceof Error) { + if (error.message === 'Unauthorized') { + return errorResponse('Não autorizado', 401) + } + if (error.message.includes('Admin')) { + return errorResponse('Acesso negado: requer privilégios de administrador', 403) + } + } + console.error('List usuarios error:', error) + return errorResponse('Erro interno do servidor', 500) + } +} diff --git a/src/app/globals.css b/src/app/globals.css index 13d40b8..737e8ec 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -3,25 +3,76 @@ @tailwind utilities; :root { - --background: #ffffff; - --foreground: #171717; -} - -@media (prefers-color-scheme: dark) { - :root { - --background: #0a0a0a; - --foreground: #ededed; - } + --green: #1A7A4C; + --navy: #2D3142; + --gray: #C8C9CB; + --gray-text: #8E9196; + --text: #5A5D6B; } body { - color: var(--foreground); - background: var(--background); - font-family: Arial, Helvetica, sans-serif; + font-family: system-ui, -apple-system, sans-serif; + background: #FFFFFF !important; + color: #2D3142; } -@layer utilities { - .text-balance { - text-wrap: balance; - } +.glass { + background: rgba(255, 255, 255, 0.9); + backdrop-filter: blur(16px); + border: 1px solid #E2E4E8; } + +.glass-card { + background: #FFFFFF; + border: 1px solid #E2E4E8; + border-radius: 16px; + padding: 24px; + transition: all 0.3s ease; + box-shadow: 0 1px 3px rgba(0,0,0,0.05); +} + +.glass-card:hover { + border-color: #1A7A4C; + transform: translateY(-2px); + box-shadow: 0 8px 24px rgba(26, 122, 76, 0.1); +} + +.gold-gradient { + background: linear-gradient(135deg, #1A7A4C, #2D3142); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +.btn-gold { + background: #1A7A4C; + color: #FFFFFF; + font-weight: 700; + padding: 12px 32px; + border-radius: 12px; + transition: all 0.3s; + display: inline-block; + text-decoration: none; +} + +.btn-gold:hover { + transform: translateY(-2px); + box-shadow: 0 8px 32px rgba(26, 122, 76, 0.3); + background: #156940; +} + +.bg-forest-900 { background-color: #FFFFFF; } +.bg-forest-800 { background-color: #F5F6F8; } +.border-forest-800 { border-color: #E2E4E8; } +.border-forest-700 { border-color: #E2E4E8; } +.border-forest-600 { border-color: #C8C9CB; } +.text-gold-500 { color: #1A7A4C; } +.border-gold-500 { border-color: #1A7A4C; } + +.sidebar-bg { + background: #FFFFFF; + border-right: 1px solid #E2E4E8; +} + +::-webkit-scrollbar { width: 6px; } +::-webkit-scrollbar-track { background: #F5F6F8; } +::-webkit-scrollbar-thumb { background: #1A7A4C; border-radius: 3px; } diff --git a/src/app/layout.tsx b/src/app/layout.tsx index a36cde0..7f46ae2 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,35 +1,18 @@ -import type { Metadata } from "next"; -import localFont from "next/font/local"; -import "./globals.css"; - -const geistSans = localFont({ - src: "./fonts/GeistVF.woff", - variable: "--font-geist-sans", - weight: "100 900", -}); -const geistMono = localFont({ - src: "./fonts/GeistMonoVF.woff", - variable: "--font-geist-mono", - weight: "100 900", -}); +import type { Metadata } from 'next' +import './globals.css' +import SessionProvider from '@/components/SessionProvider' export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", -}; + title: 'DUORIGIN — Compliance EUDR Inteligente', + description: 'Sistema de compliance EUDR para agronegócio brasileiro', +} -export default function RootLayout({ - children, -}: Readonly<{ - children: React.ReactNode; -}>) { +export default function RootLayout({ children }: { children: React.ReactNode }) { return ( - - - {children} + + + {children} - ); + ) } diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx new file mode 100644 index 0000000..e5ff704 --- /dev/null +++ b/src/app/login/page.tsx @@ -0,0 +1,115 @@ +'use client' +import { useState } from 'react' +import { signIn } from 'next-auth/react' +import { useRouter } from 'next/navigation' + +export default function LoginPage() { + const router = useRouter() + const [email, setEmail] = useState('') + const [password, setPassword] = useState('') + const [error, setError] = useState('') + const [loading, setLoading] = useState(false) + + const handleLogin = async (e: React.FormEvent) => { + e.preventDefault() + setLoading(true) + setError('') + + const result = await signIn('credentials', { + email, + password, + redirect: false + }) + + if (result?.error) { + setError('Email ou senha inválidos') + setLoading(false) + } else { + router.push('/dashboard') + } + } + + const fillDemo = (demoEmail: string, demoPassword: string) => { + setEmail(demoEmail) + setPassword(demoPassword) + } + + return ( +
+
+ {/* Logo */} +
+ DuoOrigin +

DuoOrigin

+

Field to Data. Compliance Verified.

+
+ + {/* Login Card */} +
+

Acesso ao Sistema

+ +
+
+ + setEmail(e.target.value)} + className="w-full bg-[#F5F6F8] border border-gray-200 rounded-lg px-4 py-3 text-[#2D3142] focus:border-[#1A7A4C] focus:outline-none transition" + placeholder="seu@email.com" + required + /> +
+
+ + setPassword(e.target.value)} + className="w-full bg-[#F5F6F8] border border-gray-200 rounded-lg px-4 py-3 text-[#2D3142] focus:border-[#1A7A4C] focus:outline-none transition" + placeholder="••••••••" + required + /> +
+ + {error && ( +
+ {error} +
+ )} + + +
+ + {/* Demo Access */} +
+

🔑 Acesso Demo

+
+ + +
+

Senha demo: DuoDemo2026

+
+
+
+
+ ) +} diff --git a/src/app/page.tsx b/src/app/page.tsx index 6fe62d1..60b4872 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,101 +1,100 @@ -import Image from "next/image"; +'use client' -export default function Home() { +const Logo = () => ( + DuoOrigin +) + +const features = [ + { icon: "🛡️", title: "Due Diligence Automatizada", desc: "Motor de avaliação EUDR com checklist completo, scoring de risco e flags automáticas" }, + { icon: "🗺️", title: "Geolocalização Avançada", desc: "Mapeamento de áreas com GeoJSON/KML, detecção de sobreposição e análise de desmatamento" }, + { icon: "📄", title: "DDS Automatizada", desc: "Geração, revisão e envio de Declarações de Due Diligence para o sistema da UE" }, + { icon: "🔗", title: "Rastreabilidade Completa", desc: "Cadeia de custódia do produtor ao porto, com histórico imutável de auditoria" }, + { icon: "📊", title: "Dashboard Inteligente", desc: "Visão consolidada de risco, status de DDS, alertas e KPIs em tempo real" }, + { icon: "🌍", title: "Compatível TRACES NT", desc: "Exportação de DDS no formato oficial da UE, pronto para upload no portal TRACES NT" }, +] + +export default function LandingPage() { return ( -
-
- Next.js logo -
    -
  1. - Get started by editing{" "} - - src/app/page.tsx - - . -
  2. -
  3. Save and see your changes instantly.
  4. -
- -
- - Vercel logomark - Deploy now - - - Read our docs - +
+ {/* Nav */} +
-
- - File icon - Learn - - - Window icon - Examples - - - Globe icon - Go to nextjs.org → - + + + {/* Hero */} +
+
+
+ 🇪🇺 Conformidade EUDR 2025 — Regulamento (UE) 2023/1115 +
+

+ DUOORIGIN +
+ Compliance EUDR +
+ Inteligente +

+

+ Plataforma completa para gestão de compliance EUDR no agronegócio brasileiro. + Due diligence automatizada, rastreabilidade e geolocalização em um único sistema. +

+
+ Começar Agora + +
+
+ {[["5.2K+", "Produtores"], ["180K+", "Lotes Rastreados"], ["2.4K+", "DDS Enviadas"], ["99.2%", "Aprovação"]].map(([n, l]) => ( +
+
{n}
+
{l}
+
+ ))} +
+
+
+ + {/* Features */} +
+
+

Recursos Completos

+

Tudo que você precisa para compliance EUDR

+
+ {features.map(f => ( +
+
{f.icon}
+

{f.title}

+

{f.desc}

+
+ ))} +
+
+
+ + {/* CTA */} +
+
+

Pronto para garantir sua conformidade EUDR?

+

Entre em contato para uma demonstração personalizada do DuoOrigin.

+ Acessar Demo +
+
+ + {/* Footer */} +
+ © 2025 DUORIGIN — Compliance EUDR Inteligente. Todos os direitos reservados.
- ); + ) } diff --git a/src/lib/auth.ts b/src/lib/auth.ts new file mode 100644 index 0000000..1620c2d --- /dev/null +++ b/src/lib/auth.ts @@ -0,0 +1,83 @@ +import { SignJWT, jwtVerify } from 'jose' +import { NextRequest } from 'next/server' + +const JWT_SECRET = new TextEncoder().encode( + process.env.JWT_SECRET || 'duorigin-secret-key-change-in-production' +) +const JWT_ALGORITHM = 'HS256' +const JWT_EXPIRES = '7d' + +export interface JWTPayload { + sub: string + email: string + role: string + iat?: number + exp?: number +} + +export interface AuthUser { + id: number + email: string + role: string +} + +export async function createToken(user: { id: number; email: string; role: string }): Promise { + return new SignJWT({ sub: String(user.id), email: user.email, role: user.role }) + .setProtectedHeader({ alg: JWT_ALGORITHM }) + .setIssuedAt() + .setExpirationTime(JWT_EXPIRES) + .sign(JWT_SECRET) +} + +export async function verifyToken(token: string): Promise { + try { + const { payload } = await jwtVerify(token, JWT_SECRET) + return payload as JWTPayload + } catch { + return null + } +} + +export async function getAuthUser(request: NextRequest): Promise { + const authHeader = request.headers.get('Authorization') + if (!authHeader?.startsWith('Bearer ')) { + return null + } + + const token = authHeader.slice(7) + const payload = await verifyToken(token) + + if (!payload?.sub) { + return null + } + + return { + id: parseInt(payload.sub), + email: payload.email, + role: payload.role, + } +} + +export async function requireAuth(request: NextRequest): Promise { + const user = await getAuthUser(request) + if (!user) { + throw new Error('Unauthorized') + } + return user +} + +export async function requireAdmin(request: NextRequest): Promise { + const user = await requireAuth(request) + if (user.role !== 'admin') { + throw new Error('Forbidden: Admin access required') + } + return user +} + +export function jsonResponse(data: T, status = 200) { + return Response.json({ success: true, data }, { status }) +} + +export function errorResponse(error: string, status = 400) { + return Response.json({ success: false, error }, { status }) +} diff --git a/src/lib/password.ts b/src/lib/password.ts new file mode 100644 index 0000000..c3eae02 --- /dev/null +++ b/src/lib/password.ts @@ -0,0 +1,11 @@ +import bcrypt from 'bcryptjs' + +const SALT_ROUNDS = 10 + +export async function hashPassword(password: string): Promise { + return bcrypt.hash(password, SALT_ROUNDS) +} + +export async function verifyPassword(password: string, hash: string): Promise { + return bcrypt.compare(password, hash) +} diff --git a/src/lib/prisma.ts b/src/lib/prisma.ts new file mode 100644 index 0000000..0742c54 --- /dev/null +++ b/src/lib/prisma.ts @@ -0,0 +1,11 @@ +import { PrismaClient } from '@prisma/client' + +const globalForPrisma = globalThis as unknown as { + prisma: PrismaClient | undefined +} + +export const prisma = globalForPrisma.prisma ?? new PrismaClient() + +if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma + +export default prisma diff --git a/src/types/index.ts b/src/types/index.ts new file mode 100644 index 0000000..40103d1 --- /dev/null +++ b/src/types/index.ts @@ -0,0 +1,117 @@ +// Types for DuOrigin + +export interface Company { + id: number + name: string + cnpj?: string | null + country?: string | null + state?: string | null + city?: string | null + eu_operator_id?: string | null + created_at?: Date | null +} + +export interface Producer { + id: number + name: string + cpf_cnpj?: string | null + company_id?: number | null + state?: string | null + city?: string | null + car_code?: string | null + created_at?: Date | null + company?: Company | null +} + +export interface Area { + id: number + name: string + producer_id?: number | null + geojson?: string | null + area_ha?: number | null + biome?: string | null + risk_level?: string | null + deforestation_flag?: string | null + lat_center?: number | null + lon_center?: number | null + created_at?: Date | null + producer?: Producer | null +} + +export interface Product { + id: number + name: string + hs_code?: string | null + eudr_category?: string | null + description?: string | null + created_at?: Date | null +} + +export interface Lot { + id: number + reference: string + product_id?: number | null + area_id?: number | null + producer_id?: number | null + quantity_kg?: number | null + harvest_date?: string | null + risk_score?: number | null + status?: string | null + created_at?: Date | null + product?: Product | null + area?: Area | null + producer?: Producer | null +} + +export interface DdsStatement { + id: number + reference_number: string + company_id?: number | null + status?: string | null + risk_assessment?: string | null + lot_ids?: string | null + submission_date?: string | null + eu_reference?: string | null + notes?: string | null + created_at?: Date | null + updated_at?: Date | null + company?: Company | null +} + +export interface AuditLog { + id: number + entity_type: string + entity_id?: number | null + action: string + user_id?: number | null + details?: string | null + ip_address?: string | null + created_at?: Date | null +} + +export interface User { + id: number + email: string + full_name?: string | null + role?: string | null + is_active?: boolean | null + created_at?: Date | null +} + +export const riskColors: Record = { + low: '#4caf50', + medium: '#ff9800', + high: '#f44336', + critical: '#9c27b0', +} + +export const statusColors: Record = { + draft: '#9e9e9e', + submitted: '#2196f3', + approved: '#4caf50', + rejected: '#f44336', + pending: '#ff9800', + verified: '#4caf50', + flagged: '#ff9800', + blocked: '#f44336', +} diff --git a/tsconfig.tsbuildinfo b/tsconfig.tsbuildinfo new file mode 100644 index 0000000..9918f72 --- /dev/null +++ b/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.es2023.d.ts","./node_modules/typescript/lib/lib.es2024.d.ts","./node_modules/typescript/lib/lib.esnext.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/typescript/lib/lib.es2023.array.d.ts","./node_modules/typescript/lib/lib.es2023.collection.d.ts","./node_modules/typescript/lib/lib.es2023.intl.d.ts","./node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2024.collection.d.ts","./node_modules/typescript/lib/lib.es2024.object.d.ts","./node_modules/typescript/lib/lib.es2024.promise.d.ts","./node_modules/typescript/lib/lib.es2024.regexp.d.ts","./node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2024.string.d.ts","./node_modules/typescript/lib/lib.esnext.array.d.ts","./node_modules/typescript/lib/lib.esnext.collection.d.ts","./node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.esnext.promise.d.ts","./node_modules/typescript/lib/lib.esnext.decorators.d.ts","./node_modules/typescript/lib/lib.esnext.iterator.d.ts","./node_modules/typescript/lib/lib.esnext.float16.d.ts","./node_modules/typescript/lib/lib.esnext.error.d.ts","./node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/next/dist/styled-jsx/types/css.d.ts","./node_modules/@types/react/global.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@types/prop-types/index.d.ts","./node_modules/@types/react/index.d.ts","./node_modules/next/dist/styled-jsx/types/index.d.ts","./node_modules/next/dist/styled-jsx/types/macro.d.ts","./node_modules/next/dist/styled-jsx/types/style.d.ts","./node_modules/next/dist/styled-jsx/types/global.d.ts","./node_modules/next/dist/shared/lib/amp.d.ts","./node_modules/next/amp.d.ts","./node_modules/@types/node/compatibility/disposable.d.ts","./node_modules/@types/node/compatibility/indexable.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/compatibility/index.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/file.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/filereader.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/next/dist/server/get-page-files.d.ts","./node_modules/@types/react/canary.d.ts","./node_modules/@types/react/experimental.d.ts","./node_modules/@types/react-dom/index.d.ts","./node_modules/@types/react-dom/canary.d.ts","./node_modules/@types/react-dom/experimental.d.ts","./node_modules/next/dist/compiled/webpack/webpack.d.ts","./node_modules/next/dist/server/config.d.ts","./node_modules/next/dist/lib/load-custom-routes.d.ts","./node_modules/next/dist/shared/lib/image-config.d.ts","./node_modules/next/dist/build/webpack/plugins/subresource-integrity-plugin.d.ts","./node_modules/next/dist/server/body-streams.d.ts","./node_modules/next/dist/server/future/route-kind.d.ts","./node_modules/next/dist/server/future/route-definitions/route-definition.d.ts","./node_modules/next/dist/server/future/route-matches/route-match.d.ts","./node_modules/next/dist/client/components/app-router-headers.d.ts","./node_modules/next/dist/server/request-meta.d.ts","./node_modules/next/dist/server/lib/revalidate.d.ts","./node_modules/next/dist/server/config-shared.d.ts","./node_modules/next/dist/server/base-http/index.d.ts","./node_modules/next/dist/server/api-utils/index.d.ts","./node_modules/next/dist/server/node-environment.d.ts","./node_modules/next/dist/server/require-hook.d.ts","./node_modules/next/dist/server/node-polyfill-crypto.d.ts","./node_modules/next/dist/lib/page-types.d.ts","./node_modules/next/dist/build/analysis/get-page-static-info.d.ts","./node_modules/next/dist/build/webpack/loaders/get-module-build-info.d.ts","./node_modules/next/dist/build/webpack/plugins/middleware-plugin.d.ts","./node_modules/next/dist/server/render-result.d.ts","./node_modules/next/dist/server/future/helpers/i18n-provider.d.ts","./node_modules/next/dist/server/web/next-url.d.ts","./node_modules/next/dist/compiled/@edge-runtime/cookies/index.d.ts","./node_modules/next/dist/server/web/spec-extension/cookies.d.ts","./node_modules/next/dist/server/web/spec-extension/request.d.ts","./node_modules/next/dist/server/web/spec-extension/fetch-event.d.ts","./node_modules/next/dist/server/web/spec-extension/response.d.ts","./node_modules/next/dist/server/web/types.d.ts","./node_modules/next/dist/lib/setup-exception-listeners.d.ts","./node_modules/next/dist/lib/constants.d.ts","./node_modules/next/dist/build/index.d.ts","./node_modules/next/dist/build/webpack/plugins/pages-manifest-plugin.d.ts","./node_modules/next/dist/shared/lib/router/utils/route-regex.d.ts","./node_modules/next/dist/shared/lib/router/utils/route-matcher.d.ts","./node_modules/next/dist/shared/lib/router/utils/parse-url.d.ts","./node_modules/next/dist/server/base-http/node.d.ts","./node_modules/next/dist/server/font-utils.d.ts","./node_modules/next/dist/build/webpack/plugins/flight-manifest-plugin.d.ts","./node_modules/next/dist/server/future/route-modules/route-module.d.ts","./node_modules/next/dist/shared/lib/deep-readonly.d.ts","./node_modules/next/dist/server/load-components.d.ts","./node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.d.ts","./node_modules/next/dist/build/webpack/plugins/next-font-manifest-plugin.d.ts","./node_modules/next/dist/server/future/route-definitions/locale-route-definition.d.ts","./node_modules/next/dist/server/future/route-definitions/pages-route-definition.d.ts","./node_modules/next/dist/shared/lib/mitt.d.ts","./node_modules/next/dist/client/with-router.d.ts","./node_modules/next/dist/client/router.d.ts","./node_modules/next/dist/client/route-loader.d.ts","./node_modules/next/dist/client/page-loader.d.ts","./node_modules/next/dist/shared/lib/bloom-filter.d.ts","./node_modules/next/dist/shared/lib/router/router.d.ts","./node_modules/next/dist/shared/lib/router-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/loadable-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/loadable.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/image-config-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/hooks-client-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/head-manager-context.shared-runtime.d.ts","./node_modules/next/dist/server/future/route-definitions/app-page-route-definition.d.ts","./node_modules/next/dist/shared/lib/modern-browserslist-target.d.ts","./node_modules/next/dist/shared/lib/constants.d.ts","./node_modules/next/dist/build/webpack/loaders/metadata/types.d.ts","./node_modules/next/dist/build/page-extensions-type.d.ts","./node_modules/next/dist/build/webpack/loaders/next-app-loader.d.ts","./node_modules/next/dist/server/lib/app-dir-module.d.ts","./node_modules/next/dist/server/response-cache/types.d.ts","./node_modules/next/dist/server/response-cache/index.d.ts","./node_modules/next/dist/server/lib/incremental-cache/index.d.ts","./node_modules/next/dist/client/components/hooks-server-context.d.ts","./node_modules/next/dist/server/app-render/dynamic-rendering.d.ts","./node_modules/next/dist/client/components/static-generation-async-storage-instance.d.ts","./node_modules/next/dist/client/components/static-generation-async-storage.external.d.ts","./node_modules/next/dist/server/web/spec-extension/adapters/request-cookies.d.ts","./node_modules/next/dist/server/async-storage/draft-mode-provider.d.ts","./node_modules/next/dist/server/web/spec-extension/adapters/headers.d.ts","./node_modules/next/dist/client/components/request-async-storage-instance.d.ts","./node_modules/next/dist/client/components/request-async-storage.external.d.ts","./node_modules/next/dist/server/app-render/create-error-handler.d.ts","./node_modules/next/dist/server/app-render/app-render.d.ts","./node_modules/next/dist/shared/lib/server-inserted-html.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/amp-context.shared-runtime.d.ts","./node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/entrypoints.d.ts","./node_modules/next/dist/server/future/route-modules/app-page/module.compiled.d.ts","./node_modules/@types/react/jsx-runtime.d.ts","./node_modules/next/dist/client/components/error-boundary.d.ts","./node_modules/next/dist/client/components/router-reducer/create-initial-router-state.d.ts","./node_modules/next/dist/client/components/app-router.d.ts","./node_modules/next/dist/client/components/layout-router.d.ts","./node_modules/next/dist/client/components/render-from-template-context.d.ts","./node_modules/next/dist/client/components/action-async-storage-instance.d.ts","./node_modules/next/dist/client/components/action-async-storage.external.d.ts","./node_modules/next/dist/client/components/client-page.d.ts","./node_modules/next/dist/client/components/search-params.d.ts","./node_modules/next/dist/client/components/not-found-boundary.d.ts","./node_modules/next/dist/server/app-render/rsc/preloads.d.ts","./node_modules/next/dist/server/app-render/rsc/postpone.d.ts","./node_modules/next/dist/server/app-render/rsc/taint.d.ts","./node_modules/next/dist/server/app-render/entry-base.d.ts","./node_modules/next/dist/build/templates/app-page.d.ts","./node_modules/next/dist/server/future/route-modules/app-page/module.d.ts","./node_modules/next/dist/server/lib/builtin-request-context.d.ts","./node_modules/next/dist/server/app-render/types.d.ts","./node_modules/next/dist/client/components/router-reducer/fetch-server-response.d.ts","./node_modules/next/dist/client/components/router-reducer/router-reducer-types.d.ts","./node_modules/next/dist/shared/lib/app-router-context.shared-runtime.d.ts","./node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/entrypoints.d.ts","./node_modules/next/dist/server/future/route-modules/pages/module.compiled.d.ts","./node_modules/next/dist/build/templates/pages.d.ts","./node_modules/next/dist/server/future/route-modules/pages/module.d.ts","./node_modules/next/dist/server/render.d.ts","./node_modules/next/dist/server/future/route-definitions/pages-api-route-definition.d.ts","./node_modules/next/dist/server/future/route-matches/pages-api-route-match.d.ts","./node_modules/next/dist/server/future/route-matchers/route-matcher.d.ts","./node_modules/next/dist/server/future/route-matcher-providers/route-matcher-provider.d.ts","./node_modules/next/dist/server/future/route-matcher-managers/route-matcher-manager.d.ts","./node_modules/next/dist/server/future/normalizers/normalizer.d.ts","./node_modules/next/dist/server/future/normalizers/locale-route-normalizer.d.ts","./node_modules/next/dist/server/future/normalizers/request/pathname-normalizer.d.ts","./node_modules/next/dist/server/future/normalizers/request/suffix.d.ts","./node_modules/next/dist/server/future/normalizers/request/rsc.d.ts","./node_modules/next/dist/server/future/normalizers/request/prefix.d.ts","./node_modules/next/dist/server/future/normalizers/request/postponed.d.ts","./node_modules/next/dist/server/future/normalizers/request/action.d.ts","./node_modules/next/dist/server/future/normalizers/request/prefetch-rsc.d.ts","./node_modules/next/dist/server/future/normalizers/request/next-data.d.ts","./node_modules/next/dist/server/base-server.d.ts","./node_modules/next/dist/server/image-optimizer.d.ts","./node_modules/next/dist/server/next-server.d.ts","./node_modules/next/dist/lib/coalesced-function.d.ts","./node_modules/next/dist/server/lib/router-utils/types.d.ts","./node_modules/next/dist/trace/types.d.ts","./node_modules/next/dist/trace/trace.d.ts","./node_modules/next/dist/trace/shared.d.ts","./node_modules/next/dist/trace/index.d.ts","./node_modules/next/dist/build/load-jsconfig.d.ts","./node_modules/next/dist/build/webpack-config.d.ts","./node_modules/next/dist/build/webpack/plugins/define-env-plugin.d.ts","./node_modules/next/dist/build/swc/index.d.ts","./node_modules/next/dist/server/dev/parse-version-info.d.ts","./node_modules/next/dist/server/dev/hot-reloader-types.d.ts","./node_modules/next/dist/telemetry/storage.d.ts","./node_modules/next/dist/server/lib/types.d.ts","./node_modules/next/dist/server/lib/render-server.d.ts","./node_modules/next/dist/server/lib/router-server.d.ts","./node_modules/next/dist/shared/lib/router/utils/path-match.d.ts","./node_modules/next/dist/server/lib/router-utils/filesystem.d.ts","./node_modules/next/dist/server/lib/router-utils/setup-dev-bundler.d.ts","./node_modules/next/dist/server/lib/dev-bundler-service.d.ts","./node_modules/next/dist/server/dev/static-paths-worker.d.ts","./node_modules/next/dist/server/dev/next-dev-server.d.ts","./node_modules/next/dist/server/next.d.ts","./node_modules/next/dist/lib/metadata/types/alternative-urls-types.d.ts","./node_modules/next/dist/lib/metadata/types/extra-types.d.ts","./node_modules/next/dist/lib/metadata/types/metadata-types.d.ts","./node_modules/next/dist/lib/metadata/types/manifest-types.d.ts","./node_modules/next/dist/lib/metadata/types/opengraph-types.d.ts","./node_modules/next/dist/lib/metadata/types/twitter-types.d.ts","./node_modules/next/dist/lib/metadata/types/metadata-interface.d.ts","./node_modules/next/types/index.d.ts","./node_modules/next/dist/shared/lib/html-context.shared-runtime.d.ts","./node_modules/@next/env/dist/index.d.ts","./node_modules/next/dist/shared/lib/utils.d.ts","./node_modules/next/dist/pages/_app.d.ts","./node_modules/next/app.d.ts","./node_modules/next/dist/server/web/spec-extension/unstable-cache.d.ts","./node_modules/next/dist/server/web/spec-extension/revalidate.d.ts","./node_modules/next/dist/server/web/spec-extension/unstable-no-store.d.ts","./node_modules/next/cache.d.ts","./node_modules/next/dist/shared/lib/runtime-config.external.d.ts","./node_modules/next/config.d.ts","./node_modules/next/dist/pages/_document.d.ts","./node_modules/next/document.d.ts","./node_modules/next/dist/shared/lib/dynamic.d.ts","./node_modules/next/dynamic.d.ts","./node_modules/next/dist/pages/_error.d.ts","./node_modules/next/error.d.ts","./node_modules/next/dist/shared/lib/head.d.ts","./node_modules/next/head.d.ts","./node_modules/next/dist/client/components/draft-mode.d.ts","./node_modules/next/dist/client/components/headers.d.ts","./node_modules/next/headers.d.ts","./node_modules/next/dist/shared/lib/get-img-props.d.ts","./node_modules/next/dist/client/image-component.d.ts","./node_modules/next/dist/shared/lib/image-external.d.ts","./node_modules/next/image.d.ts","./node_modules/next/dist/client/link.d.ts","./node_modules/next/link.d.ts","./node_modules/next/dist/client/components/redirect-status-code.d.ts","./node_modules/next/dist/client/components/redirect.d.ts","./node_modules/next/dist/client/components/not-found.d.ts","./node_modules/next/dist/client/components/navigation.react-server.d.ts","./node_modules/next/dist/client/components/navigation.d.ts","./node_modules/next/navigation.d.ts","./node_modules/next/router.d.ts","./node_modules/next/dist/client/script.d.ts","./node_modules/next/script.d.ts","./node_modules/next/dist/server/web/spec-extension/user-agent.d.ts","./node_modules/next/dist/compiled/@edge-runtime/primitives/url.d.ts","./node_modules/next/dist/server/web/spec-extension/image-response.d.ts","./node_modules/next/dist/compiled/@vercel/og/satori/index.d.ts","./node_modules/next/dist/compiled/@vercel/og/emoji/index.d.ts","./node_modules/next/dist/compiled/@vercel/og/types.d.ts","./node_modules/next/server.d.ts","./node_modules/next/types/global.d.ts","./node_modules/next/types/compiled.d.ts","./node_modules/next/index.d.ts","./node_modules/next/image-types/global.d.ts","./next-env.d.ts","./node_modules/source-map-js/source-map.d.ts","./node_modules/postcss/lib/previous-map.d.ts","./node_modules/postcss/lib/input.d.ts","./node_modules/postcss/lib/css-syntax-error.d.ts","./node_modules/postcss/lib/declaration.d.ts","./node_modules/postcss/lib/root.d.ts","./node_modules/postcss/lib/warning.d.ts","./node_modules/postcss/lib/lazy-result.d.ts","./node_modules/postcss/lib/no-work-result.d.ts","./node_modules/postcss/lib/processor.d.ts","./node_modules/postcss/lib/result.d.ts","./node_modules/postcss/lib/document.d.ts","./node_modules/postcss/lib/rule.d.ts","./node_modules/postcss/lib/node.d.ts","./node_modules/postcss/lib/comment.d.ts","./node_modules/postcss/lib/container.d.ts","./node_modules/postcss/lib/at-rule.d.ts","./node_modules/postcss/lib/list.d.ts","./node_modules/postcss/lib/postcss.d.ts","./node_modules/postcss/lib/postcss.d.mts","./node_modules/tailwindcss/types/generated/corePluginList.d.ts","./node_modules/tailwindcss/types/generated/colors.d.ts","./node_modules/tailwindcss/types/config.d.ts","./node_modules/tailwindcss/types/index.d.ts","./tailwind.config.ts","./node_modules/@prisma/client/runtime/library.d.ts","./node_modules/.prisma/client/index.d.ts","./node_modules/.prisma/client/default.d.ts","./node_modules/@prisma/client/default.d.ts","./backend/prisma/seed.ts","./backend/src/prisma/prisma.service.ts","./backend/src/prisma/prisma.module.ts","./backend/src/auth/dto/login.dto.ts","./backend/src/auth/dto/registro.dto.ts","./backend/src/auth/auth.service.ts","./backend/src/auth/jwt-auth.guard.ts","./backend/src/auth/auth.controller.ts","./backend/src/auth/jwt.strategy.ts","./backend/src/users/dto/create-user.dto.ts","./backend/src/users/dto/update-user.dto.ts","./backend/src/users/users.service.ts","./backend/src/auth/roles.guard.ts","./backend/src/auth/roles.decorator.ts","./backend/src/users/users.controller.ts","./backend/src/users/users.module.ts","./backend/src/auth/auth.module.ts","./backend/src/empresas/dto/create-empresa.dto.ts","./backend/src/empresas/dto/update-empresa.dto.ts","./backend/src/empresas/empresas.service.ts","./backend/src/empresas/empresas.controller.ts","./backend/src/empresas/empresas.module.ts","./backend/src/propriedades/dto/create-propriedade.dto.ts","./backend/src/propriedades/dto/update-propriedade.dto.ts","./backend/src/propriedades/propriedades.service.ts","./backend/src/propriedades/propriedades.controller.ts","./backend/src/propriedades/propriedades.module.ts","./backend/src/avaliacoes/dto/create-avaliacao.dto.ts","./backend/src/avaliacoes/dto/update-avaliacao.dto.ts","./backend/src/avaliacoes/avaliacoes.service.ts","./backend/src/avaliacoes/avaliacoes.controller.ts","./backend/src/avaliacoes/avaliacoes.module.ts","./backend/src/documentos/documentos.service.ts","./backend/src/documentos/documentos.controller.ts","./backend/src/documentos/documentos.module.ts","./backend/src/dashboard/dashboard.service.ts","./backend/src/dashboard/dashboard.controller.ts","./backend/src/dashboard/dashboard.module.ts","./backend/src/app.module.ts","./backend/src/main.ts","./backend/src/types/express.d.ts","./frontend/node_modules/vite/types/hmrPayload.d.ts","./frontend/node_modules/vite/dist/node/chunks/moduleRunnerTransport.d.ts","./frontend/node_modules/vite/types/customEvent.d.ts","./frontend/node_modules/@types/estree/index.d.ts","./frontend/node_modules/rollup/dist/rollup.d.ts","./frontend/node_modules/rollup/dist/parseAst.d.ts","./frontend/node_modules/vite/types/hot.d.ts","./frontend/node_modules/vite/dist/node/module-runner.d.ts","./frontend/node_modules/esbuild/lib/main.d.ts","./frontend/node_modules/vite/types/internal/terserOptions.d.ts","./frontend/node_modules/postcss/lib/postcss.d.mts","./frontend/node_modules/vite/types/internal/cssPreprocessorOptions.d.ts","./frontend/node_modules/vite/types/internal/lightningcssOptions.d.ts","./frontend/node_modules/vite/types/importGlob.d.ts","./frontend/node_modules/vite/types/metadata.d.ts","./frontend/node_modules/vite/dist/node/index.d.ts","./frontend/node_modules/@babel/types/lib/index.d.ts","./frontend/node_modules/@types/babel__generator/index.d.ts","./frontend/node_modules/@babel/parser/typings/babel-parser.d.ts","./frontend/node_modules/@types/babel__template/index.d.ts","./frontend/node_modules/@types/babel__traverse/index.d.ts","./frontend/node_modules/@types/babel__core/index.d.ts","./frontend/node_modules/@vitejs/plugin-react/dist/index.d.ts","./frontend/vite.config.ts","./frontend/node_modules/axios/index.d.ts","./frontend/src/api/client.ts","./frontend/node_modules/@types/react/global.d.ts","./frontend/node_modules/csstype/index.d.ts","./frontend/node_modules/@types/react/index.d.ts","./frontend/src/hooks/useApi.ts","./frontend/src/hooks/useAuth.ts","./frontend/src/types/index.ts","./node_modules/bcryptjs/types.d.ts","./node_modules/bcryptjs/index.d.ts","./prisma/seed.ts","./src/lib/prisma.ts","./src/app/api/areas/route.ts","./src/app/api/areas/[id]/route.ts","./src/app/api/audit/route.ts","./node_modules/next-auth/adapters.d.ts","./node_modules/openid-client/node_modules/jose/dist/types/types.d.ts","./node_modules/openid-client/node_modules/jose/dist/types/jwe/compact/decrypt.d.ts","./node_modules/openid-client/node_modules/jose/dist/types/jwe/flattened/decrypt.d.ts","./node_modules/openid-client/node_modules/jose/dist/types/jwe/general/decrypt.d.ts","./node_modules/openid-client/node_modules/jose/dist/types/jwe/general/encrypt.d.ts","./node_modules/openid-client/node_modules/jose/dist/types/jws/compact/verify.d.ts","./node_modules/openid-client/node_modules/jose/dist/types/jws/flattened/verify.d.ts","./node_modules/openid-client/node_modules/jose/dist/types/jws/general/verify.d.ts","./node_modules/openid-client/node_modules/jose/dist/types/jwt/verify.d.ts","./node_modules/openid-client/node_modules/jose/dist/types/jwt/decrypt.d.ts","./node_modules/openid-client/node_modules/jose/dist/types/jwt/produce.d.ts","./node_modules/openid-client/node_modules/jose/dist/types/jwe/compact/encrypt.d.ts","./node_modules/openid-client/node_modules/jose/dist/types/jwe/flattened/encrypt.d.ts","./node_modules/openid-client/node_modules/jose/dist/types/jws/compact/sign.d.ts","./node_modules/openid-client/node_modules/jose/dist/types/jws/flattened/sign.d.ts","./node_modules/openid-client/node_modules/jose/dist/types/jws/general/sign.d.ts","./node_modules/openid-client/node_modules/jose/dist/types/jwt/sign.d.ts","./node_modules/openid-client/node_modules/jose/dist/types/jwt/encrypt.d.ts","./node_modules/openid-client/node_modules/jose/dist/types/jwk/thumbprint.d.ts","./node_modules/openid-client/node_modules/jose/dist/types/jwk/embedded.d.ts","./node_modules/openid-client/node_modules/jose/dist/types/jwks/local.d.ts","./node_modules/openid-client/node_modules/jose/dist/types/jwks/remote.d.ts","./node_modules/openid-client/node_modules/jose/dist/types/jwt/unsecured.d.ts","./node_modules/openid-client/node_modules/jose/dist/types/key/export.d.ts","./node_modules/openid-client/node_modules/jose/dist/types/key/import.d.ts","./node_modules/openid-client/node_modules/jose/dist/types/util/decode_protected_header.d.ts","./node_modules/openid-client/node_modules/jose/dist/types/util/decode_jwt.d.ts","./node_modules/openid-client/node_modules/jose/dist/types/util/errors.d.ts","./node_modules/openid-client/node_modules/jose/dist/types/key/generate_key_pair.d.ts","./node_modules/openid-client/node_modules/jose/dist/types/key/generate_secret.d.ts","./node_modules/openid-client/node_modules/jose/dist/types/util/base64url.d.ts","./node_modules/openid-client/node_modules/jose/dist/types/util/runtime.d.ts","./node_modules/openid-client/node_modules/jose/dist/types/index.d.ts","./node_modules/openid-client/types/index.d.ts","./node_modules/next-auth/node_modules/jose/dist/types/index.d.ts","./node_modules/next-auth/providers/oauth-types.d.ts","./node_modules/next-auth/providers/oauth.d.ts","./node_modules/next-auth/providers/email.d.ts","./node_modules/next-auth/core/lib/cookie.d.ts","./node_modules/next-auth/core/index.d.ts","./node_modules/next-auth/providers/credentials.d.ts","./node_modules/next-auth/providers/index.d.ts","./node_modules/next-auth/jwt/types.d.ts","./node_modules/next-auth/jwt/index.d.ts","./node_modules/next-auth/utils/logger.d.ts","./node_modules/next-auth/core/types.d.ts","./node_modules/next-auth/next/index.d.ts","./node_modules/next-auth/index.d.ts","./node_modules/jose/dist/types/types.d.ts","./node_modules/jose/dist/types/jwe/compact/decrypt.d.ts","./node_modules/jose/dist/types/jwe/flattened/decrypt.d.ts","./node_modules/jose/dist/types/jwe/general/decrypt.d.ts","./node_modules/jose/dist/types/jwe/general/encrypt.d.ts","./node_modules/jose/dist/types/jws/compact/verify.d.ts","./node_modules/jose/dist/types/jws/flattened/verify.d.ts","./node_modules/jose/dist/types/jws/general/verify.d.ts","./node_modules/jose/dist/types/jwt/verify.d.ts","./node_modules/jose/dist/types/jwt/decrypt.d.ts","./node_modules/jose/dist/types/jwt/produce.d.ts","./node_modules/jose/dist/types/jwe/compact/encrypt.d.ts","./node_modules/jose/dist/types/jwe/flattened/encrypt.d.ts","./node_modules/jose/dist/types/jws/compact/sign.d.ts","./node_modules/jose/dist/types/jws/flattened/sign.d.ts","./node_modules/jose/dist/types/jws/general/sign.d.ts","./node_modules/jose/dist/types/jwt/sign.d.ts","./node_modules/jose/dist/types/jwt/encrypt.d.ts","./node_modules/jose/dist/types/jwk/thumbprint.d.ts","./node_modules/jose/dist/types/jwk/embedded.d.ts","./node_modules/jose/dist/types/jwks/local.d.ts","./node_modules/jose/dist/types/jwks/remote.d.ts","./node_modules/jose/dist/types/jwt/unsecured.d.ts","./node_modules/jose/dist/types/key/export.d.ts","./node_modules/jose/dist/types/key/import.d.ts","./node_modules/jose/dist/types/util/decode_protected_header.d.ts","./node_modules/jose/dist/types/util/decode_jwt.d.ts","./node_modules/jose/dist/types/util/errors.d.ts","./node_modules/jose/dist/types/key/generate_key_pair.d.ts","./node_modules/jose/dist/types/key/generate_secret.d.ts","./node_modules/jose/dist/types/util/base64url.d.ts","./node_modules/jose/dist/types/util/runtime.d.ts","./node_modules/jose/dist/types/index.d.ts","./src/lib/auth.ts","./src/app/api/auth/[...nextauth]/route.ts","./src/lib/password.ts","./src/app/api/auth/login/route.ts","./src/app/api/auth/me/route.ts","./src/app/api/auth/register/route.ts","./src/app/api/auth/registro/route.ts","./src/app/api/avaliacoes/route.ts","./src/app/api/avaliacoes/[id]/route.ts","./src/app/api/avaliacoes/[id]/gerar-dds/route.ts","./src/app/api/companies/route.ts","./src/app/api/companies/[id]/route.ts","./src/app/api/dashboard/stats/route.ts","./src/app/api/dds/route.ts","./src/app/api/dds/[id]/route.ts","./src/app/api/dds/[id]/submit/route.ts","./src/app/api/empresas/route.ts","./src/app/api/empresas/[id]/route.ts","./src/app/api/lots/route.ts","./src/app/api/lots/[id]/route.ts","./src/app/api/producers/route.ts","./src/app/api/producers/[id]/route.ts","./src/app/api/products/route.ts","./src/app/api/products/[id]/route.ts","./src/app/api/propriedades/route.ts","./src/app/api/propriedades/[id]/route.ts","./src/app/api/users/route.ts","./src/app/api/users/[id]/route.ts","./src/app/api/usuarios/route.ts","./src/app/api/usuarios/[id]/route.ts","./src/components/Navbar.tsx","./src/components/Sidebar.tsx","./src/components/DashboardLayout.tsx","./src/components/Footer.tsx","./src/components/Modal.tsx","./src/components/StatsCard.tsx","./src/components/DataTable.tsx","./src/components/AvaliacaoCard.tsx","./src/components/EmpresaForm.tsx","./src/components/PropriedadeForm.tsx","./src/components/LoginForm.tsx","./src/components/RegistroForm.tsx","./src/components/DDSModal.tsx","./src/components/LandingHero.tsx","./src/components/LandingFeatures.tsx","./src/components/index.ts","./src/types/index.ts","./frontend/src/App.tsx","./frontend/node_modules/@types/react-dom/client.d.ts","./frontend/src/main.tsx","./frontend/node_modules/lucide-react/dist/lucide-react.d.ts","./frontend/src/components/Modal.tsx","./frontend/src/components/DDSModal.tsx","./frontend/node_modules/react-router/dist/development/router-5iOvts3c.d.mts","./frontend/node_modules/react-router/dist/development/browser-BEPxnEBW.d.mts","./frontend/node_modules/react-router/dist/development/dom-export.d.mts","./frontend/node_modules/react-router/dist/development/register-CS_tiXsm.d.mts","./frontend/node_modules/react-router/dist/development/index-react-server-client-MKTlCGL3.d.mts","./frontend/node_modules/cookie/dist/index.d.ts","./frontend/node_modules/react-router/dist/development/index.d.mts","./frontend/node_modules/react-router-dom/dist/index.d.mts","./frontend/src/components/Sidebar.tsx","./frontend/src/components/DashboardLayout.tsx","./frontend/src/components/DataTable.tsx","./frontend/src/components/Footer.tsx","./frontend/src/components/Navbar.tsx","./frontend/src/components/ProtectedRoute.tsx","./frontend/src/components/StatsCard.tsx","./frontend/src/contexts/AuthContext.tsx","./frontend/node_modules/recharts/types/shape/Dot.d.ts","./frontend/node_modules/recharts/types/component/Text.d.ts","./frontend/node_modules/recharts/types/zIndex/ZIndexLayer.d.ts","./frontend/node_modules/recharts/types/cartesian/getCartesianPosition.d.ts","./frontend/node_modules/recharts/types/component/Label.d.ts","./frontend/node_modules/recharts/types/cartesian/CartesianAxis.d.ts","./frontend/node_modules/recharts/types/util/scale/CustomScaleDefinition.d.ts","./frontend/node_modules/redux/dist/redux.d.ts","./frontend/node_modules/@reduxjs/toolkit/node_modules/immer/dist/immer.d.ts","./frontend/node_modules/reselect/dist/reselect.d.ts","./frontend/node_modules/redux-thunk/dist/redux-thunk.d.ts","./frontend/node_modules/@reduxjs/toolkit/dist/uncheckedindexed.ts","./frontend/node_modules/@reduxjs/toolkit/dist/index.d.mts","./frontend/node_modules/recharts/types/state/cartesianAxisSlice.d.ts","./frontend/node_modules/recharts/types/synchronisation/types.d.ts","./frontend/node_modules/recharts/types/chart/types.d.ts","./frontend/node_modules/recharts/types/component/DefaultTooltipContent.d.ts","./frontend/node_modules/recharts/types/context/brushUpdateContext.d.ts","./frontend/node_modules/recharts/types/state/chartDataSlice.d.ts","./frontend/node_modules/recharts/types/state/types/LineSettings.d.ts","./frontend/node_modules/recharts/types/state/types/ScatterSettings.d.ts","./frontend/node_modules/@types/d3-path/index.d.ts","./frontend/node_modules/@types/d3-shape/index.d.ts","./frontend/node_modules/victory-vendor/d3-shape.d.ts","./frontend/node_modules/recharts/types/shape/Curve.d.ts","./frontend/node_modules/recharts/types/component/LabelList.d.ts","./frontend/node_modules/recharts/types/component/DefaultLegendContent.d.ts","./frontend/node_modules/recharts/types/util/payload/getUniqPayload.d.ts","./frontend/node_modules/recharts/types/util/useElementOffset.d.ts","./frontend/node_modules/recharts/types/component/Legend.d.ts","./frontend/node_modules/recharts/types/state/legendSlice.d.ts","./frontend/node_modules/recharts/types/state/types/StackedGraphicalItem.d.ts","./frontend/node_modules/recharts/types/util/stacks/stackTypes.d.ts","./frontend/node_modules/recharts/types/util/scale/RechartsScale.d.ts","./frontend/node_modules/recharts/types/util/ChartUtils.d.ts","./frontend/node_modules/recharts/types/state/selectors/areaSelectors.d.ts","./frontend/node_modules/recharts/types/cartesian/Area.d.ts","./frontend/node_modules/recharts/types/state/types/AreaSettings.d.ts","./frontend/node_modules/recharts/types/animation/easing.d.ts","./frontend/node_modules/recharts/types/shape/Rectangle.d.ts","./frontend/node_modules/recharts/types/cartesian/Bar.d.ts","./frontend/node_modules/recharts/types/util/BarUtils.d.ts","./frontend/node_modules/recharts/types/state/types/BarSettings.d.ts","./frontend/node_modules/recharts/types/state/types/RadialBarSettings.d.ts","./frontend/node_modules/recharts/types/util/svgPropertiesNoEvents.d.ts","./frontend/node_modules/recharts/types/util/useUniqueId.d.ts","./frontend/node_modules/recharts/types/state/types/PieSettings.d.ts","./frontend/node_modules/recharts/types/state/types/RadarSettings.d.ts","./frontend/node_modules/recharts/types/state/graphicalItemsSlice.d.ts","./frontend/node_modules/recharts/types/state/tooltipSlice.d.ts","./frontend/node_modules/recharts/types/state/optionsSlice.d.ts","./frontend/node_modules/recharts/types/state/layoutSlice.d.ts","./frontend/node_modules/immer/dist/immer.d.ts","./frontend/node_modules/recharts/types/util/IfOverflow.d.ts","./frontend/node_modules/recharts/types/util/resolveDefaultProps.d.ts","./frontend/node_modules/recharts/types/cartesian/ReferenceLine.d.ts","./frontend/node_modules/recharts/types/state/referenceElementsSlice.d.ts","./frontend/node_modules/recharts/types/state/brushSlice.d.ts","./frontend/node_modules/recharts/types/state/rootPropsSlice.d.ts","./frontend/node_modules/recharts/types/state/polarAxisSlice.d.ts","./frontend/node_modules/recharts/types/state/polarOptionsSlice.d.ts","./frontend/node_modules/recharts/types/cartesian/Line.d.ts","./frontend/node_modules/recharts/types/util/Constants.d.ts","./frontend/node_modules/recharts/types/util/ScatterUtils.d.ts","./frontend/node_modules/recharts/types/shape/Symbols.d.ts","./frontend/node_modules/recharts/types/cartesian/Scatter.d.ts","./frontend/node_modules/recharts/types/cartesian/ErrorBar.d.ts","./frontend/node_modules/recharts/types/state/errorBarSlice.d.ts","./frontend/node_modules/recharts/types/state/zIndexSlice.d.ts","./frontend/node_modules/recharts/types/state/store.d.ts","./frontend/node_modules/recharts/types/cartesian/getTicks.d.ts","./frontend/node_modules/recharts/types/cartesian/CartesianGrid.d.ts","./frontend/node_modules/recharts/types/state/selectors/combiners/combineDisplayedStackedData.d.ts","./frontend/node_modules/recharts/types/state/selectors/selectTooltipAxisType.d.ts","./frontend/node_modules/recharts/types/state/selectors/axisSelectors.d.ts","./frontend/node_modules/recharts/types/component/Dots.d.ts","./frontend/node_modules/recharts/types/util/types.d.ts","./frontend/node_modules/recharts/types/container/Surface.d.ts","./frontend/node_modules/recharts/types/container/Layer.d.ts","./frontend/node_modules/recharts/types/component/Cursor.d.ts","./frontend/node_modules/recharts/types/component/Tooltip.d.ts","./frontend/node_modules/recharts/types/component/ResponsiveContainer.d.ts","./frontend/node_modules/recharts/types/component/Cell.d.ts","./frontend/node_modules/recharts/types/component/Customized.d.ts","./frontend/node_modules/recharts/types/shape/Sector.d.ts","./frontend/node_modules/recharts/types/shape/Polygon.d.ts","./frontend/node_modules/recharts/types/shape/Cross.d.ts","./frontend/node_modules/recharts/types/polar/PolarGrid.d.ts","./frontend/node_modules/recharts/types/polar/defaultPolarRadiusAxisProps.d.ts","./frontend/node_modules/recharts/types/polar/PolarRadiusAxis.d.ts","./frontend/node_modules/recharts/types/polar/defaultPolarAngleAxisProps.d.ts","./frontend/node_modules/recharts/types/polar/PolarAngleAxis.d.ts","./frontend/node_modules/recharts/types/polar/Pie.d.ts","./frontend/node_modules/recharts/types/polar/Radar.d.ts","./frontend/node_modules/recharts/types/polar/RadialBar.d.ts","./frontend/node_modules/recharts/types/cartesian/Brush.d.ts","./frontend/node_modules/recharts/types/cartesian/ReferenceDot.d.ts","./frontend/node_modules/recharts/types/util/excludeEventProps.d.ts","./frontend/node_modules/recharts/types/util/svgPropertiesAndEvents.d.ts","./frontend/node_modules/recharts/types/cartesian/ReferenceArea.d.ts","./frontend/node_modules/recharts/types/cartesian/BarStack.d.ts","./frontend/node_modules/recharts/types/cartesian/XAxis.d.ts","./frontend/node_modules/recharts/types/cartesian/YAxis.d.ts","./frontend/node_modules/recharts/types/cartesian/ZAxis.d.ts","./frontend/node_modules/recharts/types/chart/LineChart.d.ts","./frontend/node_modules/recharts/types/chart/BarChart.d.ts","./frontend/node_modules/recharts/types/chart/PieChart.d.ts","./frontend/node_modules/recharts/types/chart/Treemap.d.ts","./frontend/node_modules/recharts/types/chart/Sankey.d.ts","./frontend/node_modules/recharts/types/chart/RadarChart.d.ts","./frontend/node_modules/recharts/types/chart/ScatterChart.d.ts","./frontend/node_modules/recharts/types/chart/AreaChart.d.ts","./frontend/node_modules/recharts/types/chart/RadialBarChart.d.ts","./frontend/node_modules/recharts/types/chart/ComposedChart.d.ts","./frontend/node_modules/recharts/types/chart/SunburstChart.d.ts","./frontend/node_modules/recharts/types/shape/Trapezoid.d.ts","./frontend/node_modules/recharts/types/cartesian/Funnel.d.ts","./frontend/node_modules/recharts/types/chart/FunnelChart.d.ts","./frontend/node_modules/recharts/types/util/Global.d.ts","./frontend/node_modules/recharts/types/zIndex/DefaultZIndexes.d.ts","./frontend/node_modules/decimal.js-light/decimal.d.ts","./frontend/node_modules/recharts/types/util/scale/getNiceTickValues.d.ts","./frontend/node_modules/recharts/types/types.d.ts","./frontend/node_modules/recharts/types/hooks.d.ts","./frontend/node_modules/recharts/types/context/chartLayoutContext.d.ts","./frontend/node_modules/recharts/types/index.d.ts","./frontend/src/pages/Dashboard.tsx","./frontend/node_modules/react-hook-form/dist/constants.d.ts","./frontend/node_modules/react-hook-form/dist/utils/createSubject.d.ts","./frontend/node_modules/react-hook-form/dist/types/events.d.ts","./frontend/node_modules/react-hook-form/dist/types/path/common.d.ts","./frontend/node_modules/react-hook-form/dist/types/path/eager.d.ts","./frontend/node_modules/react-hook-form/dist/types/path/index.d.ts","./frontend/node_modules/react-hook-form/dist/types/fieldArray.d.ts","./frontend/node_modules/react-hook-form/dist/types/resolvers.d.ts","./frontend/node_modules/react-hook-form/dist/types/form.d.ts","./frontend/node_modules/react-hook-form/dist/types/utils.d.ts","./frontend/node_modules/react-hook-form/dist/types/fields.d.ts","./frontend/node_modules/react-hook-form/dist/types/errors.d.ts","./frontend/node_modules/react-hook-form/dist/types/validator.d.ts","./frontend/node_modules/react-hook-form/dist/types/controller.d.ts","./frontend/node_modules/react-hook-form/dist/types/watch.d.ts","./frontend/node_modules/react-hook-form/dist/types/index.d.ts","./frontend/node_modules/react-hook-form/dist/controller.d.ts","./frontend/node_modules/react-hook-form/dist/form.d.ts","./frontend/node_modules/react-hook-form/dist/formStateSubscribe.d.ts","./frontend/node_modules/react-hook-form/dist/logic/appendErrors.d.ts","./frontend/node_modules/react-hook-form/dist/logic/createFormControl.d.ts","./frontend/node_modules/react-hook-form/dist/logic/index.d.ts","./frontend/node_modules/react-hook-form/dist/useController.d.ts","./frontend/node_modules/react-hook-form/dist/useFieldArray.d.ts","./frontend/node_modules/react-hook-form/dist/useForm.d.ts","./frontend/node_modules/react-hook-form/dist/useFormContext.d.ts","./frontend/node_modules/react-hook-form/dist/useFormState.d.ts","./frontend/node_modules/react-hook-form/dist/useWatch.d.ts","./frontend/node_modules/react-hook-form/dist/utils/get.d.ts","./frontend/node_modules/react-hook-form/dist/utils/set.d.ts","./frontend/node_modules/react-hook-form/dist/utils/index.d.ts","./frontend/node_modules/react-hook-form/dist/watch.d.ts","./frontend/node_modules/react-hook-form/dist/index.d.ts","./frontend/node_modules/zod/v3/helpers/typeAliases.d.cts","./frontend/node_modules/zod/v3/helpers/util.d.cts","./frontend/node_modules/zod/v3/ZodError.d.cts","./frontend/node_modules/zod/v3/locales/en.d.cts","./frontend/node_modules/zod/v3/errors.d.cts","./frontend/node_modules/zod/v3/helpers/parseUtil.d.cts","./frontend/node_modules/zod/v3/helpers/enumUtil.d.cts","./frontend/node_modules/zod/v3/helpers/errorUtil.d.cts","./frontend/node_modules/zod/v3/helpers/partialUtil.d.cts","./frontend/node_modules/zod/v3/standard-schema.d.cts","./frontend/node_modules/zod/v3/types.d.cts","./frontend/node_modules/zod/v3/external.d.cts","./frontend/node_modules/zod/v3/index.d.cts","./frontend/node_modules/zod/v4/core/json-schema.d.cts","./frontend/node_modules/zod/v4/core/standard-schema.d.cts","./frontend/node_modules/zod/v4/core/registries.d.cts","./frontend/node_modules/zod/v4/core/to-json-schema.d.cts","./frontend/node_modules/zod/v4/core/util.d.cts","./frontend/node_modules/zod/v4/core/versions.d.cts","./frontend/node_modules/zod/v4/core/schemas.d.cts","./frontend/node_modules/zod/v4/core/checks.d.cts","./frontend/node_modules/zod/v4/core/errors.d.cts","./frontend/node_modules/zod/v4/core/core.d.cts","./frontend/node_modules/zod/v4/core/parse.d.cts","./frontend/node_modules/zod/v4/core/regexes.d.cts","./frontend/node_modules/zod/v4/locales/ar.d.cts","./frontend/node_modules/zod/v4/locales/az.d.cts","./frontend/node_modules/zod/v4/locales/be.d.cts","./frontend/node_modules/zod/v4/locales/bg.d.cts","./frontend/node_modules/zod/v4/locales/ca.d.cts","./frontend/node_modules/zod/v4/locales/cs.d.cts","./frontend/node_modules/zod/v4/locales/da.d.cts","./frontend/node_modules/zod/v4/locales/de.d.cts","./frontend/node_modules/zod/v4/locales/en.d.cts","./frontend/node_modules/zod/v4/locales/eo.d.cts","./frontend/node_modules/zod/v4/locales/es.d.cts","./frontend/node_modules/zod/v4/locales/fa.d.cts","./frontend/node_modules/zod/v4/locales/fi.d.cts","./frontend/node_modules/zod/v4/locales/fr.d.cts","./frontend/node_modules/zod/v4/locales/fr-CA.d.cts","./frontend/node_modules/zod/v4/locales/he.d.cts","./frontend/node_modules/zod/v4/locales/hu.d.cts","./frontend/node_modules/zod/v4/locales/hy.d.cts","./frontend/node_modules/zod/v4/locales/id.d.cts","./frontend/node_modules/zod/v4/locales/is.d.cts","./frontend/node_modules/zod/v4/locales/it.d.cts","./frontend/node_modules/zod/v4/locales/ja.d.cts","./frontend/node_modules/zod/v4/locales/ka.d.cts","./frontend/node_modules/zod/v4/locales/kh.d.cts","./frontend/node_modules/zod/v4/locales/km.d.cts","./frontend/node_modules/zod/v4/locales/ko.d.cts","./frontend/node_modules/zod/v4/locales/lt.d.cts","./frontend/node_modules/zod/v4/locales/mk.d.cts","./frontend/node_modules/zod/v4/locales/ms.d.cts","./frontend/node_modules/zod/v4/locales/nl.d.cts","./frontend/node_modules/zod/v4/locales/no.d.cts","./frontend/node_modules/zod/v4/locales/ota.d.cts","./frontend/node_modules/zod/v4/locales/ps.d.cts","./frontend/node_modules/zod/v4/locales/pl.d.cts","./frontend/node_modules/zod/v4/locales/pt.d.cts","./frontend/node_modules/zod/v4/locales/ru.d.cts","./frontend/node_modules/zod/v4/locales/sl.d.cts","./frontend/node_modules/zod/v4/locales/sv.d.cts","./frontend/node_modules/zod/v4/locales/ta.d.cts","./frontend/node_modules/zod/v4/locales/th.d.cts","./frontend/node_modules/zod/v4/locales/tr.d.cts","./frontend/node_modules/zod/v4/locales/ua.d.cts","./frontend/node_modules/zod/v4/locales/uk.d.cts","./frontend/node_modules/zod/v4/locales/ur.d.cts","./frontend/node_modules/zod/v4/locales/uz.d.cts","./frontend/node_modules/zod/v4/locales/vi.d.cts","./frontend/node_modules/zod/v4/locales/zh-CN.d.cts","./frontend/node_modules/zod/v4/locales/zh-TW.d.cts","./frontend/node_modules/zod/v4/locales/yo.d.cts","./frontend/node_modules/zod/v4/locales/index.d.cts","./frontend/node_modules/zod/v4/core/doc.d.cts","./frontend/node_modules/zod/v4/core/api.d.cts","./frontend/node_modules/zod/v4/core/json-schema-processors.d.cts","./frontend/node_modules/zod/v4/core/json-schema-generator.d.cts","./frontend/node_modules/zod/v4/core/index.d.cts","./frontend/node_modules/@hookform/resolvers/zod/dist/zod.d.ts","./frontend/node_modules/@hookform/resolvers/zod/dist/index.d.ts","./frontend/node_modules/zod/v4/classic/errors.d.cts","./frontend/node_modules/zod/v4/classic/parse.d.cts","./frontend/node_modules/zod/v4/classic/schemas.d.cts","./frontend/node_modules/zod/v4/classic/checks.d.cts","./frontend/node_modules/zod/v4/classic/compat.d.cts","./frontend/node_modules/zod/v4/classic/from-json-schema.d.cts","./frontend/node_modules/zod/v4/classic/iso.d.cts","./frontend/node_modules/zod/v4/classic/coerce.d.cts","./frontend/node_modules/zod/v4/classic/external.d.cts","./frontend/node_modules/zod/index.d.cts","./frontend/src/pages/EmpresaForm.tsx","./frontend/src/pages/Empresas.tsx","./frontend/src/pages/Landing.tsx","./frontend/src/pages/Login.tsx","./frontend/src/pages/PropriedadeForm.tsx","./frontend/src/pages/Propriedades.tsx","./frontend/src/pages/Registro.tsx","./src/app/layout.tsx","./src/app/page.tsx","./node_modules/next-auth/client/_utils.d.ts","./node_modules/next-auth/react/types.d.ts","./node_modules/next-auth/react/index.d.ts","./src/app/(dashboard)/layout.tsx","./src/app/(dashboard)/companies/page.tsx","./src/app/(dashboard)/dashboard/page.tsx","./src/app/login/page.tsx","./node_modules/@types/bcryptjs/index.d.ts","./node_modules/@types/geojson/index.d.ts","./node_modules/@types/json5/index.d.ts","./node_modules/@types/leaflet/index.d.ts"],"fileIdsList":[[99,145,439],[99,145,442,455,456,461,466,471,474,477],[99,145,443,444,445,446],[99,145,445,447,448,455],[99,145,441,443,444],[99,145],[99,145,441],[99,145,439,446,467,468,469],[99,145,469,470],[99,145,439,441,467,468],[99,145,467],[99,145,446,475],[99,145,475,476],[99,145,157,446,472],[99,145,472,473],[99,145,157,166,441],[99,145,457],[99,145,446,457,458,459],[99,145,459,460],[99,145,441,457,458],[99,145,478],[99,145,462],[99,145,446,462,463,464],[99,145,464,465],[99,145,441,462,463],[99,145,449],[99,145,439,446,449,450,451,452,453],[99,145,451,454],[99,145,441,449,450],[99,145,497],[99,145,911],[99,145,830,843,910],[99,145,678,679,680,681,682],[99,145,497,498,499,500,501],[99,145,497,499],[99,145,692],[99,145,509],[85,99,145,507],[99,145,496,502],[99,145,429],[99,145,509,813],[99,145,813,814,815,816,819,820,821,822,823,824,825,828,829],[99,145,813],[99,145,817,818],[99,145,509,810,813],[99,145,807,808,810],[99,145,803,806,808,810],[99,145,807,810],[99,145,509,798,799,800,803,804,805,807,808,809,810],[99,145,800,803,804,805,806,807,808,809,810,811,812],[99,145,807],[99,145,801,807,808],[99,145,801,802],[99,145,806,808,809],[99,145,806],[99,145,798,803,808,809],[99,145,509,803,806,807,808],[99,145,826,827],[99,145,657,661],[99,145,509,655],[99,145,509,655,656],[99,145,509,655,656,658,659,660],[99,145,655],[99,145,509,673,684,689,695,696,703,705,706,708,745,747],[99,145,509,673,684,689,694,696,705,709,710,712,713,745,747],[99,145,509,705,710,749],[99,145,509,688,747],[99,145,509,672,673,675,684,747],[99,145,509,673,684,705,741,747],[99,145,509,673,711,732,736,747],[99,145,509,696,719,720,747,786],[99,145,509,673,684,689,695,696,745,747],[99,145,509,673,675,710,724,769],[99,145,509,671,673,675,724],[99,145,509,673,675,704,724,725,747],[99,145,509,673,684,687,691,695,696,720,734,735,745,747],[99,145,509,677,684,747],[99,145,509,677,684,745,747],[99,145,672,747],[99,145,684,747],[99,145,509,747],[99,145,509,710,720,747],[99,145,509,672,720,747],[99,145,509,720,747],[99,145,509,685],[99,145,509,673,720,747],[99,145,509,671,673,747],[99,145,509,672,673,674,747],[99,145,509,673,675,747,796],[99,145,509,697,698,699],[99,145,509,684,686,687,698,720,747,750],[99,145,740,747],[99,145,684,685,745,747,793],[99,145,671,672,673,675,676,677,684,685,687,695,696,697,700,707,710,711,720,724,726,732,734,735,736,737,742,745,747,748,749,751,752,753,754,755,756,757,758,760,762,763,764,765,766,767,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,792,793,794,795],[99,145,509,673,689,696,715,717,720,747],[99,145,509,673,677,725,747,761],[99,145,509,673,684],[99,145,509,673,677,725,747,759],[99,145,509,673,696,704,747],[99,145,509,673,684,689,694,696,705,745,747,755],[99,145,509,694,747],[99,145,509,709,747],[99,145,678,683,747],[99,145,676,677,678,683,745,747],[99,145,678,683,688],[99,145,678,683,719,737,747],[99,145,678,683,684,689,690,691,708,713,714,717,718,747],[99,145,678,683,697,700,747],[99,145,678,683,720,747],[99,145,678,683,684],[99,145,678,683],[99,145,678,683,684,723,724,726],[99,145,678,683,685,707,747],[99,145,703,719,740,747],[99,145,684,689,702,703,704,719,727,730,738,740,742,743,744,747],[99,145,684,689,702,703],[99,145,740],[99,145,683,684,689,701,719,720,721,722,727,728,729,730,731,738,739],[99,145,678,683,684,686,687,719,747],[99,145,689,702,707,719,747],[99,145,702,712,719],[99,145,689,719,747],[99,145,509,687,715,716,719,747],[99,145,719],[99,145,702,719],[99,145,687,689,719,747],[99,145,705,719,747],[99,145,720,747],[99,145,509,710,711,747],[99,145,687,694,701,703,704,720,745,747],[99,145,509,719,733,736,747],[99,145,747],[99,145,677,745,747],[99,145,747,791],[99,145,694,702,705,719],[99,145,509,715,768],[99,145,509,671,672,675,676,677,684,685,686,689,707,715,745,746],[99,145,678],[99,145,485,495,496],[99,145,484,485],[99,145,693],[99,145,481],[99,145,156,157,159,160,161,164,175,183,186,192,193,430,481,482,483,485,486,488,489,490,492,493,494,495,496],[99,145,481,482,483,487],[99,145,483],[99,145,485,496],[99,145,921],[99,145,831,832,843],[99,145,833,834],[99,145,831,832,833,835,836,841],[99,145,832,833],[99,145,841],[99,145,842],[99,145,833],[99,145,831,832,833,836,837,838,839,840],[99,145,910],[99,145,910,915],[99,145,905,908,910,913,914,915,916,917,918,919,920],[99,145,844,846,915],[99,145,910,913],[99,145,845,910,914],[99,145,846,848,850,851,852,853],[99,145,848,850,852,853],[99,145,848,850,852],[99,145,845,848,850,851,853],[99,145,844,846,847,848,849,850,851,852,853,854,855,905,906,907,908,909],[99,145,844,846,847,850],[99,145,846,847,850],[99,145,850,853],[99,145,844,845,847,848,849,851,852,853],[99,145,844,845,846,850,910],[99,145,850,851,852,853],[99,145,852],[99,145,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904],[99,145,409,509],[99,145,505],[99,145,509,648,652,653],[99,145,662,663],[99,145,509,652],[99,145,662],[99,145,652,662],[99,145,509,648],[99,145,505,509],[99,145,509,649,650],[99,145,509,637,648,652,796],[99,145,509,636,652,662,830,912,922],[99,145,509,638,648,652,662],[99,145,632,635,652,662],[99,145,509,652,662,830,912,922],[99,145,509,636,648,652,662,830,912,922],[99,145,166,496,503],[99,145,408,409],[99,145,437],[99,145,436],[99,145,438],[99,145,940],[99,142,145],[99,144,145],[145],[99,145,150,178],[99,145,146,151,156,164,175,186],[99,145,146,147,156,164],[94,95,96,99,145],[99,145,148,187],[99,145,149,150,157,165],[99,145,150,175,183],[99,145,151,153,156,164],[99,144,145,152],[99,145,153,154],[99,145,155,156],[99,144,145,156],[99,145,156,157,158,175,186],[99,145,156,157,158,171,175,178],[99,145,153,156,159,164,175,186],[99,145,156,157,159,160,164,175,183,186],[99,145,159,161,175,183,186],[97,98,99,100,101,102,103,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192],[99,145,156,162],[99,145,163,186,191],[99,145,153,156,164,175],[99,145,165],[99,145,166],[99,144,145,167],[99,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192],[99,145,169],[99,145,170],[99,145,156,171,172],[99,145,171,173,187,189],[99,145,156,175,176,178],[99,145,177,178],[99,145,175,176],[99,145,178],[99,145,179],[99,142,145,175,180],[99,145,156,181,182],[99,145,181,182],[99,145,150,164,175,183],[99,145,184],[99,145,164,185],[99,145,159,170,186],[99,145,150,187],[99,145,175,188],[99,145,163,189],[99,145,190],[99,140,145],[99,140,145,156,158,167,175,178,186,189,191],[99,145,175,192],[87,99,145,197,198,199],[87,99,145,197,198],[87,99,145],[87,91,99,145,196,361,404],[87,91,99,145,195,361,404],[84,85,86,99,145],[99,145,513],[99,145,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600],[99,145,569],[99,145,569,579],[99,145,568],[99,145,159,193,568],[99,145,559,566],[99,145,405,408,566,568],[99,145,520,554,562,564,565],[99,145,560,566,567],[99,145,405,408,563,568],[99,145,193,568],[99,145,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552],[99,145,560,562,568],[99,145,562,566,568],[99,145,557,558,561],[99,145,553,554,556,562,568],[87,99,145,562,568,932,933],[87,99,145,562,568],[92,99,145],[99,145,365],[99,145,367,368,369],[99,145,371],[99,145,202,212,218,220,361],[99,145,202,209,211,214,232],[99,145,212],[99,145,212,214,339],[99,145,267,285,300,407],[99,145,309],[99,145,202,212,219,253,263,336,337,407],[99,145,219,407],[99,145,212,263,264,265,407],[99,145,212,219,253,407],[99,145,407],[99,145,202,219,220,407],[99,145,293],[99,144,145,193,292],[87,99,145,286,287,288,306,307],[87,99,145,286],[99,145,276],[99,145,275,277,381],[87,99,145,286,287,304],[99,145,282,307,393],[99,145,391,392],[99,145,226,390],[99,145,279],[99,144,145,193,226,242,275,276,277,278],[87,99,145,304,306,307],[99,145,304,306],[99,145,304,305,307],[99,145,170,193],[99,145,274],[99,144,145,193,211,213,270,271,272,273],[87,99,145,203,384],[87,99,145,186,193],[87,99,145,219,251],[87,99,145,219],[99,145,249,254],[87,99,145,250,364],[87,91,99,145,159,193,195,196,361,402,403],[99,145,361],[99,145,201],[99,145,354,355,356,357,358,359],[99,145,356],[87,99,145,250,286,364],[87,99,145,286,362,364],[87,99,145,286,364],[99,145,159,193,213,364],[99,145,159,193,210,211,222,240,242,274,279,280,302,304],[99,145,271,274,279,287,289,290,291,293,294,295,296,297,298,299,407],[99,145,272],[87,99,145,170,193,211,212,240,242,243,245,270,302,303,307,361,407],[99,145,159,193,213,214,226,227,275],[99,145,159,193,212,214],[99,145,159,175,193,210,213,214],[99,145,159,170,186,193,210,211,212,213,214,219,222,223,233,234,236,239,240,242,243,244,245,269,270,303,304,312,314,317,319,322,324,325,326,327],[99,145,159,175,193],[99,145,202,203,204,210,211,361,364,407],[99,145,159,175,186,193,207,338,340,341,407],[99,145,170,186,193,207,210,213,230,234,236,237,238,243,270,317,328,330,336,350,351],[99,145,212,216,270],[99,145,210,212],[99,145,223,318],[99,145,320,321],[99,145,320],[99,145,318],[99,145,320,323],[99,145,206,207],[99,145,206,246],[99,145,206],[99,145,208,223,316],[99,145,315],[99,145,207,208],[99,145,208,313],[99,145,207],[99,145,302],[99,145,159,193,210,222,241,261,267,281,284,301,304],[99,145,255,256,257,258,259,260,282,283,307,362],[99,145,311],[99,145,159,193,210,222,241,247,308,310,312,361,364],[99,145,159,186,193,203,210,212,269],[99,145,266],[99,145,159,193,344,349],[99,145,233,242,269,364],[99,145,332,336,350,353],[99,145,159,216,336,344,345,353],[99,145,202,212,233,244,347],[99,145,159,193,212,219,244,331,332,342,343,346,348],[99,145,194,240,241,242,361,364],[99,145,159,170,186,193,208,210,211,213,216,221,222,230,233,234,236,237,238,239,243,245,269,270,314,328,329,364],[99,145,159,193,210,212,216,330,352],[99,145,159,193,211,213],[87,99,145,159,170,193,201,203,210,211,214,222,239,240,242,243,245,311,361,364],[99,145,159,170,186,193,205,208,209,213],[99,145,206,268],[99,145,159,193,206,211,222],[99,145,159,193,212,223],[99,145,159,193],[99,145,226],[99,145,225],[99,145,227],[99,145,212,224,226,230],[99,145,212,224,226],[99,145,159,193,205,212,213,219,227,228,229],[87,99,145,304,305,306],[99,145,262],[87,99,145,203],[87,99,145,236],[87,99,145,194,239,242,245,361,364],[99,145,203,384,385],[87,99,145,254],[87,99,145,170,186,193,201,248,250,252,253,364],[99,145,213,219,236],[99,145,235],[87,99,145,157,159,170,193,201,254,263,361,362,363],[83,87,88,89,90,99,145,195,196,361,404],[99,145,150],[99,145,333,334,335],[99,145,333],[99,145,373],[99,145,375],[99,145,377],[99,145,379],[99,145,382],[99,145,386],[91,93,99,145,361,366,370,372,374,376,378,380,383,387,389,395,396,398,405,406,407],[99,145,388],[99,145,394],[99,145,250],[99,145,397],[99,144,145,227,228,229,230,399,400,401,404],[99,145,193],[87,91,99,145,159,161,170,193,195,196,197,199,201,214,353,360,364,404],[99,145,521],[99,145,521,531],[99,145,150,159,160,161,186,187,193,553],[99,145,426],[99,145,424,426],[99,145,415,423,424,425,427,429],[99,145,413],[99,145,416,421,426,429],[99,145,412,429],[99,145,416,417,420,421,422,429],[99,145,416,417,418,420,421,429],[99,145,413,414,415,416,417,421,422,423,425,426,427,429],[99,145,411,413,414,415,416,417,418,420,421,422,423,424,425,426,427,428],[99,145,411,429],[99,145,416,418,419,421,422,429],[99,145,420,429],[99,145,421,422,426,429],[99,145,414,424],[99,145,431,432],[99,145,430,433],[99,112,116,145,186],[99,112,145,175,186],[99,107,145],[99,109,112,145,183,186],[99,145,164,183],[99,107,145,193],[99,109,112,145,164,186],[99,104,105,108,111,145,156,175,186],[99,112,119,145],[99,104,110,145],[99,112,133,134,145],[99,108,112,145,178,186,193],[99,133,145,193],[99,106,107,145,193],[99,112,145],[99,106,107,108,109,110,111,112,113,114,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,134,135,136,137,138,139,145],[99,112,127,145],[99,112,119,120,145],[99,110,112,120,121,145],[99,111,145],[99,104,107,112,145],[99,112,116,120,121,145],[99,116,145],[99,110,112,115,145,186],[99,104,109,112,119,145],[99,145,175],[99,107,112,133,145,191,193],[99,145,439,514],[87,99,145,648],[87,99,145,637],[87,99,145,395,633,934],[99,145,405,516],[99,145,568,602],[99,145,405,516,602,604],[99,145,405,516,602],[99,145,405,514,516],[99,145,408],[87,99,145,395,934],[87,99,145,636],[87,99,145,633],[99,145,389],[87,99,145,389],[99,145,389,395],[99,145,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646],[99,145,405,601],[99,145,514],[99,145,434]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"2ab096661c711e4a81cc464fa1e6feb929a54f5340b46b0a07ac6bbf857471f0","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"60037901da1a425516449b9a20073aa03386cce92f7a1fd902d7602be3a7c2e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"22adec94ef7047a6c9d1af3cb96be87a335908bf9ef386ae9fd50eeb37f44c47","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"73f78680d4c08509933daf80947902f6ff41b6230f94dd002ae372620adb0f60","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5239f5c01bcfa9cd32f37c496cf19c61d69d37e48be9de612b541aac915805b","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"0990a7576222f248f0a3b888adcb7389f957928ce2afb1cd5128169086ff4d29","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"87d9d29dbc745f182683f63187bf3d53fd8673e5fca38ad5eaab69798ed29fbc","impliedFormat":1},{"version":"035312d4945d13efa134ae482f6dc56a1a9346f7ac3be7ccbad5741058ce87f3","affectsGlobalScope":true,"impliedFormat":1},{"version":"cc69795d9954ee4ad57545b10c7bf1a7260d990231b1685c147ea71a6faa265c","impliedFormat":1},{"version":"8bc6c94ff4f2af1f4023b7bb2379b08d3d7dd80c698c9f0b07431ea16101f05f","impliedFormat":1},{"version":"1b61d259de5350f8b1e5db06290d31eaebebc6baafd5f79d314b5af9256d7153","impliedFormat":1},{"version":"57194e1f007f3f2cbef26fa299d4c6b21f4623a2eddc63dfeef79e38e187a36e","impliedFormat":1},{"version":"0f6666b58e9276ac3a38fdc80993d19208442d6027ab885580d93aec76b4ef00","impliedFormat":1},{"version":"05fd364b8ef02fb1e174fbac8b825bdb1e5a36a016997c8e421f5fab0a6da0a0","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"ba481bca06f37d3f2c137ce343c7d5937029b2468f8e26111f3c9d9963d6568d","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d9ef24f9a22a88e3e9b3b3d8c40ab1ddb0853f1bfbd5c843c37800138437b61","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"e2677634fe27e87348825bb041651e22d50a613e2fdf6a4a3ade971d71bac37e","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"8c0bcd6c6b67b4b503c11e91a1fb91522ed585900eab2ab1f61bba7d7caa9d6f","impliedFormat":1},{"version":"8cd19276b6590b3ebbeeb030ac271871b9ed0afc3074ac88a94ed2449174b776","affectsGlobalScope":true,"impliedFormat":1},{"version":"696eb8d28f5949b87d894b26dc97318ef944c794a9a4e4f62360cd1d1958014b","impliedFormat":1},{"version":"3f8fa3061bd7402970b399300880d55257953ee6d3cd408722cb9ac20126460c","impliedFormat":1},{"version":"35ec8b6760fd7138bbf5809b84551e31028fb2ba7b6dc91d95d098bf212ca8b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"68bd56c92c2bd7d2339457eb84d63e7de3bd56a69b25f3576e1568d21a162398","affectsGlobalScope":true,"impliedFormat":1},{"version":"3e93b123f7c2944969d291b35fed2af79a6e9e27fdd5faa99748a51c07c02d28","impliedFormat":1},{"version":"9d19808c8c291a9010a6c788e8532a2da70f811adb431c97520803e0ec649991","impliedFormat":1},{"version":"87aad3dd9752067dc875cfaa466fc44246451c0c560b820796bdd528e29bef40","impliedFormat":1},{"version":"4aacb0dd020eeaef65426153686cc639a78ec2885dc72ad220be1d25f1a439df","impliedFormat":1},{"version":"f0bd7e6d931657b59605c44112eaf8b980ba7f957a5051ed21cb93d978cf2f45","impliedFormat":1},{"version":"8db0ae9cb14d9955b14c214f34dae1b9ef2baee2fe4ce794a4cd3ac2531e3255","affectsGlobalScope":true,"impliedFormat":1},{"version":"15fc6f7512c86810273af28f224251a5a879e4261b4d4c7e532abfbfc3983134","impliedFormat":1},{"version":"58adba1a8ab2d10b54dc1dced4e41f4e7c9772cbbac40939c0dc8ce2cdb1d442","impliedFormat":1},{"version":"4b34bdb6f29a4347b7db9c0f8622686035fe25adb1c9e927acd8d22a2cbb6ccb","impliedFormat":1},{"version":"714435130b9015fae551788df2a88038471a5a11eb471f27c4ede86552842bc9","impliedFormat":1},{"version":"855cd5f7eb396f5f1ab1bc0f8580339bff77b68a770f84c6b254e319bbfd1ac7","impliedFormat":1},{"version":"5650cf3dace09e7c25d384e3e6b818b938f68f4e8de96f52d9c5a1b3db068e86","impliedFormat":1},{"version":"1354ca5c38bd3fd3836a68e0f7c9f91f172582ba30ab15bb8c075891b91502b7","affectsGlobalScope":true,"impliedFormat":1},{"version":"27fdb0da0daf3b337c5530c5f266efe046a6ceb606e395b346974e4360c36419","impliedFormat":1},{"version":"2d2fcaab481b31a5882065c7951255703ddbe1c0e507af56ea42d79ac3911201","impliedFormat":1},{"version":"a192fe8ec33f75edbc8d8f3ed79f768dfae11ff5735e7fe52bfa69956e46d78d","impliedFormat":1},{"version":"ca867399f7db82df981d6915bcbb2d81131d7d1ef683bc782b59f71dda59bc85","affectsGlobalScope":true,"impliedFormat":1},{"version":"0e456fd5b101271183d99a9087875a282323e3a3ff0d7bcf1881537eaa8b8e63","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e043a1bc8fbf2a255bccf9bf27e0f1caf916c3b0518ea34aa72357c0afd42ec","impliedFormat":1},{"version":"b4f70ec656a11d570e1a9edce07d118cd58d9760239e2ece99306ee9dfe61d02","impliedFormat":1},{"version":"3bc2f1e2c95c04048212c569ed38e338873f6a8593930cf5a7ef24ffb38fc3b6","impliedFormat":1},{"version":"6e70e9570e98aae2b825b533aa6292b6abd542e8d9f6e9475e88e1d7ba17c866","impliedFormat":1},{"version":"f9d9d753d430ed050dc1bf2667a1bab711ccbb1c1507183d794cc195a5b085cc","impliedFormat":1},{"version":"9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","impliedFormat":1},{"version":"47ab634529c5955b6ad793474ae188fce3e6163e3a3fb5edd7e0e48f14435333","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"fad4e3c207fe23922d0b2d06b01acbfb9714c4f2685cf80fd384c8a100c82fd0","affectsGlobalScope":true,"impliedFormat":1},{"version":"74cf591a0f63db318651e0e04cb55f8791385f86e987a67fd4d2eaab8191f730","impliedFormat":1},{"version":"5eab9b3dc9b34f185417342436ec3f106898da5f4801992d8ff38ab3aff346b5","impliedFormat":1},{"version":"12ed4559eba17cd977aa0db658d25c4047067444b51acfdcbf38470630642b23","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3ffabc95802521e1e4bcba4c88d8615176dc6e09111d920c7a213bdda6e1d65","impliedFormat":1},{"version":"ddc734b4fae82a01d247e9e342d020976640b5e93b4e9b3a1e30e5518883a060","impliedFormat":1},{"version":"ae56f65caf3be91108707bd8dfbccc2a57a91feb5daabf7165a06a945545ed26","impliedFormat":1},{"version":"a136d5de521da20f31631a0a96bf712370779d1c05b7015d7019a9b2a0446ca9","impliedFormat":1},{"version":"c3b41e74b9a84b88b1dca61ec39eee25c0dbc8e7d519ba11bb070918cfacf656","affectsGlobalScope":true,"impliedFormat":1},{"version":"4737a9dc24d0e68b734e6cfbcea0c15a2cfafeb493485e27905f7856988c6b29","affectsGlobalScope":true,"impliedFormat":1},{"version":"36d8d3e7506b631c9582c251a2c0b8a28855af3f76719b12b534c6edf952748d","impliedFormat":1},{"version":"1ca69210cc42729e7ca97d3a9ad48f2e9cb0042bada4075b588ae5387debd318","impliedFormat":1},{"version":"f5ebe66baaf7c552cfa59d75f2bfba679f329204847db3cec385acda245e574e","impliedFormat":1},{"version":"ed59add13139f84da271cafd32e2171876b0a0af2f798d0c663e8eeb867732cf","affectsGlobalScope":true,"impliedFormat":1},{"version":"05db535df8bdc30d9116fe754a3473d1b6479afbc14ae8eb18b605c62677d518","impliedFormat":1},{"version":"b1810689b76fd473bd12cc9ee219f8e62f54a7d08019a235d07424afbf074d25","impliedFormat":1},{"version":"8caa5c86be1b793cd5f599e27ecb34252c41e011980f7d61ae4989a149ff6ccc","impliedFormat":1},{"version":"f9fd93190acb1ffe0bc0fb395df979452f8d625071e9ffc8636e4dfb86ab2508","impliedFormat":1},{"version":"5f41fd8732a89e940c58ce22206e3df85745feb8983e2b4c6257fb8cbb118493","impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"1cfa8647d7d71cb03847d616bd79320abfc01ddea082a49569fda71ac5ece66b","impliedFormat":1},{"version":"bb7a61dd55dc4b9422d13da3a6bb9cc5e89be888ef23bbcf6558aa9726b89a1c","impliedFormat":1},{"version":"db6d2d9daad8a6d83f281af12ce4355a20b9a3e71b82b9f57cddcca0a8964a96","impliedFormat":1},{"version":"cfe4ef4710c3786b6e23dae7c086c70b4f4835a2e4d77b75d39f9046106e83d3","impliedFormat":1},{"version":"cbea99888785d49bb630dcbb1613c73727f2b5a2cf02e1abcaab7bcf8d6bf3c5","impliedFormat":1},{"version":"3a8bddb66b659f6bd2ff641fc71df8a8165bafe0f4b799cc298be5cd3755bb20","impliedFormat":1},{"version":"a86f82d646a739041d6702101afa82dcb935c416dd93cbca7fd754fd0282ce1f","impliedFormat":1},{"version":"2dad084c67e649f0f354739ec7df7c7df0779a28a4f55c97c6b6883ae850d1ce","impliedFormat":1},{"version":"fa5bbc7ab4130dd8cdc55ea294ec39f76f2bc507a0f75f4f873e38631a836ca7","impliedFormat":1},{"version":"df45ca1176e6ac211eae7ddf51336dc075c5314bc5c253651bae639defd5eec5","impliedFormat":1},{"version":"cf86de1054b843e484a3c9300d62fbc8c97e77f168bbffb131d560ca0474d4a8","impliedFormat":1},{"version":"196c960b12253fde69b204aa4fbf69470b26daf7a430855d7f94107a16495ab0","impliedFormat":1},{"version":"ee15ea5dd7a9fc9f5013832e5843031817a880bf0f24f37a29fd8337981aae07","impliedFormat":1},{"version":"bf24f6d35f7318e246010ffe9924395893c4e96d34324cde77151a73f078b9ad","impliedFormat":1},{"version":"ea53732769832d0f127ae16620bd5345991d26bf0b74e85e41b61b27d74ea90f","impliedFormat":1},{"version":"10595c7ff5094dd5b6a959ccb1c00e6a06441b4e10a87bc09c15f23755d34439","impliedFormat":1},{"version":"9620c1ff645afb4a9ab4044c85c26676f0a93e8c0e4b593aea03a89ccb47b6d0","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"a9af0e608929aaf9ce96bd7a7b99c9360636c31d73670e4af09a09950df97841","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"c86fe861cf1b4c46a0fb7d74dffe596cf679a2e5e8b1456881313170f092e3fa","impliedFormat":1},{"version":"08ed0b3f0166787f84a6606f80aa3b1388c7518d78912571b203817406e471da","impliedFormat":1},{"version":"47e5af2a841356a961f815e7c55d72554db0c11b4cba4d0caab91f8717846a94","impliedFormat":1},{"version":"65f43099ded6073336e697512d9b80f2d4fec3182b7b2316abf712e84104db00","impliedFormat":1},{"version":"f5f541902bf7ae0512a177295de9b6bcd6809ea38307a2c0a18bfca72212f368","impliedFormat":1},{"version":"b0decf4b6da3ebc52ea0c96095bdfaa8503acc4ac8e9081c5f2b0824835dd3bd","impliedFormat":1},{"version":"ca1b882a105a1972f82cc58e3be491e7d750a1eb074ffd13b198269f57ed9e1b","impliedFormat":1},{"version":"fc3e1c87b39e5ba1142f27ec089d1966da168c04a859a4f6aab64dceae162c2b","impliedFormat":1},{"version":"3b414b99a73171e1c4b7b7714e26b87d6c5cb03d200352da5342ab4088a54c85","impliedFormat":1},{"version":"61888522cec948102eba94d831c873200aa97d00d8989fdfd2a3e0ee75ec65a2","impliedFormat":1},{"version":"4e10622f89fea7b05dd9b52fb65e1e2b5cbd96d4cca3d9e1a60bb7f8a9cb86a1","impliedFormat":1},{"version":"74b2a5e5197bd0f2e0077a1ea7c07455bbea67b87b0869d9786d55104006784f","impliedFormat":1},{"version":"59bf32919de37809e101acffc120596a9e45fdbab1a99de5087f31fdc36e2f11","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"faa03dffb64286e8304a2ca96dd1317a77db6bfc7b3fb385163648f67e535d77","impliedFormat":1},{"version":"c40c848daad198266370c1c72a7a8c3d18d2f50727c7859fcfefd3ff69a7f288","impliedFormat":1},{"version":"ac60bbee0d4235643cc52b57768b22de8c257c12bd8c2039860540cab1fa1d82","impliedFormat":1},{"version":"6428e6edd944ce6789afdf43f9376c1f2e4957eea34166177625aaff4c0da1a0","impliedFormat":1},{"version":"ada39cbb2748ab2873b7835c90c8d4620723aedf323550e8489f08220e477c7f","impliedFormat":1},{"version":"6e5f5cee603d67ee1ba6120815497909b73399842254fc1e77a0d5cdc51d8c9c","impliedFormat":1},{"version":"8dba67056cbb27628e9b9a1cba8e57036d359dceded0725c72a3abe4b6c79cd4","impliedFormat":1},{"version":"70f3814c457f54a7efe2d9ce9d2686de9250bb42eb7f4c539bd2280a42e52d33","impliedFormat":1},{"version":"154dd2e22e1e94d5bc4ff7726706bc0483760bae40506bdce780734f11f7ec47","impliedFormat":1},{"version":"ef61792acbfa8c27c9bd113f02731e66229f7d3a169e3c1993b508134f1a58e0","impliedFormat":1},{"version":"9c82171d836c47486074e4ca8e059735bf97b205e70b196535b5efd40cbe1bc5","impliedFormat":1},{"version":"0131e203d8560edb39678abe10db42564a068f98c4ebd1ed9ffe7279c78b3c81","impliedFormat":1},{"version":"f6404e7837b96da3ea4d38c4f1a3812c96c9dcdf264e93d5bdb199f983a3ef4b","impliedFormat":1},{"version":"c5426dbfc1cf90532f66965a7aa8c1136a78d4d0f96d8180ecbfc11d7722f1a5","impliedFormat":1},{"version":"65a15fc47900787c0bd18b603afb98d33ede930bed1798fc984d5ebb78b26cf9","impliedFormat":1},{"version":"9d202701f6e0744adb6314d03d2eb8fc994798fc83d91b691b75b07626a69801","impliedFormat":1},{"version":"de9d2df7663e64e3a91bf495f315a7577e23ba088f2949d5ce9ec96f44fba37d","impliedFormat":1},{"version":"c7af78a2ea7cb1cd009cfb5bdb48cd0b03dad3b54f6da7aab615c2e9e9d570c5","impliedFormat":1},{"version":"1ee45496b5f8bdee6f7abc233355898e5bf9bd51255db65f5ff7ede617ca0027","impliedFormat":1},{"version":"8b8f00491431fe82f060dfe8c7f2180a9fb239f3d851527db909b83230e75882","affectsGlobalScope":true,"impliedFormat":1},{"version":"db01d18853469bcb5601b9fc9826931cc84cc1a1944b33cad76fd6f1e3d8c544","affectsGlobalScope":true,"impliedFormat":1},{"version":"dba114fb6a32b355a9cfc26ca2276834d72fe0e94cd2c3494005547025015369","impliedFormat":1},{"version":"903e299a28282fa7b714586e28409ed73c3b63f5365519776bf78e8cf173db36","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa6c12a7c0f6b84d512f200690bfc74819e99efae69e4c95c4cd30f6884c526e","impliedFormat":1},{"version":"f1c32f9ce9c497da4dc215c3bc84b722ea02497d35f9134db3bb40a8d918b92b","impliedFormat":1},{"version":"b73c319af2cc3ef8f6421308a250f328836531ea3761823b4cabbd133047aefa","affectsGlobalScope":true,"impliedFormat":1},{"version":"e433b0337b8106909e7953015e8fa3f2d30797cea27141d1c5b135365bb975a6","impliedFormat":1},{"version":"dd3900b24a6a8745efeb7ad27629c0f8a626470ac229c1d73f1fe29d67e44dca","impliedFormat":1},{"version":"ddff7fc6edbdc5163a09e22bf8df7bef75f75369ebd7ecea95ba55c4386e2441","impliedFormat":1},{"version":"106c6025f1d99fd468fd8bf6e5bda724e11e5905a4076c5d29790b6c3745e50c","impliedFormat":1},{"version":"ec29be0737d39268696edcec4f5e97ce26f449fa9b7afc2f0f99a86def34a418","impliedFormat":1},{"version":"aeab39e8e0b1a3b250434c3b2bb8f4d17bbec2a9dbce5f77e8a83569d3d2cbc2","impliedFormat":1},{"version":"ec6cba1c02c675e4dd173251b156792e8d3b0c816af6d6ad93f1a55d674591aa","impliedFormat":1},{"version":"b620391fe8060cf9bedc176a4d01366e6574d7a71e0ac0ab344a4e76576fcbb8","impliedFormat":1},{"version":"d729408dfde75b451530bcae944cf89ee8277e2a9df04d1f62f2abfd8b03c1e1","impliedFormat":1},{"version":"e15d3c84d5077bb4a3adee4c791022967b764dc41cb8fa3cfa44d4379b2c95f5","impliedFormat":1},{"version":"5f58e28cd22e8fc1ac1b3bc6b431869f1e7d0b39e2c21fbf79b9fa5195a85980","impliedFormat":1},{"version":"e1fc1a1045db5aa09366be2b330e4ce391550041fc3e925f60998ca0b647aa97","impliedFormat":1},{"version":"63533978dcda286422670f6e184ac516805a365fb37a086eeff4309e812f1402","impliedFormat":1},{"version":"43ba4f2fa8c698f5c304d21a3ef596741e8e85a810b7c1f9b692653791d8d97a","impliedFormat":1},{"version":"31fb49ef3aa3d76f0beb644984e01eab0ea222372ea9b49bb6533be5722d756c","impliedFormat":1},{"version":"33cd131e1461157e3e06b06916b5176e7a8ec3fce15a5cfe145e56de744e07d2","impliedFormat":1},{"version":"889ef863f90f4917221703781d9723278db4122d75596b01c429f7c363562b86","impliedFormat":1},{"version":"3556cfbab7b43da96d15a442ddbb970e1f2fc97876d055b6555d86d7ac57dae5","impliedFormat":1},{"version":"437751e0352c6e924ddf30e90849f1d9eb00ca78c94d58d6a37202ec84eb8393","impliedFormat":1},{"version":"48e8af7fdb2677a44522fd185d8c87deff4d36ee701ea003c6c780b1407a1397","impliedFormat":1},{"version":"d11308de5a36c7015bb73adb5ad1c1bdaac2baede4cc831a05cf85efa3cc7f2f","impliedFormat":1},{"version":"38e4684c22ed9319beda6765bab332c724103d3a966c2e5e1c5a49cf7007845f","impliedFormat":1},{"version":"f9812cfc220ecf7557183379531fa409acd249b9e5b9a145d0d52b76c20862de","affectsGlobalScope":true,"impliedFormat":1},{"version":"e650298721abc4f6ae851e60ae93ee8199791ceec4b544c3379862f81f43178c","impliedFormat":1},{"version":"2e4f37ffe8862b14d8e24ae8763daaa8340c0df0b859d9a9733def0eee7562d9","impliedFormat":1},{"version":"13283350547389802aa35d9f2188effaeac805499169a06ef5cd77ce2a0bd63f","impliedFormat":1},{"version":"680793958f6a70a44c8d9ae7d46b7a385361c69ac29dcab3ed761edce1c14ab8","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"42c169fb8c2d42f4f668c624a9a11e719d5d07dacbebb63cbcf7ef365b0a75b3","impliedFormat":1},{"version":"913ddbba170240070bd5921b8f33ea780021bdf42fbdfcd4fcb2691b1884ddde","impliedFormat":1},{"version":"b4e6d416466999ff40d3fe5ceb95f7a8bfb7ac2262580287ac1a8391e5362431","impliedFormat":1},{"version":"5fe23bd829e6be57d41929ac374ee9551ccc3c44cee893167b7b5b77be708014","impliedFormat":1},{"version":"0a626484617019fcfbfc3c1bc1f9e84e2913f1adb73692aa9075817404fb41a1","impliedFormat":1},{"version":"438c7513b1df91dcef49b13cd7a1c4720f91a36e88c1df731661608b7c055f10","impliedFormat":1},{"version":"cf185cc4a9a6d397f416dd28cca95c227b29f0f27b160060a95c0e5e36cda865","impliedFormat":1},{"version":"0086f3e4ad898fd7ca56bb223098acfacf3fa065595182aaf0f6c4a6a95e6fbd","impliedFormat":1},{"version":"efaa078e392f9abda3ee8ade3f3762ab77f9c50b184e6883063a911742a4c96a","impliedFormat":1},{"version":"54a8bb487e1dc04591a280e7a673cdfb272c83f61e28d8a64cf1ac2e63c35c51","impliedFormat":1},{"version":"021a9498000497497fd693dd315325484c58a71b5929e2bbb91f419b04b24cea","impliedFormat":1},{"version":"9385cdc09850950bc9b59cca445a3ceb6fcca32b54e7b626e746912e489e535e","impliedFormat":1},{"version":"2894c56cad581928bb37607810af011764a2f511f575d28c9f4af0f2ef02d1ab","impliedFormat":1},{"version":"0a72186f94215d020cb386f7dca81d7495ab6c17066eb07d0f44a5bf33c1b21a","impliedFormat":1},{"version":"84124384abae2f6f66b7fbfc03862d0c2c0b71b826f7dbf42c8085d31f1d3f95","impliedFormat":1},{"version":"63a8e96f65a22604eae82737e409d1536e69a467bb738bec505f4f97cce9d878","impliedFormat":1},{"version":"3fd78152a7031315478f159c6a5872c712ece6f01212c78ea82aef21cb0726e2","impliedFormat":1},{"version":"b01bd582a6e41457bc56e6f0f9de4cb17f33f5f3843a7cf8210ac9c18472fb0f","impliedFormat":1},{"version":"58b49e5c1def740360b5ae22ae2405cfac295fee74abd88d74ac4ea42502dc03","impliedFormat":1},{"version":"512fc15cca3a35b8dbbf6e23fe9d07e6f87ad03c895acffd3087ce09f352aad0","impliedFormat":1},{"version":"9a0946d15a005832e432ea0cd4da71b57797efb25b755cc07f32274296d62355","impliedFormat":1},{"version":"a52ff6c0a149e9f370372fc3c715d7f2beee1f3bab7980e271a7ab7d313ec677","impliedFormat":1},{"version":"fd933f824347f9edd919618a76cdb6a0c0085c538115d9a287fa0c7f59957ab3","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"6a1aa3e55bdc50503956c5cd09ae4cd72e3072692d742816f65c66ca14f4dfdd","impliedFormat":1},{"version":"ab75cfd9c4f93ffd601f7ca1753d6a9d953bbedfbd7a5b3f0436ac8a1de60dfa","impliedFormat":1},{"version":"f95180f03d827525ca4f990f49e17ec67198c316dd000afbe564655141f725cd","impliedFormat":1},{"version":"b73cbf0a72c8800cf8f96a9acfe94f3ad32ca71342a8908b8ae484d61113f647","impliedFormat":1},{"version":"bae6dd176832f6423966647382c0d7ba9e63f8c167522f09a982f086cd4e8b23","impliedFormat":1},{"version":"1364f64d2fb03bbb514edc42224abd576c064f89be6a990136774ecdd881a1da","impliedFormat":1},{"version":"c9958eb32126a3843deedda8c22fb97024aa5d6dd588b90af2d7f2bfac540f23","impliedFormat":1},{"version":"950fb67a59be4c2dbe69a5786292e60a5cb0e8612e0e223537784c731af55db1","impliedFormat":1},{"version":"e927c2c13c4eaf0a7f17e6022eee8519eb29ef42c4c13a31e81a611ab8c95577","impliedFormat":1},{"version":"07ca44e8d8288e69afdec7a31fa408ce6ab90d4f3d620006701d5544646da6aa","impliedFormat":1},{"version":"70246ad95ad8a22bdfe806cb5d383a26c0c6e58e7207ab9c431f1cb175aca657","impliedFormat":1},{"version":"f00f3aa5d64ff46e600648b55a79dcd1333458f7a10da2ed594d9f0a44b76d0b","impliedFormat":1},{"version":"772d8d5eb158b6c92412c03228bd9902ccb1457d7a705b8129814a5d1a6308fc","impliedFormat":1},{"version":"4e4475fba4ed93a72f167b061cd94a2e171b82695c56de9899275e880e06ba41","impliedFormat":1},{"version":"97c5f5d580ab2e4decd0a3135204050f9b97cd7908c5a8fbc041eadede79b2fa","impliedFormat":1},{"version":"c99a3a5f2215d5b9d735aa04cec6e61ed079d8c0263248e298ffe4604d4d0624","impliedFormat":1},{"version":"49b2375c586882c3ac7f57eba86680ff9742a8d8cb2fe25fe54d1b9673690d41","impliedFormat":1},{"version":"802e797bcab5663b2c9f63f51bdf67eff7c41bc64c0fd65e6da3e7941359e2f7","impliedFormat":1},{"version":"847e160d709c74cc714fbe1f99c41d3425b74cd47b1be133df1623cd87014089","impliedFormat":1},{"version":"9fee04f1e1afa50524862289b9f0b0fdc3735b80e2a0d684cec3b9ff3d94cecc","impliedFormat":1},{"version":"5cdc27fbc5c166fc5c763a30ac21cbac9859dc5ba795d3230db6d4e52a1965bb","impliedFormat":1},{"version":"6459054aabb306821a043e02b89d54da508e3a6966601a41e71c166e4ea1474f","impliedFormat":1},{"version":"f416c9c3eee9d47ff49132c34f96b9180e50485d435d5748f0e8b72521d28d2e","impliedFormat":1},{"version":"05c97cddbaf99978f83d96de2d8af86aded9332592f08ce4a284d72d0952c391","impliedFormat":1},{"version":"14e5cdec6f8ae82dfd0694e64903a0a54abdfe37e1d966de3d4128362acbf35f","impliedFormat":1},{"version":"bbc183d2d69f4b59fd4dd8799ffdf4eb91173d1c4ad71cce91a3811c021bf80c","impliedFormat":1},{"version":"7b6ff760c8a240b40dab6e4419b989f06a5b782f4710d2967e67c695ef3e93c4","impliedFormat":1},{"version":"8dbc4134a4b3623fc476be5f36de35c40f2768e2e3d9ed437e0d5f1c4cd850f6","impliedFormat":1},{"version":"4e06330a84dec7287f7ebdd64978f41a9f70a668d3b5edc69d5d4a50b9b376bb","impliedFormat":1},{"version":"65bfa72967fbe9fc33353e1ac03f0480aa2e2ea346d61ff3ea997dfd850f641a","impliedFormat":1},{"version":"c06f0bb92d1a1a5a6c6e4b5389a5664d96d09c31673296cb7da5fe945d54d786","impliedFormat":1},{"version":"f974e4a06953682a2c15d5bd5114c0284d5abf8bc0fe4da25cb9159427b70072","impliedFormat":1},{"version":"872caaa31423f4345983d643e4649fb30f548e9883a334d6d1c5fff68ede22d4","impliedFormat":1},{"version":"94404c4a878fe291e7578a2a80264c6f18e9f1933fbb57e48f0eb368672e389c","impliedFormat":1},{"version":"5c1b7f03aa88be854bc15810bfd5bd5a1943c5a7620e1c53eddd2a013996343e","impliedFormat":1},{"version":"09dfc64fcd6a2785867f2368419859a6cc5a8d4e73cbe2538f205b1642eb0f51","impliedFormat":1},{"version":"bcf6f0a323653e72199105a9316d91463ad4744c546d1271310818b8cef7c608","impliedFormat":1},{"version":"01aa917531e116485beca44a14970834687b857757159769c16b228eb1e49c5f","impliedFormat":1},{"version":"351475f9c874c62f9b45b1f0dc7e2704e80dfd5f1af83a3a9f841f9dfe5b2912","impliedFormat":1},{"version":"ac457ad39e531b7649e7b40ee5847606eac64e236efd76c5d12db95bf4eacd17","impliedFormat":1},{"version":"187a6fdbdecb972510b7555f3caacb44b58415da8d5825d03a583c4b73fde4cf","impliedFormat":1},{"version":"d4c3250105a612202289b3a266bb7e323db144f6b9414f9dea85c531c098b811","impliedFormat":1},{"version":"95b444b8c311f2084f0fb51c616163f950fb2e35f4eaa07878f313a2d36c98a4","impliedFormat":1},{"version":"741067675daa6d4334a2dc80a4452ca3850e89d5852e330db7cb2b5f867173b1","impliedFormat":1},{"version":"f8acecec1114f11690956e007d920044799aefeb3cece9e7f4b1f8a1d542b2c9","impliedFormat":1},{"version":"178071ccd043967a58c5d1a032db0ddf9bd139e7920766b537d9783e88eb615e","impliedFormat":1},{"version":"3a17f09634c50cce884721f54fd9e7b98e03ac505889c560876291fcf8a09e90","impliedFormat":1},{"version":"32531dfbb0cdc4525296648f53b2b5c39b64282791e2a8c765712e49e6461046","impliedFormat":1},{"version":"0ce1b2237c1c3df49748d61568160d780d7b26693bd9feb3acb0744a152cd86d","impliedFormat":1},{"version":"e489985388e2c71d3542612685b4a7db326922b57ac880f299da7026a4e8a117","impliedFormat":1},{"version":"5cad4158616d7793296dd41e22e1257440910ea8d01c7b75045d4dfb20c5a41a","impliedFormat":1},{"version":"04d3aad777b6af5bd000bfc409907a159fe77e190b9d368da4ba649cdc28d39e","affectsGlobalScope":true,"impliedFormat":1},{"version":"74efc1d6523bd57eb159c18d805db4ead810626bc5bc7002a2c7f483044b2e0f","impliedFormat":1},{"version":"19252079538942a69be1645e153f7dbbc1ef56b4f983c633bf31fe26aeac32cd","impliedFormat":1},{"version":"bc11f3ac00ac060462597add171220aed628c393f2782ac75dd29ff1e0db871c","impliedFormat":1},{"version":"616775f16134fa9d01fc677ad3f76e68c051a056c22ab552c64cc281a9686790","impliedFormat":1},{"version":"65c24a8baa2cca1de069a0ba9fba82a173690f52d7e2d0f1f7542d59d5eb4db0","impliedFormat":1},{"version":"f9fe6af238339a0e5f7563acee3178f51db37f32a2e7c09f85273098cee7ec49","impliedFormat":1},{"version":"3b0b1d352b8d2e47f1c4df4fb0678702aee071155b12ef0185fce9eb4fa4af1e","impliedFormat":1},{"version":"77e71242e71ebf8528c5802993697878f0533db8f2299b4d36aa015bae08a79c","impliedFormat":1},{"version":"a344403e7a7384e0e7093942533d309194ad0a53eca2a3100c0b0ab4d3932773","impliedFormat":1},{"version":"b7fff2d004c5879cae335db8f954eb1d61242d9f2d28515e67902032723caeab","impliedFormat":1},{"version":"5f3dc10ae646f375776b4e028d2bed039a93eebbba105694d8b910feebbe8b9c","impliedFormat":1},{"version":"bb18bf4a61a17b4a6199eb3938ecfa4a59eb7c40843ad4a82b975ab6f7e3d925","impliedFormat":1},{"version":"4545c1a1ceca170d5d83452dd7c4994644c35cf676a671412601689d9a62da35","impliedFormat":1},{"version":"e9b6fc05f536dfddcdc65dbcf04e09391b1c968ab967382e48924f5cb90d88e1","impliedFormat":1},{"version":"a2d648d333cf67b9aeac5d81a1a379d563a8ffa91ddd61c6179f68de724260ff","impliedFormat":1},{"version":"2b664c3cc544d0e35276e1fb2d4989f7d4b4027ffc64da34ec83a6ccf2e5c528","impliedFormat":1},{"version":"a3f41ed1b4f2fc3049394b945a68ae4fdefd49fa1739c32f149d32c0545d67f5","impliedFormat":1},{"version":"3cd8f0464e0939b47bfccbb9bb474a6d87d57210e304029cd8eb59c63a81935d","impliedFormat":1},{"version":"47699512e6d8bebf7be488182427189f999affe3addc1c87c882d36b7f2d0b0e","impliedFormat":1},{"version":"3026abd48e5e312f2328629ede6e0f770d21c3cd32cee705c450e589d015ee09","impliedFormat":1},{"version":"8b140b398a6afbd17cc97c38aea5274b2f7f39b1ae5b62952cfe65bf493e3e75","impliedFormat":1},{"version":"7663d2c19ce5ef8288c790edba3d45af54e58c84f1b37b1249f6d49d962f3d91","impliedFormat":1},{"version":"5cce3b975cdb72b57ae7de745b3c5de5790781ee88bcb41ba142f07c0fa02e97","impliedFormat":1},{"version":"00bd6ebe607246b45296aa2b805bd6a58c859acecda154bfa91f5334d7c175c6","impliedFormat":1},{"version":"ad036a85efcd9e5b4f7dd5c1a7362c8478f9a3b6c3554654ca24a29aa850a9c5","impliedFormat":1},{"version":"fedebeae32c5cdd1a85b4e0504a01996e4a8adf3dfa72876920d3dd6e42978e7","impliedFormat":1},{"version":"0d28b974a7605c4eda20c943b3fa9ae16cb452c1666fc9b8c341b879992c7612","impliedFormat":1},{"version":"cdf21eee8007e339b1b9945abf4a7b44930b1d695cc528459e68a3adc39a622e","impliedFormat":1},{"version":"db036c56f79186da50af66511d37d9fe77fa6793381927292d17f81f787bb195","impliedFormat":1},{"version":"87ac2fb61e629e777f4d161dff534c2023ee15afd9cb3b1589b9b1f014e75c58","impliedFormat":1},{"version":"13c8b4348db91e2f7d694adc17e7438e6776bc506d5c8f5de9ad9989707fa3fe","impliedFormat":1},{"version":"3c1051617aa50b38e9efaabce25e10a5dd9b1f42e372ef0e8a674076a68742ed","impliedFormat":1},{"version":"07a3e20cdcb0f1182f452c0410606711fbea922ca76929a41aacb01104bc0d27","impliedFormat":1},{"version":"1de80059b8078ea5749941c9f863aa970b4735bdbb003be4925c853a8b6b4450","impliedFormat":1},{"version":"1d079c37fa53e3c21ed3fa214a27507bda9991f2a41458705b19ed8c2b61173d","impliedFormat":1},{"version":"4cd4b6b1279e9d744a3825cbd7757bbefe7f0708f3f1069179ad535f19e8ed2c","impliedFormat":1},{"version":"5835a6e0d7cd2738e56b671af0e561e7c1b4fb77751383672f4b009f4e161d70","impliedFormat":1},{"version":"c0eeaaa67c85c3bb6c52b629ebbfd3b2292dc67e8c0ffda2fc6cd2f78dc471e6","impliedFormat":1},{"version":"4b7f74b772140395e7af67c4841be1ab867c11b3b82a51b1aeb692822b76c872","impliedFormat":1},{"version":"27be6622e2922a1b412eb057faa854831b95db9db5035c3f6d4b677b902ab3b7","impliedFormat":1},{"version":"b95a6f019095dd1d48fd04965b50dfd63e5743a6e75478343c46d2582a5132bf","impliedFormat":99},{"version":"c2008605e78208cfa9cd70bd29856b72dda7ad89df5dc895920f8e10bcb9cd0a","impliedFormat":99},{"version":"b97cb5616d2ab82a98ec9ada7b9e9cabb1f5da880ec50ea2b8dc5baa4cbf3c16","impliedFormat":99},{"version":"d23df9ff06ae8bf1dcb7cc933e97ae7da418ac77749fecee758bb43a8d69f840","affectsGlobalScope":true,"impliedFormat":1},{"version":"040c71dde2c406f869ad2f41e8d4ce579cc60c8dbe5aa0dd8962ac943b846572","affectsGlobalScope":true,"impliedFormat":1},{"version":"3586f5ea3cc27083a17bd5c9059ede9421d587286d5a47f4341a4c2d00e4fa91","impliedFormat":1},{"version":"a6df929821e62f4719551f7955b9f42c0cd53c1370aec2dd322e24196a7dfe33","impliedFormat":1},{"version":"b789bf89eb19c777ed1e956dbad0925ca795701552d22e68fd130a032008b9f9","impliedFormat":1},"9dd9d642cdb87d4d5b3173217e0c45429b3e47a6f5cf5fb0ead6c644ec5fed01",{"version":"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","impliedFormat":1},{"version":"8885cf05f3e2abf117590bbb951dcf6359e3e5ac462af1c901cfd24c6a6472e2","impliedFormat":1},{"version":"333caa2bfff7f06017f114de738050dd99a765c7eb16571c6d25a38c0d5365dc","impliedFormat":1},{"version":"e61df3640a38d535fd4bc9f4a53aef17c296b58dc4b6394fd576b808dd2fe5e6","impliedFormat":1},{"version":"459920181700cec8cbdf2a5faca127f3f17fd8dd9d9e577ed3f5f3af5d12a2e4","impliedFormat":1},{"version":"4719c209b9c00b579553859407a7e5dcfaa1c472994bd62aa5dd3cc0757eb077","impliedFormat":1},{"version":"7ec359bbc29b69d4063fe7dad0baaf35f1856f914db16b3f4f6e3e1bca4099fa","impliedFormat":1},{"version":"70790a7f0040993ca66ab8a07a059a0f8256e7bb57d968ae945f696cbff4ac7a","impliedFormat":1},{"version":"d1b9a81e99a0050ca7f2d98d7eedc6cda768f0eb9fa90b602e7107433e64c04c","impliedFormat":1},{"version":"a022503e75d6953d0e82c2c564508a5c7f8556fad5d7f971372d2d40479e4034","impliedFormat":1},{"version":"b215c4f0096f108020f666ffcc1f072c81e9f2f95464e894a5d5f34c5ea2a8b1","impliedFormat":1},{"version":"644491cde678bd462bb922c1d0cfab8f17d626b195ccb7f008612dc31f445d2d","impliedFormat":1},{"version":"dfe54dab1fa4961a6bcfba68c4ca955f8b5bbeb5f2ab3c915aa7adaa2eabc03a","impliedFormat":1},{"version":"1251d53755b03cde02466064260bb88fd83c30006a46395b7d9167340bc59b73","impliedFormat":1},{"version":"47865c5e695a382a916b1eedda1b6523145426e48a2eae4647e96b3b5e52024f","impliedFormat":1},{"version":"4cdf27e29feae6c7826cdd5c91751cc35559125e8304f9e7aed8faef97dcf572","impliedFormat":1},{"version":"331b8f71bfae1df25d564f5ea9ee65a0d847c4a94baa45925b6f38c55c7039bf","impliedFormat":1},{"version":"2a771d907aebf9391ac1f50e4ad37952943515eeea0dcc7e78aa08f508294668","impliedFormat":1},{"version":"0146fd6262c3fd3da51cb0254bb6b9a4e42931eb2f56329edd4c199cb9aaf804","impliedFormat":1},{"version":"183f480885db5caa5a8acb833c2be04f98056bdcc5fb29e969ff86e07efe57ab","impliedFormat":99},{"version":"b558c9a18ea4e6e4157124465c3ef1063e64640da139e67be5edb22f534f2f08","impliedFormat":1},{"version":"01374379f82be05d25c08d2f30779fa4a4c41895a18b93b33f14aeef51768692","impliedFormat":1},{"version":"b0dee183d4e65cf938242efaf3d833c6b645afb35039d058496965014f158141","impliedFormat":1},{"version":"c0bbbf84d3fbd85dd60d040c81e8964cc00e38124a52e9c5dcdedf45fea3f213","impliedFormat":1},"8880e4796c3e98b43dc5ff31b58960cf23324c0c46fba345f985c98f34dc126d",{"version":"21247c958d397091ec30e63b27294baa1d1434c333da4fda697743190311dc62","impliedFormat":1},{"version":"b93f20711c5e92aca7f3a706aae3ec42d0851fd8e75bc90b4015d0d2366930ea","impliedFormat":1},{"version":"d5eb5865d4cbaa9985cc3cfb920b230cdcf3363f1e70903a08dc4baab80b0ce1","impliedFormat":1},{"version":"51ebca098538b252953b1ef83c165f25b52271bfb6049cd09d197dddd4cd43c5","impliedFormat":1},"8de037df4eadb6bf0760ad344474d1a11a0915f5814872846fce96933b6a3b70","092fb7b72bf76e2bd33dbe21228a3613df5c21383dfe961629672135c86c9508","9223a0889abb0669020e94a9b8c1e68274cdc05533c1f79d84fe516450e94ebd","bad1557ea1c4bef92503dc5baae16b5d89c735e87b69b4d12bf0a41c21173d0b","230f5a3d9e6ef0071681803eeb11f35b6016a42c4d50dcc0cb9a9d5279c99e1e","e86b02ffed7c2dbbf67d82d6bbfa83cdc18a2746e98c3540d92f5bfc90ac25a5","00dcde4375e5b792e70ba920be34ac62e78640280e292d8d95db60dda08ba210","4e8c4227487aaf0e826527bae930aad6ea7ba650995ae14efc20f723a86d8cf3","77f399ceb0860edad92b7fe3a27da180db8e333153147fbabe17d85659a155c8","7c75579a5743f12b9cd0567d3706cbf3caff07b0426e80faa28b01213241a702","d7085be4f4bd1651eac62526a80b3ffc9b598145cccb125637145dd59cb8cb23","f6592188e9384b28a59c5cc537b18ad3c1e52a5fa551e477e299f4f6cb3370cb","89c774c5fdb8d376d159dc6916a4f5e4252741a3e91bda93874ce6594cc97d8a","431637c9e71c9135bfb308fbdaae2531e079b45c0576a36f2a48431e1f8c4fda","19b83f8d88842e3cd40828298af66ec2234f020370903051871c294a9730345d","19ff6e335cf5a64247219c3b159f634ee882823897844d348f02572bddca48f1","486a58b1672b0d4ad0a684196e5045ea44e5bde2fdb60f189e57984af723f63a","4e68ae4eb25ea2c78b62781d67356cc1b6dfab63b3f7efa67f4f62923af544a9","54897b13d1570624790219364b99bbaa3963083ef8fb71130d410d5d8ce73fe6","960e8beb129a51acf58f4706c352295e7dfe3e0ccba7ddb103014ad8cb2489ca","a35a4ff067da3cda5bf7f10467eef46890289c9f4de2e64afad1d4a9996b74bd","456b8665dc3125499d746dcb82b11671a4a1cf47bfc5f445ebf9abfecb546b3d","106f732b75848f9ec8cfac4ca6806047a2c9562c9eaf0bc71cc774ee529f7b16","2452956059d0dc8c803ca221b4f784d9050ae701373e10b751cb770662bbf8e3","e7e908594f2ec61cf51fee46bd1d4351e243c2820e5915136b25ad4ea003cc05","2faadfc8a7ecc122251ace97e24cf8954e8ce86262141e5eb2b8333a7e28baa1","3465ac96b56d7bc4d1a42c309290449bd3c40910cdc9f4c474254500069e3ae0","7ac802ca103490ebdb5158cd315cfa23201f128fd10be05fbf21518d2409314e","c56c46e17968e3923147273fcdeae7c9a1744de009835ff5beaacdf3e8d3ef2f","6153dbccee6a6631a14561a08533cf33e6e028558987fe5695bfd2801972b996","b39a409aa493b013ae57526183b69e8308816ca52c4412be7afe8900696ba2e8","fe9340ac4042e65e794107bbce26bc92c8fab2ebf49ea11a9f004929144dd1b0","71c9f28e445735e9c814eb4a6dbd5229a2da89079875c87d46b31ab1df54f247","397f3873fd5d2d78bd8710b02d17246861406b8ad51f8e141bb74bdf8e252452","eedcb4af27e3030816c7cfe1d67de01a66fc781f5779b89be8f7eee8f9f09984","9fb7ca1ee1740a0e293ae2658c15a8e692424d7c9beb51732fa6e1d8c12fb0a8","8e7fb537c0430c4a3d754b86fd090abc810569ff35f60168d08660b1ad5ea678","182f86e4530584050ce2c75c65dd78f29f2d5c4c3b25cd2a9be92747f56618ec","bc12bc40fac2e1604ce6e4ef076255817d38c7caafba290411a3f3004666ab27","5c50bd7509e01fe8bd194d6536553c0b363e1875da2e970865c9fb49a0e7ca02",{"version":"08301e5eb2792342ff23c70e90a8ea95b501a5a88b0190f79db1aaa987d27d4f","affectsGlobalScope":true},{"version":"a7ca8df4f2931bef2aa4118078584d84a0b16539598eaadf7dce9104dfaa381c","impliedFormat":1},{"version":"10073cdcf56982064c5337787cc59b79586131e1b28c106ede5bff362f912b70","impliedFormat":99},{"version":"72950913f4900b680f44d8cab6dd1ea0311698fc1eefb014eb9cdfc37ac4a734","impliedFormat":1},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"ee70b8037ecdf0de6c04f35277f253663a536d7e38f1539d270e4e916d225a3f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a660aa95476042d3fdcc1343cf6bb8fdf24772d31712b1db321c5a4dcc325434","impliedFormat":1},{"version":"36977c14a7f7bfc8c0426ae4343875689949fb699f3f84ecbe5b300ebf9a2c55","impliedFormat":1},{"version":"ff0a83c9a0489a627e264ffcb63f2264b935b20a502afa3a018848139e3d8575","impliedFormat":99},{"version":"161c8e0690c46021506e32fda85956d785b70f309ae97011fd27374c065cac9b","affectsGlobalScope":true,"impliedFormat":1},{"version":"f582b0fcbf1eea9b318ab92fb89ea9ab2ebb84f9b60af89328a91155e1afce72","impliedFormat":1},{"version":"183f480885db5caa5a8acb833c2be04f98056bdcc5fb29e969ff86e07efe57ab","impliedFormat":99},{"version":"960bd764c62ac43edc24eaa2af958a4b4f1fa5d27df5237e176d0143b36a39c6","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ec16d7a4e366c06a4573d299e15fe6207fc080f41beac5da06f4af33ea9761e","impliedFormat":1},{"version":"59f8dc89b9e724a6a667f52cdf4b90b6816ae6c9842ce176d38fcc973669009e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e4af494f7a14b226bbe732e9c130d8811f8c7025911d7c58dd97121a85519715","impliedFormat":1},{"version":"47416e41b1af81e53e8c3cc5bf909d47ff632a7b6eddfe7ff43d187b4dcca047","impliedFormat":99},{"version":"556ccd493ec36c7d7cb130d51be66e147b91cc1415be383d71da0f1e49f742a9","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"95aba78013d782537cc5e23868e736bec5d377b918990e28ed56110e3ae8b958","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"13b77ab19ef7aadd86a1e54f2f08ea23a6d74e102909e3c00d31f231ed040f62","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"ef94438f848be3a3b0033013bf64753f771f983c1e205e4a06675eb253ca7cd2","impliedFormat":99},"d64aceb1c47c82a9b081cd8810e98e7cd8178e373b48d6702143c7c5a6168900",{"version":"faf770b3935c2ba6558b2bb65af5d5de58945d81f496dc1a5938c41a1abb358b","impliedFormat":99},"53834df0626e60fb9df0db5626cbc94ecc126fd46473af8b8cc6182b0b726304",{"version":"7e29f41b158de217f94cb9676bf9cbd0cd9b5a46e1985141ed36e075c52bf6ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"f123246a7b6c04d80b9b57fadfc6c90959ec6d5c0d4c8e620e06e2811ae3a052","impliedFormat":1},"366ce70e6469069d38bcfca845e7acd64fbe28ae097286b2fdc0f1fdae5889e5","8fb0ae4ca6272d050c2586a7e5d639a0fb0f4c1c66773519b3fa1c99cb4c676a","139dc0400a034af4d102fc3188b8c301dbdc5f5c04e98e8a3d9504489e7a7158",{"version":"07fcc9be98e12bd2f0f71a501a9bfbe2e53d38c50e8a5e84223fdd05bd8749c5","impliedFormat":99},{"version":"b887a4575db46263f82d7bde681bdc14526e4a2618a1172fef4206c467752d8f","impliedFormat":99},"fa9494b7fd68125f5730eeb7603e1c2d2c13626f89e9814e2385d52025700938",{"version":"04d40d4f0693281382246f83a9050fed057d0d9fb00ae772dad2e4d26041ec11","signature":"0823fa2cd36b8cee4e2f3bcf3756cf1b52d81a9a84dad3830adf0ad6832a6cd8"},"259d14a88d8db209b647f5ee27f0f319d63eade6d7e6f4d38a2c7a33c41723ae","c3658fc9061591440a074678415e2b5dbcccdb3ef3451aff153d187b38c53fe2","22591ee212409529d0f6aa28d2b947bf2736760b6d7ea410bcfa5c948daada1b",{"version":"b7ca2f47522d4ea41e65ff92c4c6dd9c4c8260da7c456a7631a9c88dc056b4d0","impliedFormat":1},{"version":"4f01e4d0959f9125b89e5737eb1ca2bfa69fd6b7d6126eba22feb8b505b00cde","impliedFormat":1},{"version":"4363a1adb9c77f2ed1ca383a41fbab1afadd35d485c018b2f84e834edde6a2c7","impliedFormat":1},{"version":"1d6458533adb99938d041a93e73c51d6c00e65f84724e9585e3cc8940b25523f","impliedFormat":1},{"version":"b0878fbd194bdc4d49fc9c42bfeeb25650842fe1412c88e283dc80854b019768","impliedFormat":1},{"version":"a892ea0b88d9d19281e99d61baba3155200acced679b8af290f86f695b589b16","impliedFormat":1},{"version":"03b42e83b3bcdf5973d28641d72b81979e3ce200318e4b46feb8347a1828cd5d","impliedFormat":1},{"version":"8a3d57426cd8fb0d59f6ca86f62e05dde8bfd769de3ba45a1a4b2265d84bac5a","impliedFormat":1},{"version":"afc6e1f323b476fdf274e61dab70f26550a1be2353e061ab34e6eed180d349b6","impliedFormat":1},{"version":"7c14483430d839976481fe42e26207f5092f797e1a4190823086f02cd09c113c","impliedFormat":1},{"version":"828a3bea78921789cbd015e968b5b09b671f19b1c14c4bbf3490b58fbf7d6841","impliedFormat":1},{"version":"69759c42e48938a714ee2f002fe5679a7ab56f0b5f29d571e4c31a5398d038fe","impliedFormat":1},{"version":"6e5e666fa6adeb60774b576084eeff65181a40443166f0a46ae9ba0829300fcb","impliedFormat":1},{"version":"1a4d43bdc0f2e240395fd204e597349411c1141dd08f5114c37d6268c3c9d577","impliedFormat":1},{"version":"874e58f8d945c7ac25599128a40ec9615aa67546e91ca12cbf12f97f6baf54ff","impliedFormat":1},{"version":"da2627da8d01662eb137ccd84af7ffa8c94cf2b2547d4970f17802324e54defc","impliedFormat":1},{"version":"07af06b740c01ed0473ebdd3f2911c8e4f5ebf4094291d31db7c1ab24ff559aa","impliedFormat":1},{"version":"ba1450574b1962fcf595fc53362b4d684c76603da5f45b44bc4c7eeed5de045b","impliedFormat":1},{"version":"b7903668ee9558d758c64c15d66a89ed328fee5ac629b2077415f0b6ca2f41bc","impliedFormat":1},{"version":"c7628425ee3076c4530b4074f7d48f012577a59f5ddade39cea236d6405c36ba","impliedFormat":1},{"version":"28c8aff998cc623ab0864a26e2eb1a31da8eb04e59f31fa80f02ec78eb225bcd","impliedFormat":1},{"version":"78d542989bdf7b6ba5410d5a884c0ab5ec54aa9ce46916d34267f885fcf65270","impliedFormat":1},{"version":"4d95060af2775a3a86db5ab47ca7a0ed146d1f6f13e71d96f7ac3b321718a832","impliedFormat":1},{"version":"6708cd298541a89c2abf66cceffc6c661f8ee31c013f98ddb58d2ec4407d0876","impliedFormat":1},{"version":"2e90928c29c445563409d89a834662c2ba6a660204fb3d4dc181914e77f8e29d","impliedFormat":1},{"version":"84be1b8b8011c2aab613901b83309d017d57f6e1c2450dfda11f7b107953286a","impliedFormat":1},{"version":"d7af890ef486b4734d206a66b215ebc09f6743b7fb2f3c79f2fb8716d1912d27","impliedFormat":1},{"version":"7e82c1d070c866eaf448ac7f820403d4e1b86112de582901178906317efc35ad","impliedFormat":1},{"version":"c5c4f547338457f4e8e2bec09f661af14ee6e157c7dc711ccca321ab476dbc6d","impliedFormat":1},{"version":"223e233cb645b44fa058320425293e68c5c00744920fc31f55f7df37b32f11ad","impliedFormat":1},{"version":"1394fe4da1ab8ab3ea2f2b0fcbfd7ccbb8f65f5581f98d10b037c91194141b03","impliedFormat":1},{"version":"086d9e59a579981bdf4f3bfa6e8e893570e5005f7219292bf7d90c153066cdfc","impliedFormat":1},{"version":"1ea59d0d71022de8ea1c98a3f88d452ad5701c7f85e74ddaa0b3b9a34ed0e81c","impliedFormat":1},{"version":"cd66a32437a555f7eb63490509a038d1122467f77fe7a114986186d156363215","impliedFormat":1},{"version":"f53d243499acfacc46e882bbf0bf1ae93ecea350e6c22066a062520b94055e47","impliedFormat":1},{"version":"cd66a32437a555f7eb63490509a038d1122467f77fe7a114986186d156363215","impliedFormat":1},{"version":"65522e30a02d2720811b11b658c976bff99b553436d99bafd80944acba5b33b4","impliedFormat":1},{"version":"76b3244ec0b2f5b09b4ebf0c7419260813820f128d2b592b07ea59622038e45c","impliedFormat":1},{"version":"66eb7e876b49beff61e33f746f87b6e586382b49f3de21d54d41313aadb27ee6","impliedFormat":1},{"version":"69e8dc4b276b4d431f5517cd6507f209669691c9fb2f97933e7dbd5619fd07b7","impliedFormat":1},{"version":"361a647c06cec2e7437fa5d7cdf07a0dcce3247d93fbf3b6de1dc75139ff5700","impliedFormat":1},{"version":"fe5726291be816d0c89213057cd0c411bb9e39e315ed7e1987adc873f0e26856","impliedFormat":1},{"version":"1b76990de23762eb038e8d80b3f9c810974a7ed2335caa97262c5b752760f11a","impliedFormat":1},{"version":"5e050e05fe99cd06f2d4ad70e73aa4a72961d0df99525e9cad4a78fa588f387b","impliedFormat":1},{"version":"4ff327e8b16da9d54347b548f85675e35a1dc1076f2c22b2858e276771010dd2","impliedFormat":1},{"version":"f767787945b5c51c0c488f50b3b3aeb2804dfd2ddafcb61125d8d8857c339f5a","impliedFormat":1},{"version":"14ab21a9aeff5710d1d1262459a6d49fb42bed835aa0f4cfc36b75aa36faddcd","impliedFormat":1},{"version":"ba3c4682491b477c63716864a035b2cfdd727e64ec3a61f2ca0c9af3c0116cfd","affectsGlobalScope":true,"impliedFormat":1},{"version":"b222d32836d745e1e021bb10f6a0f4a562dd42206203060a8539a6b9f16523f0","impliedFormat":1},{"version":"7bb53546e9bd6e3f22804497a41d4b885674e7b15b7d64c7d3f83722dfd2b456","impliedFormat":1},{"version":"4083e6d84bfe72b0835b600185c7b7ce321da3d6053f866859185eefc161e7a0","impliedFormat":1},{"version":"b883e245dc30c73b655ffe175712cac82981fc999d6284685f0ed7c1dac8aa6f","impliedFormat":1},{"version":"626e3504b81883fa94578c2a97eff345fadc5eae17a57c39f585655eef5b8272","impliedFormat":1},{"version":"e9a15eeba29ceb0ee109dd5e0282d2877d8165d87251f2ea9741a82685a25c61","impliedFormat":1},{"version":"c6cb06cc021d9149301f3c51762a387f9d7571feed74273b157d934c56857fac","impliedFormat":1},{"version":"cd7c133395a1c72e7c9e546f62292f839819f50a8aa46050f8588b63ef56df88","impliedFormat":1},{"version":"196f5f74208ce4accea017450ed2abc9ce4ab13c29a9ea543db4c2d715a19183","impliedFormat":1},{"version":"4687c961ab2e3107379f139d22932253afb7dd52e75a18890e70d4a376cdf5d9","impliedFormat":1},{"version":"ae8cfe2e3bdef3705fc294d07869a0ab8a52d9b623d1cc0482b6fc2be262b015","impliedFormat":1},{"version":"94c8e9c00244bbf1c868ca526b12b4db1fab144e3f5e18af3591b5b471854157","impliedFormat":1},{"version":"827d576995f67a6205c0f048ae32f6a1cf7bda9a7a76917ab286ef11d7987fd7","impliedFormat":1},{"version":"cb5dc83310a61d2bb351ddcdcaa6ec1cf60cc965d26ce6f156a28b4062e96ab2","impliedFormat":1},{"version":"0091cb2456a823e123fe76faa8b94dea81db421770d9a9c9ade1b111abe0fcd1","impliedFormat":1},{"version":"034d811fd7fb2262ad35b21df0ecab14fdd513e25dbf563572068e3f083957d9","impliedFormat":1},{"version":"298bcc906dd21d62b56731f9233795cd11d88e062329f5df7cdb4e499207cdd4","impliedFormat":1},{"version":"f7e64be58c24f2f0b7116bed8f8c17e6543ddcdc1f46861d5c54217b4a47d731","impliedFormat":1},{"version":"966394e0405e675ca1282edbfa5140df86cb6dc025e0f957985f059fe4b9d5d6","impliedFormat":1},{"version":"b0587deb3f251b7ad289240c54b7c41161bb6488807d1f713e0a14c540cbcaee","impliedFormat":1},{"version":"4254aab77d0092cab52b34c2e0ab235f24f82a5e557f11d5409ae02213386e29","impliedFormat":1},{"version":"19db45929fad543b26b12504ee4e3ff7d9a8bddc1fc3ed39723c2259e3a4590f","impliedFormat":1},{"version":"b21934bebe4cd01c02953ab8d17be4d33d69057afdb5469be3956e84a09a8d99","impliedFormat":1},{"version":"b2b734c414d440c92a17fd409fa8dac89f425031a6fc7843bac765c6c174d1ca","impliedFormat":1},{"version":"239f39e8ad95065f5188a7acd8dbefbbbf94d9e00c460ffdc331e24bc1f63a54","impliedFormat":1},{"version":"d44f78893cb79e00e16a028e3023a65c1f2968352378e8e323f8c8f88b8da495","impliedFormat":1},{"version":"32afc9daae92391cb4efeb0d2dac779dc0fb17c69be0eb171fd5ed7f7908eeb4","impliedFormat":1},{"version":"b835c6e093ad9cda87d376c248735f7e4081f64d304b7c54a688f1276875cbf0","impliedFormat":1},{"version":"a9eabe1d0b20e967a18758a77884fbd61b897d72a57ddd9bf7ea6ef1a3f4514b","impliedFormat":1},{"version":"64c5059e7d7a80fe99d7dad639f3ba765f8d5b42c5b265275d7cd68f8426be75","impliedFormat":1},{"version":"05dc1970dc02c54db14d23ff7a30af00efbd7735313aa8af45c4fd4f5c3d3a33","impliedFormat":1},{"version":"a0caf07fe750954ad4cf079c5cf036be2191a758c2700424085ffde6af60d185","impliedFormat":1},{"version":"1ea59d0d71022de8ea1c98a3f88d452ad5701c7f85e74ddaa0b3b9a34ed0e81c","impliedFormat":1},{"version":"eab89b3aa37e9e48b2679f4abe685d56ac371daa8fbe68526c6b0c914eb28474","impliedFormat":1},"8442b6dfeb10d42c5c3f8d37b538c1cd3157e71d3fd8a38925d2c1e0ca81c901","8e1911a500adad2f6342e07f40249d4d34d76e5908a76f40ff47609b8600b0f4","b4a8e8b7ea027c9bdae8d3b1e845d402298afbe9776b7935b5be3878ccbb28e6","831216f97f4d051727748ea80a004ee402c81eb76aa9b6ef2f6ac4d3ef2cc6af","ff1d98091c5b94107ff33fcb043adbdb5e8bd9abdaf45acadcb064ae01b06bae","0ecca2a0488f6b86ee0fd0576d6496ad1402b4dc9858ab3e5c027c55531ab127","151e6a3879dd45743fb5963795e88b3d27fa49d7ae75ce8f39193a4d7a961419","49288fdd5754d26128f4a416efb7963a18b7e7b1ce92d1f0777837882d81469c","36f487daa50d9c69d64a13bba4b7f0830577439df080f6a8f5e62ee06355e757","c3a290cab706d8a547e35062e06765ea67cd675534f542afad4b80a57ba7bd83","e2578f019d85077d74483fc30ad4c9f56b01e67fcb57ae02b30c2fea3304c9fb","87fd0e69ef4753edd78eb8bcc43ed6d2cc18000288e127120647ec4564f28367","85d9cda4561aab3753c6d327aca74b4464bad4e6d7e69bd04b9764cdee5508e7","1e45beeb9277ab9a3679ed8b6a9da9443e42c2d811be2a9ae1550af8e25127c7","92fbf4cd843509980208ff8818df2126751892dc7e0febeda68b5a8122db38ff","345a28719851e25dbf7c18ae3f529070651d634946f630556fc34f616982da3a","854d0ad6c73ae33c14d39be7c89e3152bf04044877e3f64a2732b7b78b091f2c","a431278aa0a162609a8c10975777d546783ad7e17495ed44922bf7cffd1eaefe","4af1ecd034a6fbebb359e548e148162f520b94ae355769e1a33254dd2cc112b7","2cd063026fde19ddea16d390a21568a11b34d5211092d33695ee3d2155274010","fa1c55f2308ff215c2ecb0b8078707dc13055b2c62a60672242ddd7ee67fdd17","f6f6ae9816ef3af386c4324e9c981e1272ec21d712627266914eae54c30c5927","abd848e8af5a23fc19e8d674bb8f1bc1d09d34724709d53efdf7fa23b3b06b89","7e4acf140e2b4297e2835fc0d90c01ea84034fb226da317e5b847f485468bd13","15c6a7c58ca0240809058e193bc544fc80f45350071ceeab4918ff9d01b2cf91","da1b1b30703476d44a1f25fd05d88eb3b3c8df8172156da025bd8fc0b00adb30","bb205f2c7d4aba390e66b016f4638cdad74f8dfb39141b855ae9bdb6d6a4e49f","fe2908def08412f57bb3f728f94ad4d72f34b9bbca9316493c1312474c1b26a2","94384ffb42985312d3b64108d9ef1e998619dbbc2a198463beae62f05c1080d6","52ad133859156f8ddce098ee7b4007e2011c556916d2913d8eb53c081d8f7d54","b2cd45bc58ed40b9a9dfc2bc666716fc1fa064c27f3807a00e23465ae27db137","21c67f5dd9e72b62f0c75d69a39bea212c00d26c68262a9e4d21a29d9927fa22","d9d2f8a4d684c4e78fa73334615d70b84830a677ef1cea44a6f6a85879e5605c","8772b1b5be68fb9c87d472f9d1617b640a45c512cb8a013856b3cabec0ec369c","ccdd63f3957c05d6d458924f630aada917a04d10b3cd77f9994e1efa20475661","8052ffe8aa37dbb40eb7db971600228194dc4b420ba275d9f2f959177d8d8f86","5955ae1c077a1d5d90538cf0ac8bcc8311425c4d1445f099d15f0f83881c55a1","85a2b8ab90b0e968a6eeaf8b8a31089f9678af6170f187cbcb673fe73d110925","2ebfc3ebd6419b61074107ebc673ff018424b152036c3dec1b76793368d6d5a1","1e610cb55a249c8fd26740e415117415f8ef80431be48b8962b092beee2a8758","3efff412b9ff3562e59a0bdfb35eec5cf2d7760d1fb41c507d0aa5798457e3a9","282847f5c545eab2c3226be7b170a227c2b156964db0bd8185b19ce1df4b04ad","be774bb06d26cf09be29ba953a0d9ed504608d19b25188328ad75a0f8381e246","89a83640863a3c12c199677fb9ec83f871fac09faa903e7b4816d7382a7d0301","ed0a66f6f2e664f5fd6b1c2e73915686ca09e7a113d90c7d7ed5611f87a6dba8","ca04e7f8719dd3b5319e8c1879e340a2362c8206601c054aa768f1a9ebd98eec","bfbf4892479a06ce0ddcb097dbc7ffa593dcf212e6437eee2223697479a074e2","5cb2286e66193c18f0943efb0dcecc72278cd3d92c6dd619dc3b73b73e2b9495",{"version":"bc03c3c352f689e38c0ddd50c39b1e65d59273991bfc8858a9e3c0ebb79c023b","impliedFormat":1},"6e9e5807fcbd48b75a96db5cbef36c996262196be42e6d4760dc86babbe61ad2",{"version":"d7dfba64b7350cb9501c544fe8ceba1b2455b42029d22b1a4fd02e94a6783525","impliedFormat":1},"02bc9bc13b4c395d062d73fb86492496718da5a9dfc8e625c2bec7be97a01b47","cb18292a8e8959fbe389ec57482c8298e364b834be70337d405c829f66c9caac",{"version":"bb1defa1a08700b1e4bca6d31d71ab137470871700b4b72dfd1506c6a9af03ca","impliedFormat":99},{"version":"04facf0c6ec863ff0ff5780c908313666389fb7d90673681e7571bd3890eab47","impliedFormat":99},{"version":"d95afe4f740ab14975ebbb03a9961d2c6165b898263faa10e4160e1026378248","affectsGlobalScope":true,"impliedFormat":99},{"version":"38ee113ab61ab569ef0f19156c5bc151bcacbee452f8bb55d77a1ad70db2f1e7","impliedFormat":99},{"version":"57a431c07c4943800b0163adcf73a9e12523700c6694cbc97e99973bdcdc3b7a","impliedFormat":99},{"version":"79c164aa4f8a8418df7717206ea52508f72743224a6b9c705f10724c6dbb5548","impliedFormat":1},{"version":"8d88e177e7eed625a46b41abf05ab5a83e6486e599bf8013652d2e0874d8c133","impliedFormat":99},{"version":"9f49b8064f63b7b3275a8247692967da2458734ea9afcf5ffd86b5c177674740","impliedFormat":99},"878bd238438c437ff3cf92389885be0c61354a07f0f542492b8af802801c365b","40c19ce775bd49067f475206604622eac589410e072fe1449d54d6d397bf3fa1","b75965a0c856831b1903e1fc2757d1ac4b729b508a81256b7bed5cf292266dcf","c0df11c64d535764c48828ce6011ec4d7f6d9e8ffaad97564d4ddf65abaf9318","c3fc95f62a8e866907ca0bcb3a03acb1caa9085d7edb47d3f8fc6070ca8996e4","1e6f4121b741fb47cc48ade101c8a113c4ba4f1331d4c8deb99c64d20582ece3","1f9bc9964689abe6ef6fbe11c13640e3456864adbd9414479f8776ed3e2ce36f","e0a6d96c4389cb429dfade622bae4d1158b1b7460d7b567227df07e738a35445",{"version":"dd90c02f064b9023c27a74f981437912eaf13a0b3685206228f1597f60ea46b7","impliedFormat":1},{"version":"e4e957c7cb5a8a14f5b43ddcbf6a6a8c0877c2c933c8f8230cfa85cb7acef018","impliedFormat":1},{"version":"89eeeebbc612a079c6e7ebe0bde08e06fbc46cfeaebf6157ea3051ed55967b10","impliedFormat":1},{"version":"4c72f66622e266b542fb097f4d1fe88eb858b88b98414a13ef3dd901109e03a1","impliedFormat":1},{"version":"23a933d83f3a8d595b35f3827c5e68239fb4f6eb44e96389269d183fe7ff09ba","impliedFormat":1},{"version":"3de661ae6c0893d37188844935676bdb290216d3e32f22b9b8aa522dfbe68af6","impliedFormat":1},{"version":"beb9a139ce8d28b7796745cf5ed0ae920f0d1165b992c4d89264e0f596c80a99","impliedFormat":1},{"version":"f734b58ea162765ff4d4a36f671ee06da898921e985a2064510f4925ec1ed062","affectsGlobalScope":true,"impliedFormat":1},{"version":"55c0569d0b70dbc0bb9a811469a1e2a7b8e2bab2d70c013f2e40dfb2d2803d05","impliedFormat":1},{"version":"37f96daaddc2dd96712b2e86f3901f477ac01a5c2539b1bc07fd609d62039ee1","impliedFormat":1},{"version":"9c5c84c449a3d74e417343410ba9f1bd8bfeb32abd16945a1b3d0592ded31bc8","impliedFormat":1},{"version":"a7f09d2aaf994dbfd872eda4f2411d619217b04dbe0916202304e7a3d4b0f5f8","impliedFormat":1},{"version":"a66ebe9a1302d167b34d302dd6719a83697897f3104d255fe02ff65c47c5814e","impliedFormat":99},{"version":"bc01cd5014b23f8ab96e296c0cc134e039a777714fa75a68d6cbff1b4947b729","impliedFormat":1},{"version":"ce6603fcee6c000c0930d500060b7fca478dcef634196c6c27126d78ecd8fa1b","impliedFormat":1},{"version":"37acfa2160073f00dacc863f396a503bf491d893b628cb523c49ac09bc7d1a95","impliedFormat":1},{"version":"71da2b4e02affc733ef57f8894a0ecdd9a4747379c24db8056e0e0f7f63ae0b9","impliedFormat":1},{"version":"81c4a0e6de3d5674ec3a721e04b3eb3244180bda86a22c4185ecac0e3f051cd8","impliedFormat":1},{"version":"36c16eada3eaadcd3973cd12c8894eb5fdf838d2a98145d846e3ab5131dd14f5","impliedFormat":1},{"version":"7261cabedede09ebfd50e135af40be34f76fb9dbc617e129eaec21b00161ae86","impliedFormat":1},{"version":"ea554794a0d4136c5c6ea8f59ae894c3c0848b17848468a63ed5d3a307e148ae","impliedFormat":1},{"version":"2c378d9368abcd2eba8c29b294d40909845f68557bc0b38117e4f04fc56e5f9c","impliedFormat":1},{"version":"9b048390bcffe88c023a4cd742a720b41d4cd7df83bc9270e6f2339bf38de278","affectsGlobalScope":true,"impliedFormat":1},{"version":"c60b14c297cc569c648ddaea70bc1540903b7f4da416edd46687e88a543515a1","impliedFormat":1},{"version":"97a295a4a0f80ee3ffbd49f3635b58b367ad8c7d5ae4d88085b8c6f0d6caaa57","impliedFormat":1},{"version":"7f155795a4af97ded466e29e864a5365e033869acb38c39b2bef79a761e7cb63","impliedFormat":1},{"version":"fc80a762d006a43cbaf249ae10e6eab50c82552f040e2f6c49be5b5da8478a11","impliedFormat":1},{"version":"6ce50ada4bc9d2ad69927dce35cead36da337a618de0a2daaaeeafe38c692597","impliedFormat":1},{"version":"13b8d0a9b0493191f15d11a5452e7c523f811583a983852c1c8539ab2cfdae7c","impliedFormat":1},{"version":"4d42529fbadc9cfc3aa03e381b422fa5135edb175985d41799531711da96141b","impliedFormat":1},{"version":"df6251bd4b5fad52759bfe96e8ab8f2ce625d0b6739b825209b263729a9c321e","impliedFormat":1},{"version":"846068dbe466864be6e2cae9993a4e3ac492a5cb05a36d5ce36e98690fde41f4","impliedFormat":1},{"version":"94c8c60f751015c8f38923e0d1ae32dd4780b572660123fa087b0cf9884a68a8","impliedFormat":1},{"version":"eb1422dd19b22a12df6365f71adde9a24bc73dbf2f6d20e7b650216897f3258f","impliedFormat":1},{"version":"01ec6506f7c60c69dbb4486ef4174fb4fd721c84f12f531d1ef640fa7379fd94","impliedFormat":1},{"version":"e451e32b6e0d25ae9d5c9149d2cd4afba4aec07874b7282b27e7f1e27cb8286d","impliedFormat":1},{"version":"66cfc74e54331cabf88ed12b3317b13716d66865ee0187498d5b71b5d82c70a4","impliedFormat":1},{"version":"c5b47653a15ec7c0bde956e77e5ca103ddc180d40eb4b311e4a024ef7c668fb0","impliedFormat":1},{"version":"223709d7c096b4e2bb00390775e43481426c370ac8e270de7e4c36d355fc8bc9","impliedFormat":1},{"version":"0528a80462b04f2f2ad8bee604fe9db235db6a359d1208f370a236e23fc0b1e0","impliedFormat":1},{"version":"c8b003c0f6be91a5485bbfe99ab1b532c2c3e9ecb0290295013eeb5db0373fba","impliedFormat":1},{"version":"82ef7d775e89b200380d8a14dc6af6d985a45868478773d98850ea2449f1be56","impliedFormat":1},{"version":"953440f26228d2301293dbb5a71397b5508ba09f57c5dbcd33b16eca57076eb2","impliedFormat":1},{"version":"fb7e20b94d23d989fa7c7d20fccebef31c1ef2d3d9ca179cadba6516e4e918ad","impliedFormat":1},{"version":"8326f735a1f0d2b4ad20539cda4e0d2e7c5fc0b534e3c0d503d5ed20a5711009","impliedFormat":1},{"version":"8d720cd4ee809af1d81f4ce88f02168568d5fded574d89875afd8fe7afd9549e","impliedFormat":1},{"version":"df87c2628c5567fd71dc0b765c845b0cbfef61e7c2e56961ac527bfb615ea639","impliedFormat":1},{"version":"659a83f1dd901de4198c9c2aa70e4a46a9bd0c41ce8a42ee26f2dbff5e86b1f3","impliedFormat":1},{"version":"a66f3da7de689a5879af9501bbae12a28b42194e0a364afb7a6d395b3e3813c3","impliedFormat":1},{"version":"224f85b48786de61fb0b018fbea89620ebec6289179daa78ed33c0f83014fc75","impliedFormat":1},{"version":"05fbfcb5c5c247a8b8a1d97dd8557c78ead2fff524f0b6380b4ac9d3e35249fb","impliedFormat":1},{"version":"322f70408b4e1f550ecc411869707764d8b28da3608e4422587630b366daf9de","impliedFormat":1},{"version":"acb93abc527fa52eb2adc5602a7c3c0949861f8e4317a187bb5c3372f872eff4","impliedFormat":1},{"version":"c4ef9e9e0fcb14b52c97ce847fb26a446b7d668d9db98a7de915a22c46f44c37","impliedFormat":1},{"version":"0e447b14e81b5b3e5d83cbea58b734850f78fb883f810e46d3dedba1a5124658","impliedFormat":1},{"version":"bd2221581a2adfb320e2bb7b648e837005e90beacc0918139c3ba0523ec036b6","impliedFormat":1},{"version":"929939785efdef0b6781b7d3a7098238ea3af41be010f18d6627fd061b6c9edf","impliedFormat":1},{"version":"fca68ac3b92725dbf3dac3f9fbc80775b66d2a9c642e75595a4a11a2095b3c9a","impliedFormat":1},{"version":"245d13141d7f9ec6edd36b14844b247e0680950c1c3289774d431cbbd47e714e","impliedFormat":1},{"version":"4326dc453ff5bf36ad778e93b7021cdd9abcfc4efe75a5c04032324f404af558","impliedFormat":1},{"version":"27b47fbd2f2d0d3cd44b8c7231c800f8528949cc56f421093e2b829d6976f173","impliedFormat":1},{"version":"2733026486e03cb5ea5809e1c3ea5bf263d7a94733ef732643684296aecb072a","impliedFormat":1},{"version":"fc745bebefc96e2a518a2d559af6850626cada22a75f794fd40a17aae11e2d54","impliedFormat":1},{"version":"2b0fe9ba00d0d593fb475d4204214a0f604ad8a56f22a5f05c378b52205ef36b","impliedFormat":1},{"version":"3d94a259051acf8acd2108cee57ad58fee7f7b278de76a7a5746f0656eecbff6","impliedFormat":1},{"version":"bb4c1bfe357af1c473ec97d5366fe7204ad2d85534943316ba3a4e8f5a2f2d7e","impliedFormat":1},{"version":"14df3316ed8d60048de388cede480067482534e8dcb7a068331cb4bf02c18595","impliedFormat":1},{"version":"3f3526aea8d29f0c53f8fb99201c770c87c357b5e87349aca8494bfd0c145c26","impliedFormat":1},{"version":"6ee92d844e5a1c0eb562d110676a3a17f00d2cd2ea2aaaff0a98d7881b9a4041","impliedFormat":1},{"version":"d65d0a4617a365090b075ef495e3d3bb2d3cbd2e6f8f6f9aec9416f3bab91ef2","impliedFormat":1},{"version":"6052522a593f094cfee0e99c76312a229cf2d49ac2e75095af83813ec9f4b109","impliedFormat":1},{"version":"a0ceb6ce93981581494bae078b971b17e36b67502a36a056966940377517091d","impliedFormat":1},{"version":"a63ce903dd08c662702e33700a3d28ca66ed21ac0591e1dbf4a0b309ae80e690","impliedFormat":1},{"version":"2b63d2725550866e0f2b56b2394ce001ebf1145cb4b04dc9daa29d73867b878c","impliedFormat":1},{"version":"a937735c59855758c103378610b46bd56b3bd6e12037260c4b6ad6d73f519baa","impliedFormat":1},{"version":"6e2d2b63c278fd1c8dd54da2328622c964f50afa62978ed1a73ccd85e99a4fc7","impliedFormat":1},{"version":"d90f5bd18a862fdbd39b1db0eb9d92722e2922b1ff29c6f06cd198ba812d84a0","impliedFormat":1},{"version":"b83ffe71adbac91c5596133251e5ec0c9e6664017ee5b776841effe93de8f466","impliedFormat":1},{"version":"61ecf051972c69e7c992bab9cf74c511ecba51b273c4e1590574d97a542bd4ea","impliedFormat":1},{"version":"068f5afbae92a20a5fcd9cfce76f7b90de2c59a952396b5da225b61f95a1d60a","impliedFormat":1},{"version":"d6a104e56ead828ad1583f56348ccc6993bc73e89fe974474c7fa249407197cd","impliedFormat":1},{"version":"4e024e2530feda4719448af6bdd0c0c7cfa28d1a4887900f4886bec70cd48fea","impliedFormat":1},{"version":"99c88ea4f93e883d10c04961dbf37c403c4f3c8444948b86effec0bf52176d0e","impliedFormat":1},{"version":"e88f3729fcc3d38d2a1b3cdcbd773d13d72ea3bdf4d0c0c784818e3bfbe7998d","impliedFormat":1},{"version":"f25b1264b694a647593b0a9a044a267098aaf249d646981a7f0503b8bb185352","impliedFormat":1},{"version":"964d0862660f8e46675c83793f42ab2af336f3d6106dee966a4053d5dc433063","impliedFormat":1},{"version":"292ad4203c181f33beb9eb8fe7c6aaae29f62163793278a7ffc2fcc0d0dbed19","impliedFormat":1},{"version":"4e04e6263670ad377f2f6bcd477def099ac3634d760ee8a7cca74a6f39d70a48","impliedFormat":1},{"version":"39610d544bf13ae42304250e075918fea69b5e9ac0ad694948008ea44abcdead","impliedFormat":1},{"version":"f437151a618f7f89587479bcf5d64799276b0b5f578bf629b1b994ee723c6b5e","impliedFormat":1},{"version":"0cc800e9f15f736729b9b4e77cc6b7f9ea48010db7624f93ca773a48c712eb44","impliedFormat":1},{"version":"e567fdeb99631ab6483d5a4fe829c93c68adeb2cbfebc86a87f98e077d5c0268","impliedFormat":1},{"version":"5481417b1f4d6bf5ee34abc2de84cfe3770b877e987e3fa7a773fd1b0a4e11f4","impliedFormat":1},{"version":"e1b846ae9f58738fd93b58871f177fef92db61800a281c8a3410b7d0d84cb0c3","impliedFormat":1},{"version":"ee0ce25cc8881cbbba0cd58012eb398b54a790cc29dbdcf53e0473b7c49cba69","impliedFormat":1},{"version":"aaf76607f93af53b24eb112bfb152d8de7e6c756144e58eef864df6501e7545a","impliedFormat":1},{"version":"419b14db41edddf6618ebb84fd95ed083a29f19f774ef7de8e0d6e32b48407f8","impliedFormat":1},{"version":"4edfc4848068bf58016856dfeb27341c15679884575e1a501e2389a1fea5c579","impliedFormat":1},{"version":"0c3d7a094ef401b3c36c8e3d88382a7e7a8b1e4f702769eba861d03db559876b","impliedFormat":1},{"version":"050b1cd5315269fce82a01a8987bd7db84fb8f94881709a1f700f4f97224f642","impliedFormat":1},{"version":"7e3a4800683a39375bc99f0d53b21328b0a0377ab7cbb732c564ca7ca04d9b37","impliedFormat":1},{"version":"910738f73810877fe9024e9a0a5444d5bdca683461fe4d6a20c208adf2f94d00","impliedFormat":1},{"version":"4976dbbdf489ba70dc16e49d259efaac8e20f419b91656f8f4fe94886505303d","impliedFormat":1},{"version":"829a98c450dadb13125faaaa93c0b5e7e1c5c4f7c066bb4c00b69eb9db36536c","impliedFormat":1},{"version":"5bb16745b183f1dc755d5b77d9fb9b01f8d40b3835872cc733b84e2eccbedb21","impliedFormat":1},{"version":"a01db1c770264e60119d70720b38e9a44fb25312f9fc70642e96147e17becc28","impliedFormat":1},{"version":"5c2a40582c6a1168ac26165dea811be68935d1b3066253cdcae8350192bc7aab","impliedFormat":1},{"version":"06612a809e386e1adb0f35e8729eda408e371551c38969b44f1cecde9cd17df7","impliedFormat":1},{"version":"40d4724906e7ec0d9d608d5d81674f613afc5d12aa0f87a879fa2c512d7627f8","impliedFormat":1},{"version":"8378f204551aa7932df9ec1586b8f719873fdaa7de89de66f6a157a1aa5c147e","impliedFormat":1},{"version":"6291216b4d40642809c77703a00c5bb44d22ad9542f8960cd84228eeaa6df549","impliedFormat":1},{"version":"1246e5867cb2df7eede23eb1bf490e4262e97fc6eab5234223d92817db4229d7","impliedFormat":1},{"version":"c9280a410eb43a85010a5173640b03bbe51b734ecdb2e41b2852f3b048d84143","impliedFormat":1},{"version":"9daed3c8782cce6973646a43b22e072d4095195fd3f207b547772907d2f50d1d","impliedFormat":1},{"version":"143c6771fe7d73f3b1d23b92d598778320da0f57f971146d4e40c794b9c3708a","impliedFormat":1},{"version":"892b19153694b7a3c9a69bcedb54e1c8ad3b9fa370076db4d3522838afd2cd60","impliedFormat":1},{"version":"7fc4be1e2f21d64bb9d0d9f54a1fee943997a3d52c4628f5c5df431e7e4512dd","impliedFormat":1},{"version":"7f58eed7b82d0447cda84a1c9eccde2619da21a0f6ce26165db08afe11270f43","impliedFormat":1},{"version":"af31f37264ea5d5349eec50786ceca75c572ed3be91bdd7cb428fdd8cd14b17c","impliedFormat":1},{"version":"85e4673ec8507aef18afd4a9acfae0294bdfaac29458ede0b8b56f5a63738486","impliedFormat":1},{"version":"40683566071340b03c74d0a4ffa84d49fedb181a691ce04c97e11b231a7deee4","impliedFormat":1},{"version":"02631c985f434279165a322afdf222a825ab8293ab5085b694593cb92c6f273d","impliedFormat":1},{"version":"e885933b92f26fa3204403999eddc61651cd3109faf8bffa4f6b6e558b0ab2fa","impliedFormat":1},{"version":"ed3d34d1a1c751550a5e7de98e5274148b444b5e012fd2863e534a8bd19db229","impliedFormat":1},{"version":"f158721f7427976b5510660c8e53389d5033c915496c028558c66caaf3d1db1c","impliedFormat":1},{"version":"7baac8ea31358e13bf05b439b9e8fe60091e965cc9d38719e817f0e67d29f3ce","impliedFormat":1},"1c2712916b9328905082a1536fa68dc497b806ab7adeeb9731c77985690ee8ac",{"version":"91b4ce96f6ad631a0a6920eb0ab928159ff01a439ae0e266ecdc9ea83126a195","impliedFormat":1},{"version":"88efe27bebddb62da9655a9f093e0c27719647e96747f16650489dc9671075d6","impliedFormat":1},{"version":"e348f128032c4807ad9359a1fff29fcbc5f551c81be807bfa86db5a45649b7ba","impliedFormat":1},{"version":"8ee6b07974528da39b7835556e12dd3198c0a13e4a9de321217cd2044f3de22e","impliedFormat":1},{"version":"deefd8c43b40f9797c3921d78d3f9243959621a17b817be7f5d95c149f23a9dd","impliedFormat":1},{"version":"5f12132800d430adbe59b49c2c0354d85a71ada7d756e34250a655baa8ad4ae5","impliedFormat":1},{"version":"1996d1cd7d585a8359a35878f67abdd73cc35b1f675c9c6b147b202fdd8dfc3f","impliedFormat":1},{"version":"b16e757e4c35434065120a2b3bf13a518fc9e621dc9c2ed668f91635a9dc4e75","impliedFormat":1},{"version":"7c18088ccbca1cfe297c22f4cf598a3a36e798efe63f572e39442e9b6af7ccf9","impliedFormat":1},{"version":"d02ced7accb512e6198b796b8d284e7979abde0f089b0a77969747a5f27bfb23","impliedFormat":1},{"version":"4374cefdde5c6e9bad52b0436e887b8325b8f407c12035194ad02c28f1553a3a","impliedFormat":1},{"version":"9b70cad270593f676aecfe4d1611dc766464f0b8138527b0ebbf1ff773578d69","impliedFormat":1},{"version":"b4f85bfb7e831703ac81737361842f1ae4d924b42c5d1af2bff93cca521de4d1","impliedFormat":1},{"version":"ee933420aacba1f60aa70fb8ba47c5e69001b005073b71973114587089a13c7f","impliedFormat":1},{"version":"0a0714999d0a5bdfacd15c7b34cffbcc6f263f6cb0ccb42076cdc541c6987797","impliedFormat":1},{"version":"56584bfc655f9df64afc0f22f7d1122c29e5b74b342c203b891e19de9fa37de8","impliedFormat":1},{"version":"40ec58f0fadd0b3981b3d383e1c12fa0680115ae9f018387fc2cfc0bbcf23204","impliedFormat":1},{"version":"849b9e7283b7309a4556c9b90bb8e2dfc27751f157798065bbc513dcddb09a8c","impliedFormat":1},{"version":"76bba0c97594248c1be19af32d5799f7eff51cec2926d8e4dd59267d7636a0b4","impliedFormat":1},{"version":"10e109212c7be8a9f66e988e5d6c2a8900c9d14bf6beadf5fa70d32ada3425cf","impliedFormat":1},{"version":"2b821aeb31e690092f8eae671dd961a9d0fd598ff4883ce0a600c90e9e8fa716","impliedFormat":1},{"version":"26602933b613e4df3868a6c82e14fffa2393a08531cb333ed27b151923462981","impliedFormat":1},{"version":"f57a588d8f6b3ce5c8b494f2dc759a8885eaee18e80a4952df47de45403fedbe","impliedFormat":1},{"version":"34735727b3fe7a0ed0651a0f88d06449163d1989a2b2de7f047473adc7c1c383","impliedFormat":1},{"version":"a5b13abc88ab3186e713c445e59e2f6eee20c6167943517bc2f56985d89b8c55","impliedFormat":1},{"version":"c8a206a6ba4e32710ebb4a389187772423de0f4f6180b95a7ef1a5a1934c1be6","impliedFormat":1},{"version":"7ae65fe95b18205e241e6695cb2c61c0828d660aca7d08f68781b439a800e6b8","impliedFormat":1},{"version":"c2c8c166199d3a7bd093152437d1f6399d05e458a9ca9364456feecba920cda4","impliedFormat":1},{"version":"369b7270eeeb37982203b2cb18c7302947b89bf5818c1d3d2e95a0418f02b74e","impliedFormat":1},{"version":"94f95d223e2783b0aef4d15d7f6990a6a550fe17d099c501395f690337f7105e","impliedFormat":1},{"version":"039bd8d1e0d151570b66e75ee152877fb0e2f42eca43718632ac195e6884be34","impliedFormat":1},{"version":"d565d66b38d54de037c9d46dede1f12630010d9b45fd9c6b432c7a40b2e30502","impliedFormat":1},{"version":"d7386a1ebe9a3eae227a5561c898c10cacb61a49f941c5a18cdf593f979c693c","impliedFormat":1},{"version":"d3cfde44f8089768ebb08098c96d01ca260b88bccf238d55eee93f1c620ff5a5","impliedFormat":1},{"version":"293eadad9dead44c6fd1db6de552663c33f215c55a1bfa2802a1bceed88ff0ec","impliedFormat":1},{"version":"36eb5babc665b890786550d4a8cb20ef7105673a6d5551fbdd7012877bb26942","impliedFormat":1},{"version":"fec412ded391a7239ef58f455278154b62939370309c1fed322293d98c8796a6","impliedFormat":1},{"version":"e3498cf5e428e6c6b9e97bd88736f26d6cf147dedbfa5a8ad3ed8e05e059af8a","impliedFormat":1},{"version":"dba3f34531fd9b1b6e072928b6f885aa4d28dd6789cbd0e93563d43f4b62da53","impliedFormat":1},{"version":"f672c876c1a04a223cf2023b3d91e8a52bb1544c576b81bf64a8fec82be9969c","impliedFormat":1},{"version":"e4b03ddcf8563b1c0aee782a185286ed85a255ce8a30df8453aade2188bbc904","impliedFormat":1},{"version":"2329d90062487e1eaca87b5e06abcbbeeecf80a82f65f949fd332cfcf824b87b","impliedFormat":1},{"version":"25b3f581e12ede11e5739f57a86e8668fbc0124f6649506def306cad2c59d262","impliedFormat":1},{"version":"93c3e73824ad57f98fd23b39335dbdae2db0bd98199b0dc0b9ccc60bf3c5134a","impliedFormat":1},{"version":"a9ebb67d6bbead6044b43714b50dcb77b8f7541ffe803046fdec1714c1eba206","impliedFormat":1},{"version":"833e92c058d033cde3f29a6c7603f517001d1ddd8020bc94d2067a3bc69b2a8e","impliedFormat":1},{"version":"c1a2e05eb6d7ca8d7e4a7f4c93ccf0c2857e842a64c98eaee4d85841ee9855e6","impliedFormat":1},{"version":"835fb2909ce458740fb4a49fc61709896c6864f5ce3db7f0a88f06c720d74d02","impliedFormat":1},{"version":"6e5857f38aa297a859cab4ec891408659218a5a2610cd317b6dcbef9979459cc","impliedFormat":1},{"version":"ead8e39c2e11891f286b06ae2aa71f208b1802661fcdb2425cffa4f494a68854","impliedFormat":1},{"version":"82919acbb38870fcf5786ec1292f0f5afe490f9b3060123e48675831bd947192","impliedFormat":1},{"version":"e222701788ec77bd57c28facbbd142eadf5c749a74d586bc2f317db7e33544b1","impliedFormat":1},{"version":"09154713fae0ed7befacdad783e5bd1970c06fc41a5f866f7f933b96312ce764","impliedFormat":1},{"version":"8d67b13da77316a8a2fabc21d340866ddf8a4b99e76a6c951cc45189142df652","impliedFormat":1},{"version":"a91c8d28d10fee7fe717ddf3743f287b68770c813c98f796b6e38d5d164bd459","impliedFormat":1},{"version":"68add36d9632bc096d7245d24d6b0b8ad5f125183016102a3dad4c9c2438ccb0","impliedFormat":1},{"version":"3a819c2928ee06bbcc84e2797fd3558ae2ebb7e0ed8d87f71732fb2e2acc87b4","impliedFormat":1},{"version":"f6f827cd43e92685f194002d6b52a9408309cda1cec46fb7ca8489a95cbd2fd4","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"a270a1a893d1aee5a3c1c8c276cd2778aa970a2741ee2ccf29cc3210d7da80f5","impliedFormat":1},{"version":"add0ce7b77ba5b308492fa68f77f24d1ed1d9148534bdf05ac17c30763fc1a79","impliedFormat":1},{"version":"8926594ee895917e90701d8cbb5fdf77fc238b266ac540f929c7253f8ad6233d","impliedFormat":1},{"version":"2f67911e4bf4e0717dc2ded248ce2d5e4398d945ee13889a6852c1233ea41508","impliedFormat":1},{"version":"d8430c275b0f59417ea8e173cfb888a4477b430ec35b595bf734f3ec7a7d729f","impliedFormat":1},{"version":"69364df1c776372d7df1fb46a6cb3a6bf7f55e700f533a104e3f9d70a32bec18","impliedFormat":1},{"version":"8e6427dd1a4321b0857499739c641b98657ea6dc7cc9a02c9b2c25a845c3c8e6","impliedFormat":1},{"version":"58da08d1fe876c79c47dcf88be37c5c3fab55d97b34c8c09a666599a2191208d","impliedFormat":1},{"version":"6042774c61ece4ba77b3bf375f15942eb054675b7957882a00c22c0e4fe5865c","impliedFormat":1},{"version":"5a3bd57ed7a9d9afef74c75f77fce79ba3c786401af9810cdf45907c4e93f30e","impliedFormat":1},{"version":"ed8763205f02fb65e84eff7432155258df7f93b7d938f01785cb447d043d53f3","impliedFormat":1},{"version":"30db853bb2e60170ba11e39ab48bacecb32d06d4def89eedf17e58ebab762a65","impliedFormat":1},{"version":"e27451b24234dfed45f6cf22112a04955183a99c42a2691fb4936d63cfe42761","impliedFormat":1},{"version":"2316301dd223d31962d917999acf8e543e0119c5d24ec984c9f22cb23247160c","impliedFormat":1},{"version":"58d65a2803c3b6629b0e18c8bf1bc883a686fcf0333230dd0151ab6e85b74307","impliedFormat":1},{"version":"e818471014c77c103330aee11f00a7a00b37b35500b53ea6f337aefacd6174c9","impliedFormat":1},{"version":"d4a5b1d2ff02c37643e18db302488cd64c342b00e2786e65caac4e12bda9219b","impliedFormat":1},{"version":"29f823cbe0166e10e7176a94afe609a24b9e5af3858628c541ff8ce1727023cd","impliedFormat":1},"6033ee7346b39430647c9a10b31f95056935f2f5d7470c5c2eee8fa014da17a8","18bc4acba92a411d2ff28e10e03055b0131ef2fd0c8e8157a29a99bc993cc598","ec2f17f97d378a3b1e3fba04c261ac012350bdf0297abd073c3e44698456d6ef","620d16afee04614503802be3fbb8fa2fe49ece06b4665eb114db318083e8906e",{"version":"b94aa998b119ba1df827c9da860df37b3aeb234f395a57506705cc38fa9c976a","signature":"1530e6d34c62c4e9fb13a22eca46acb043119a1c14e9d23ccb1b0fb8fe73982c"},{"version":"0b946cbab1399a3b942ccab47fd0da5a0802fb768c5bf57e2f264d6f5c57a4d9","signature":"60b2556ca34aa001421e33a050fa30625e4f811def411699276419cb0a6ac412"},"8f81f55cafbf8cdec3031620fe1f2d4e2212cd94e6ff3d75b72eeffe41d1ec7a","5ed95cd771a8bf896a3ca81e2f8032b0c859193c37102fe37a3db39858328b6a","50be1eebcd0408e7dc5231e1c2982f325e41cf3ceca845d563bf23cfc23017e9",{"version":"c3d577953f04c0188d8b9c63b2748b814efda6440336fa49557f0079f5cf748a","impliedFormat":1},{"version":"787fe950e18951b7970ec98cb05b3d0b11fcdfeb2091a7ea481ac9e52bf6c086","impliedFormat":1},{"version":"13ceda04874f09091da1994ba5f58bf1e9439af93336616257691863560b3f13","impliedFormat":1},"a4897e29bf2e2430935e07a656b2b1267657a53f6deb40c3537f8f178d7e07e5","697ca8066cdd0fa5be851fc5112cfeb1f12830227f70732a691ca4f6b11db75c","209625e4d6af6f0b04e0d7a507695052ee025c37d5ac831ed5566002c67958ad","1a5b34a5ff78ca7578e23e5be6dbb929e2d22791221e8f24390cf18562729b29",{"version":"a3d3f704c5339a36da3ca8c62b29072f87e86c783b8452d235992142ec71aa2d","impliedFormat":1},{"version":"d30e67059f5c545c5f8f0cc328a36d2e03b8c4a091b4301bc1d6afb2b1491a3a","impliedFormat":1},{"version":"96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538","impliedFormat":1},{"version":"a356d9a0ba90d10ec6c0fa33386c0b0e2843fd6f0a49513c44f7809926ac25ff","impliedFormat":1}],"root":[410,435,[440,480],504,506,[510,512],[515,519],[602,649],651,653,654,[663,670],797,[923,931],[935,938]],"options":{"allowJs":true,"esModuleInterop":true,"jsx":1,"module":99,"skipLibCheck":true,"strict":true},"referencedMap":[[440,1],[478,2],[447,3],[456,4],[445,5],[443,6],[444,1],[446,6],[448,7],[453,1],[452,1],[470,8],[471,9],[469,10],[467,1],[468,11],[476,12],[477,13],[475,7],[473,14],[474,15],[472,16],[457,6],[458,17],[460,18],[461,19],[459,20],[479,21],[442,7],[441,1],[462,1],[463,22],[465,23],[466,24],[464,25],[480,6],[449,1],[450,26],[454,27],[455,28],[451,29],[499,30],[497,6],[912,31],[911,32],[683,33],[682,6],[679,6],[502,34],[498,30],[500,35],[501,30],[692,6],[693,36],[484,6],[650,37],[507,6],[509,38],[503,39],[505,6],[660,6],[508,6],[791,6],[489,6],[723,6],[652,37],[491,40],[798,6],[814,41],[815,41],[816,41],[830,42],[817,43],[818,43],[819,44],[811,45],[809,46],[800,6],[804,47],[808,48],[806,49],[813,50],[801,51],[802,52],[803,53],[805,54],[807,55],[810,56],[812,57],[820,43],[821,43],[822,43],[823,41],[824,43],[825,43],[799,43],[826,6],[828,58],[827,43],[829,41],[662,59],[656,60],[657,61],[659,60],[661,62],[658,63],[655,37],[709,6],[707,64],[711,65],[771,66],[766,67],[676,68],[742,69],[737,70],[787,71],[732,72],[770,73],[767,74],[726,75],[736,76],[772,77],[773,77],[774,78],[674,79],[741,80],[782,81],[776,81],[784,81],[788,81],[775,81],[777,81],[780,81],[783,81],[779,82],[781,81],[785,83],[778,84],[686,85],[753,37],[750,86],[754,37],[697,81],[687,81],[746,87],[675,88],[696,89],[700,90],[752,81],[672,37],[751,91],[749,37],[748,81],[688,37],[795,92],[794,93],[796,94],[763,95],[762,96],[758,97],[760,98],[764,99],[765,100],[761,6],[759,6],[757,37],[695,101],[671,81],[756,81],[710,102],[755,37],[735,101],[786,81],[728,103],[684,104],[689,105],[738,106],[719,107],[722,103],[701,108],[721,109],[730,110],[731,111],[727,112],[729,113],[706,114],[745,115],[743,116],[744,117],[740,118],[720,119],[708,120],[713,121],[690,122],[717,123],[718,124],[714,125],[691,126],[702,127],[739,111],[685,128],[793,6],[712,129],[705,130],[733,6],[789,6],[724,6],[734,131],[768,6],[698,6],[725,6],[677,132],[704,133],[792,134],[703,135],[769,136],[715,6],[747,137],[699,6],[716,6],[790,6],[673,37],[681,138],[678,6],[680,6],[486,139],[485,140],[694,141],[482,142],[496,143],[488,144],[483,142],[481,6],[487,145],[494,6],[492,6],[493,6],[490,6],[495,146],[922,147],[833,148],[835,149],[842,150],[837,6],[838,6],[836,151],[839,152],[831,6],[832,6],[843,153],[834,154],[840,6],[841,155],[916,156],[920,157],[917,157],[913,156],[921,158],[918,159],[919,157],[914,160],[915,161],[907,162],[851,163],[853,164],[906,6],[852,165],[910,166],[909,167],[908,168],[844,6],[854,163],[855,6],[846,169],[850,170],[845,6],[847,171],[848,172],[849,6],[856,173],[857,173],[858,173],[859,173],[860,173],[861,173],[862,173],[863,173],[864,173],[865,173],[866,173],[867,173],[868,173],[870,173],[869,173],[871,173],[872,173],[873,173],[874,173],[905,174],[875,173],[876,173],[877,173],[878,173],[879,173],[880,173],[881,173],[882,173],[883,173],[884,173],[885,173],[886,173],[887,173],[889,173],[888,173],[890,173],[891,173],[892,173],[893,173],[894,173],[895,173],[896,173],[897,173],[898,173],[899,173],[900,173],[901,173],[904,173],[902,173],[903,173],[649,175],[506,176],[654,177],[664,178],[665,179],[666,6],[653,179],[667,180],[668,181],[663,181],[669,179],[670,182],[510,183],[511,37],[651,184],[797,185],[923,186],[924,187],[925,188],[926,189],[927,190],[928,187],[929,189],[512,6],[504,191],[410,192],[438,193],[437,194],[363,6],[439,195],[436,6],[939,6],[940,6],[941,6],[942,196],[142,197],[143,197],[144,198],[99,199],[145,200],[146,201],[147,202],[94,6],[97,203],[95,6],[96,6],[148,204],[149,205],[150,206],[151,207],[152,208],[153,209],[154,209],[155,210],[156,211],[157,212],[158,213],[100,6],[98,6],[159,214],[160,215],[161,216],[193,217],[162,218],[163,219],[164,220],[165,221],[166,222],[167,223],[168,224],[169,225],[170,226],[171,227],[172,227],[173,228],[174,6],[175,229],[177,230],[176,231],[178,232],[179,233],[180,234],[181,235],[182,236],[183,237],[184,238],[185,239],[186,240],[187,241],[188,242],[189,243],[190,244],[101,6],[102,6],[103,6],[141,245],[191,246],[192,247],[86,6],[198,248],[199,249],[197,250],[195,251],[196,252],[84,6],[87,253],[286,250],[514,254],[513,6],[85,6],[601,255],[570,256],[580,256],[571,256],[581,256],[572,256],[573,256],[588,256],[587,256],[589,256],[590,256],[582,256],[574,256],[583,256],[575,256],[584,256],[576,256],[578,256],[586,257],[579,256],[585,257],[591,257],[577,256],[592,256],[597,256],[598,256],[593,256],[569,6],[599,6],[595,256],[594,256],[596,256],[600,256],[520,258],[932,259],[560,260],[559,261],[566,262],[568,263],[564,264],[563,265],[567,261],[555,266],[561,267],[558,268],[562,269],[556,6],[557,270],[934,271],[933,272],[565,6],[93,273],[366,274],[370,275],[372,276],[219,277],[233,278],[337,279],[265,6],[340,280],[301,281],[310,282],[338,283],[220,284],[264,6],[266,285],[339,286],[240,287],[221,288],[245,287],[234,287],[204,287],[292,289],[293,290],[209,6],[289,291],[294,292],[381,293],[287,292],[382,294],[271,6],[290,295],[394,296],[393,297],[296,292],[392,6],[390,6],[391,298],[291,250],[278,299],[279,300],[288,301],[305,302],[306,303],[295,304],[273,305],[274,306],[385,307],[388,308],[252,309],[251,310],[250,311],[397,250],[249,312],[225,6],[400,6],[403,6],[402,250],[404,313],[200,6],[331,6],[232,314],[202,315],[354,6],[355,6],[357,6],[360,316],[356,6],[358,317],[359,317],[218,6],[231,6],[365,318],[373,319],[377,320],[214,321],[281,322],[280,6],[272,305],[300,323],[298,324],[297,6],[299,6],[304,325],[276,326],[213,327],[238,328],[328,329],[205,330],[212,331],[201,279],[342,332],[352,333],[341,6],[351,334],[239,6],[223,335],[319,336],[318,6],[325,337],[327,338],[320,339],[324,340],[326,337],[323,339],[322,337],[321,339],[261,341],[246,341],[313,342],[247,342],[207,343],[206,6],[317,344],[316,345],[315,346],[314,347],[208,348],[285,349],[302,350],[284,351],[309,352],[311,353],[308,351],[241,348],[194,6],[329,354],[267,355],[303,6],[350,356],[270,357],[345,358],[211,6],[346,359],[348,360],[349,361],[332,6],[344,330],[243,362],[330,363],[353,364],[215,6],[217,6],[222,365],[312,366],[210,367],[216,6],[269,368],[268,369],[224,370],[277,371],[275,372],[226,373],[228,374],[401,6],[227,375],[229,376],[368,6],[367,6],[369,6],[399,6],[230,377],[283,250],[92,6],[307,378],[253,6],[263,379],[242,6],[375,250],[384,380],[260,250],[379,292],[259,381],[362,382],[258,380],[203,6],[386,383],[256,250],[257,250],[248,6],[262,6],[255,384],[254,385],[244,386],[237,304],[347,6],[236,387],[235,6],[371,6],[282,250],[364,388],[83,6],[91,389],[88,250],[89,6],[90,6],[343,390],[336,391],[335,6],[334,392],[333,6],[374,393],[376,394],[378,395],[380,396],[383,397],[409,398],[387,398],[408,399],[389,400],[395,401],[396,402],[398,403],[405,404],[407,6],[406,405],[361,406],[553,266],[522,407],[532,407],[523,407],[533,407],[524,407],[525,407],[540,407],[539,407],[541,407],[542,407],[534,407],[526,407],[535,407],[527,407],[536,407],[528,407],[530,407],[538,408],[531,407],[537,408],[543,408],[529,407],[544,407],[549,407],[550,407],[545,407],[521,6],[551,6],[547,407],[546,407],[548,407],[552,407],[554,409],[427,410],[425,411],[426,412],[414,413],[415,411],[422,414],[413,415],[418,416],[428,6],[419,417],[424,418],[430,40],[429,419],[412,420],[420,421],[421,422],[416,423],[423,410],[417,424],[411,6],[433,425],[432,6],[431,6],[434,426],[81,6],[82,6],[13,6],[14,6],[16,6],[15,6],[2,6],[17,6],[18,6],[19,6],[20,6],[21,6],[22,6],[23,6],[24,6],[3,6],[25,6],[26,6],[4,6],[27,6],[31,6],[28,6],[29,6],[30,6],[32,6],[33,6],[34,6],[5,6],[35,6],[36,6],[37,6],[38,6],[6,6],[42,6],[39,6],[40,6],[41,6],[43,6],[7,6],[44,6],[49,6],[50,6],[45,6],[46,6],[47,6],[48,6],[8,6],[54,6],[51,6],[52,6],[53,6],[55,6],[9,6],[56,6],[57,6],[58,6],[60,6],[59,6],[61,6],[62,6],[10,6],[63,6],[64,6],[65,6],[11,6],[66,6],[67,6],[68,6],[69,6],[70,6],[1,6],[71,6],[72,6],[12,6],[76,6],[74,6],[79,6],[78,6],[73,6],[77,6],[75,6],[80,6],[119,427],[129,428],[118,427],[139,429],[110,430],[109,431],[138,405],[132,432],[137,433],[112,434],[126,435],[111,436],[135,437],[107,438],[106,405],[136,439],[108,440],[113,441],[114,6],[117,441],[104,6],[140,442],[130,443],[121,444],[122,445],[124,446],[120,447],[123,448],[133,405],[115,449],[116,450],[125,451],[105,452],[128,443],[127,441],[131,6],[134,453],[515,454],[936,455],[937,456],[935,457],[518,458],[517,458],[519,458],[603,459],[605,460],[606,461],[607,462],[608,460],[611,461],[610,461],[609,461],[613,458],[612,458],[614,461],[616,458],[617,458],[615,458],[619,461],[618,461],[621,458],[620,458],[623,458],[622,458],[625,458],[624,458],[627,461],[626,461],[629,462],[628,458],[631,460],[630,461],[930,463],[938,464],[931,6],[639,6],[644,465],[634,466],[638,250],[640,250],[635,467],[646,6],[645,467],[642,468],[636,250],[632,468],[641,250],[643,468],[633,469],[637,6],[647,470],[602,471],[604,472],[516,1],[648,6],[435,473]],"semanticDiagnosticsPerFile":[[440,[{"start":23,"length":4,"messageText":"Module '\"@prisma/client\"' has no exported member 'Role'.","category":1,"code":2305},{"start":29,"length":10,"messageText":"Module '\"@prisma/client\"' has no exported member 'NivelRisco'.","category":1,"code":2305},{"start":41,"length":15,"messageText":"Module '\"@prisma/client\"' has no exported member 'StatusAvaliacao'.","category":1,"code":2305},{"start":106,"length":8,"code":7016,"category":1,"messageText":{"messageText":"Could not find a declaration file for module 'bcrypt'. '/home/kernelpanic/projetos_jarvis/duorigin-v2/node_modules/bcrypt/bcrypt.js' implicitly has an 'any' type.","category":1,"code":7016,"next":[{"info":{"moduleReference":"bcrypt","mode":99}}]}},{"start":521,"length":8,"code":2353,"category":1,"messageText":"Object literal may only specify known properties, and 'password' does not exist in type '(Without & UserUncheckedCreateInput) | (Without<...> & UserCreateInput)'.","relatedInformation":[{"file":"./node_modules/.prisma/client/index.d.ts","start":81311,"length":6,"messageText":"The expected type comes from property 'create' which is declared here on type '{ select?: UserSelect | null | undefined; include?: UserInclude | null | undefined; where: UserWhereUniqueInput; create: (Without<...> & UserUncheckedCreateInput) | (Without<...> & UserCreateInput); update: (Without<...> & UserUncheckedUpdateInput) | (Without<...> & UserUpdateInput); }'","category":3,"code":6500}]},{"start":804,"length":8,"code":2353,"category":1,"messageText":"Object literal may only specify known properties, and 'password' does not exist in type '(Without & UserUncheckedCreateInput) | (Without<...> & UserCreateInput)'.","relatedInformation":[{"file":"./node_modules/.prisma/client/index.d.ts","start":81311,"length":6,"messageText":"The expected type comes from property 'create' which is declared here on type '{ select?: UserSelect | null | undefined; include?: UserInclude | null | undefined; where: UserWhereUniqueInput; create: (Without<...> & UserUncheckedCreateInput) | (Without<...> & UserCreateInput); update: (Without<...> & UserUncheckedUpdateInput) | (Without<...> & UserUpdateInput); }'","category":3,"code":6500}]},{"start":1078,"length":7,"code":2339,"category":1,"messageText":"Property 'empresa' does not exist on type 'PrismaClient'."},{"start":1678,"length":7,"code":2339,"category":1,"messageText":"Property 'empresa' does not exist on type 'PrismaClient'."},{"start":2294,"length":7,"code":2339,"category":1,"messageText":"Property 'empresa' does not exist on type 'PrismaClient'."},{"start":3042,"length":11,"code":2339,"category":1,"messageText":"Property 'propriedade' does not exist on type 'PrismaClient'."},{"start":3535,"length":11,"code":2339,"category":1,"messageText":"Property 'propriedade' does not exist on type 'PrismaClient'."},{"start":3949,"length":11,"code":2339,"category":1,"messageText":"Property 'propriedade' does not exist on type 'PrismaClient'."},{"start":4418,"length":11,"code":2339,"category":1,"messageText":"Property 'propriedade' does not exist on type 'PrismaClient'."},{"start":4836,"length":11,"code":2339,"category":1,"messageText":"Property 'propriedade' does not exist on type 'PrismaClient'."},{"start":5642,"length":9,"code":2339,"category":1,"messageText":"Property 'avaliacao' does not exist on type 'PrismaClient'."},{"start":6078,"length":9,"code":2339,"category":1,"messageText":"Property 'avaliacao' does not exist on type 'PrismaClient'."},{"start":6434,"length":9,"code":2339,"category":1,"messageText":"Property 'avaliacao' does not exist on type 'PrismaClient'."},{"start":6714,"length":9,"code":2339,"category":1,"messageText":"Property 'avaliacao' does not exist on type 'PrismaClient'."},{"start":7129,"length":9,"code":2339,"category":1,"messageText":"Property 'avaliacao' does not exist on type 'PrismaClient'."},{"start":7536,"length":9,"code":2339,"category":1,"messageText":"Property 'avaliacao' does not exist on type 'PrismaClient'."},{"start":7910,"length":9,"code":2339,"category":1,"messageText":"Property 'avaliacao' does not exist on type 'PrismaClient'."},{"start":8193,"length":9,"code":2339,"category":1,"messageText":"Property 'avaliacao' does not exist on type 'PrismaClient'."},{"start":8607,"length":9,"code":2339,"category":1,"messageText":"Property 'avaliacao' does not exist on type 'PrismaClient'."},{"start":9030,"length":9,"code":2339,"category":1,"messageText":"Property 'avaliacao' does not exist on type 'PrismaClient'."}]],[441,[{"start":58,"length":16,"messageText":"Cannot find module '@nestjs/common' or its corresponding type declarations.","category":1,"code":2307}]],[442,[{"start":31,"length":16,"messageText":"Cannot find module '@nestjs/common' or its corresponding type declarations.","category":1,"code":2307}]],[443,[{"start":45,"length":17,"messageText":"Cannot find module 'class-validator' or its corresponding type declarations.","category":1,"code":2307},{"start":92,"length":17,"messageText":"Cannot find module '@nestjs/swagger' or its corresponding type declarations.","category":1,"code":2307},{"start":266,"length":5,"messageText":"Property 'email' has no initializer and is not definitely assigned in the constructor.","category":1,"code":2564},{"start":444,"length":8,"messageText":"Property 'password' has no initializer and is not definitely assigned in the constructor.","category":1,"code":2564}]],[444,[{"start":65,"length":17,"messageText":"Cannot find module 'class-validator' or its corresponding type declarations.","category":1,"code":2307},{"start":133,"length":17,"messageText":"Cannot find module '@nestjs/swagger' or its corresponding type declarations.","category":1,"code":2307},{"start":161,"length":4,"messageText":"Module '\"@prisma/client\"' has no exported member 'Role'.","category":1,"code":2305},{"start":352,"length":5,"messageText":"Property 'email' has no initializer and is not definitely assigned in the constructor.","category":1,"code":2564},{"start":528,"length":8,"messageText":"Property 'password' has no initializer and is not definitely assigned in the constructor.","category":1,"code":2564},{"start":715,"length":4,"messageText":"Property 'nome' has no initializer and is not definitely assigned in the constructor.","category":1,"code":2564}]],[445,[{"start":69,"length":16,"messageText":"Cannot find module '@nestjs/common' or its corresponding type declarations.","category":1,"code":2307},{"start":114,"length":13,"messageText":"Cannot find module '@nestjs/jwt' or its corresponding type declarations.","category":1,"code":2307},{"start":153,"length":8,"code":7016,"category":1,"messageText":{"messageText":"Could not find a declaration file for module 'bcrypt'. '/home/kernelpanic/projetos_jarvis/duorigin-v2/node_modules/bcrypt/bcrypt.js' implicitly has an 'any' type.","category":1,"code":7016,"next":[{"info":{"moduleReference":"bcrypt","mode":99}}]}},{"start":750,"length":8,"code":2339,"category":1,"messageText":"Property 'password' does not exist on type '{ id: number; email: string; hashed_password: string; full_name: string | null; role: string | null; is_active: boolean | null; created_at: Date | null; }'."},{"start":875,"length":5,"code":2339,"category":1,"messageText":"Property 'ativo' does not exist on type '{ id: number; email: string; hashed_password: string; full_name: string | null; role: string | null; is_active: boolean | null; created_at: Date | null; }'."},{"start":1209,"length":4,"code":2339,"category":1,"messageText":"Property 'nome' does not exist on type '{ id: number; email: string; hashed_password: string; full_name: string | null; role: string | null; is_active: boolean | null; created_at: Date | null; }'."},{"start":1686,"length":8,"code":2353,"category":1,"messageText":"Object literal may only specify known properties, and 'password' does not exist in type '(Without & UserUncheckedCreateInput) | (Without<...> & UserCreateInput)'.","relatedInformation":[{"file":"./node_modules/.prisma/client/index.d.ts","start":79045,"length":4,"messageText":"The expected type comes from property 'data' which is declared here on type '{ select?: UserSelect | null | undefined; include?: UserInclude | null | undefined; data: (Without & UserUncheckedCreateInput) | (Without<...> & UserCreateInput); }'","category":3,"code":6500}]},{"start":2065,"length":4,"code":2339,"category":1,"messageText":"Property 'nome' does not exist on type '{ id: number; email: string; hashed_password: string; full_name: string | null; role: string | null; is_active: boolean | null; created_at: Date | null; }'."},{"start":2299,"length":4,"code":2353,"category":1,"messageText":"Object literal may only specify known properties, and 'nome' does not exist in type 'UserSelect'.","relatedInformation":[{"file":"./node_modules/.prisma/client/index.d.ts","start":73540,"length":6,"messageText":"The expected type comes from property 'select' which is declared here on type '{ select?: UserSelect | null | undefined; include?: UserInclude | null | undefined; where: UserWhereUniqueInput; }'","category":3,"code":6500}]}]],[446,[{"start":68,"length":16,"messageText":"Cannot find module '@nestjs/common' or its corresponding type declarations.","category":1,"code":2307},{"start":112,"length":18,"messageText":"Cannot find module '@nestjs/passport' or its corresponding type declarations.","category":1,"code":2307},{"start":158,"length":14,"messageText":"Cannot find module '@nestjs/core' or its corresponding type declarations.","category":1,"code":2307}]],[447,[{"start":64,"length":16,"messageText":"Cannot find module '@nestjs/common' or its corresponding type declarations.","category":1,"code":2307},{"start":148,"length":17,"messageText":"Cannot find module '@nestjs/swagger' or its corresponding type declarations.","category":1,"code":2307},{"start":700,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":1015,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":1388,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206}]],[448,[{"start":50,"length":16,"messageText":"Cannot find module '@nestjs/common' or its corresponding type declarations.","category":1,"code":2307},{"start":101,"length":18,"messageText":"Cannot find module '@nestjs/passport' or its corresponding type declarations.","category":1,"code":2307},{"start":158,"length":14,"messageText":"Cannot find module 'passport-jwt' or its corresponding type declarations.","category":1,"code":2307},{"start":204,"length":16,"messageText":"Cannot find module '@nestjs/config' or its corresponding type declarations.","category":1,"code":2307},{"start":972,"length":5,"code":2339,"category":1,"messageText":"Property 'ativo' does not exist on type '{ id: number; email: string; hashed_password: string; full_name: string | null; role: string | null; is_active: boolean | null; created_at: Date | null; }'."}]],[449,[{"start":76,"length":17,"messageText":"Cannot find module 'class-validator' or its corresponding type declarations.","category":1,"code":2307},{"start":144,"length":17,"messageText":"Cannot find module '@nestjs/swagger' or its corresponding type declarations.","category":1,"code":2307},{"start":172,"length":4,"messageText":"Module '\"@prisma/client\"' has no exported member 'Role'.","category":1,"code":2305},{"start":332,"length":5,"messageText":"Property 'email' has no initializer and is not definitely assigned in the constructor.","category":1,"code":2564},{"start":475,"length":8,"messageText":"Property 'password' has no initializer and is not definitely assigned in the constructor.","category":1,"code":2564},{"start":621,"length":4,"messageText":"Property 'nome' has no initializer and is not definitely assigned in the constructor.","category":1,"code":2564}]],[450,[{"start":28,"length":17,"messageText":"Cannot find module '@nestjs/swagger' or its corresponding type declarations.","category":1,"code":2307}]],[451,[{"start":65,"length":16,"messageText":"Cannot find module '@nestjs/common' or its corresponding type declarations.","category":1,"code":2307},{"start":107,"length":8,"code":7016,"category":1,"messageText":{"messageText":"Could not find a declaration file for module 'bcrypt'. '/home/kernelpanic/projetos_jarvis/duorigin-v2/node_modules/bcrypt/bcrypt.js' implicitly has an 'any' type.","category":1,"code":7016,"next":[{"info":{"moduleReference":"bcrypt","mode":99}}]}},{"start":499,"length":4,"code":2353,"category":1,"messageText":"Object literal may only specify known properties, and 'nome' does not exist in type 'UserSelect'."},{"start":628,"length":9,"code":2353,"category":1,"messageText":"Object literal may only specify known properties, and 'createdAt' does not exist in type 'UserOrderByWithRelationInput | UserOrderByWithRelationInput[]'."},{"start":829,"length":4,"code":2353,"category":1,"messageText":"Object literal may only specify known properties, and 'nome' does not exist in type 'UserSelect'.","relatedInformation":[{"file":"./node_modules/.prisma/client/index.d.ts","start":73540,"length":6,"messageText":"The expected type comes from property 'select' which is declared here on type '{ select?: UserSelect | null | undefined; include?: UserInclude | null | undefined; where: UserWhereUniqueInput; }'","category":3,"code":6500}]},{"start":1560,"length":8,"code":2353,"category":1,"messageText":"Object literal may only specify known properties, and 'password' does not exist in type '(Without & UserUncheckedCreateInput) | (Without<...> & UserCreateInput)'.","relatedInformation":[{"file":"./node_modules/.prisma/client/index.d.ts","start":79045,"length":4,"messageText":"The expected type comes from property 'data' which is declared here on type '{ select?: UserSelect | null | undefined; include?: UserInclude | null | undefined; data: (Without & UserUncheckedCreateInput) | (Without<...> & UserCreateInput); }'","category":3,"code":6500}]},{"start":1784,"length":4,"code":2353,"category":1,"messageText":"Object literal may only specify known properties, and 'nome' does not exist in type 'UserSelect'.","relatedInformation":[{"file":"./node_modules/.prisma/client/index.d.ts","start":78838,"length":6,"messageText":"The expected type comes from property 'select' which is declared here on type '{ select?: UserSelect | null | undefined; include?: UserInclude | null | undefined; data: (Without & UserUncheckedCreateInput) | (Without<...> & UserCreateInput); }'","category":3,"code":6500}]},{"start":2086,"length":8,"code":2339,"category":1,"messageText":"Property 'password' does not exist on type 'UpdateUserDto'."},{"start":2152,"length":8,"code":2339,"category":1,"messageText":"Property 'password' does not exist on type 'UpdateUserDto'."},{"start":2307,"length":4,"code":2353,"category":1,"messageText":"Object literal may only specify known properties, and 'nome' does not exist in type 'UserSelect'.","relatedInformation":[{"file":"./node_modules/.prisma/client/index.d.ts","start":80022,"length":6,"messageText":"The expected type comes from property 'select' which is declared here on type '{ select?: UserSelect | null | undefined; include?: UserInclude | null | undefined; data: (Without & UserUncheckedUpdateInput) | (Without<...> & UserUpdateInput); where: UserWhereUniqueInput; }'","category":3,"code":6500}]},{"start":2752,"length":5,"code":2353,"category":1,"messageText":"Object literal may only specify known properties, and 'ativo' does not exist in type '(Without & UserUncheckedUpdateInput) | (Without<...> & UserUpdateInput)'.","relatedInformation":[{"file":"./node_modules/.prisma/client/index.d.ts","start":80229,"length":4,"messageText":"The expected type comes from property 'data' which is declared here on type '{ select?: UserSelect | null | undefined; include?: UserInclude | null | undefined; data: (Without & UserUncheckedUpdateInput) | (Without<...> & UserUpdateInput); where: UserWhereUniqueInput; }'","category":3,"code":6500}]},{"start":2765,"length":5,"code":2339,"category":1,"messageText":"Property 'ativo' does not exist on type '{ id: number; email: string; hashed_password: string; full_name: string | null; role: string | null; is_active: boolean | null; created_at: Date | null; }'."},{"start":2837,"length":4,"code":2353,"category":1,"messageText":"Object literal may only specify known properties, and 'nome' does not exist in type 'UserSelect'.","relatedInformation":[{"file":"./node_modules/.prisma/client/index.d.ts","start":80022,"length":6,"messageText":"The expected type comes from property 'select' which is declared here on type '{ select?: UserSelect | null | undefined; include?: UserInclude | null | undefined; data: (Without & UserUncheckedUpdateInput) | (Without<...> & UserUpdateInput); where: UserWhereUniqueInput; }'","category":3,"code":6500}]}]],[452,[{"start":78,"length":16,"messageText":"Cannot find module '@nestjs/common' or its corresponding type declarations.","category":1,"code":2307},{"start":122,"length":14,"messageText":"Cannot find module '@nestjs/core' or its corresponding type declarations.","category":1,"code":2307},{"start":147,"length":4,"messageText":"Module '\"@prisma/client\"' has no exported member 'Role'.","category":1,"code":2305}]],[453,[{"start":28,"length":16,"messageText":"Cannot find module '@nestjs/common' or its corresponding type declarations.","category":1,"code":2307},{"start":55,"length":4,"messageText":"Module '\"@prisma/client\"' has no exported member 'Role'.","category":1,"code":2305}]],[454,[{"start":96,"length":16,"messageText":"Cannot find module '@nestjs/common' or its corresponding type declarations.","category":1,"code":2307},{"start":180,"length":17,"messageText":"Cannot find module '@nestjs/swagger' or its corresponding type declarations.","category":1,"code":2307},{"start":520,"length":4,"messageText":"Module '\"@prisma/client\"' has no exported member 'Role'.","category":1,"code":2305},{"start":1194,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":1524,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":1861,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":1900,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":2240,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":2522,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206}]],[455,[{"start":23,"length":16,"messageText":"Cannot find module '@nestjs/common' or its corresponding type declarations.","category":1,"code":2307}]],[456,[{"start":23,"length":16,"messageText":"Cannot find module '@nestjs/common' or its corresponding type declarations.","category":1,"code":2307},{"start":67,"length":13,"messageText":"Cannot find module '@nestjs/jwt' or its corresponding type declarations.","category":1,"code":2307},{"start":113,"length":18,"messageText":"Cannot find module '@nestjs/passport' or its corresponding type declarations.","category":1,"code":2307},{"start":177,"length":16,"messageText":"Cannot find module '@nestjs/config' or its corresponding type declarations.","category":1,"code":2307}]],[457,[{"start":77,"length":17,"messageText":"Cannot find module 'class-validator' or its corresponding type declarations.","category":1,"code":2307},{"start":145,"length":17,"messageText":"Cannot find module '@nestjs/swagger' or its corresponding type declarations.","category":1,"code":2307},{"start":346,"length":11,"messageText":"Property 'razaoSocial' has no initializer and is not definitely assigned in the constructor.","category":1,"code":2564},{"start":662,"length":4,"messageText":"Property 'cnpj' has no initializer and is not definitely assigned in the constructor.","category":1,"code":2564}]],[458,[{"start":28,"length":17,"messageText":"Cannot find module '@nestjs/swagger' or its corresponding type declarations.","category":1,"code":2307}]],[459,[{"start":65,"length":16,"messageText":"Cannot find module '@nestjs/common' or its corresponding type declarations.","category":1,"code":2307},{"start":424,"length":7,"code":2339,"category":1,"messageText":"Property 'empresa' does not exist on type 'PrismaService'."},{"start":825,"length":7,"code":2339,"category":1,"messageText":"Property 'empresa' does not exist on type 'PrismaService'."},{"start":1251,"length":7,"code":2339,"category":1,"messageText":"Property 'empresa' does not exist on type 'PrismaService'."},{"start":1438,"length":7,"code":2339,"category":1,"messageText":"Property 'empresa' does not exist on type 'PrismaService'."},{"start":1742,"length":4,"code":2339,"category":1,"messageText":"Property 'cnpj' does not exist on type 'UpdateEmpresaDto'."},{"start":1795,"length":7,"code":2339,"category":1,"messageText":"Property 'empresa' does not exist on type 'PrismaService'."},{"start":1865,"length":4,"code":2339,"category":1,"messageText":"Property 'cnpj' does not exist on type 'UpdateEmpresaDto'."},{"start":2039,"length":7,"code":2339,"category":1,"messageText":"Property 'empresa' does not exist on type 'PrismaService'."},{"start":2324,"length":7,"code":2339,"category":1,"messageText":"Property 'empresa' does not exist on type 'PrismaService'."},{"start":2522,"length":7,"code":2339,"category":1,"messageText":"Property 'empresa' does not exist on type 'PrismaService'."}]],[460,[{"start":103,"length":16,"messageText":"Cannot find module '@nestjs/common' or its corresponding type declarations.","category":1,"code":2307},{"start":197,"length":17,"messageText":"Cannot find module '@nestjs/swagger' or its corresponding type declarations.","category":1,"code":2307},{"start":844,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":1178,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":1481,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":1801,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":1840,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":2163,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":2419,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206}]],[461,[{"start":23,"length":16,"messageText":"Cannot find module '@nestjs/common' or its corresponding type declarations.","category":1,"code":2307}]],[462,[{"start":87,"length":17,"messageText":"Cannot find module 'class-validator' or its corresponding type declarations.","category":1,"code":2307},{"start":155,"length":17,"messageText":"Cannot find module '@nestjs/swagger' or its corresponding type declarations.","category":1,"code":2307},{"start":183,"length":10,"messageText":"Module '\"@prisma/client\"' has no exported member 'NivelRisco'.","category":1,"code":2305},{"start":389,"length":4,"messageText":"Property 'nome' has no initializer and is not definitely assigned in the constructor.","category":1,"code":2564},{"start":451,"length":9,"messageText":"Property 'empresaId' has no initializer and is not definitely assigned in the constructor.","category":1,"code":2564}]],[463,[{"start":28,"length":17,"messageText":"Cannot find module '@nestjs/swagger' or its corresponding type declarations.","category":1,"code":2307}]],[464,[{"start":67,"length":16,"messageText":"Cannot find module '@nestjs/common' or its corresponding type declarations.","category":1,"code":2307},{"start":626,"length":11,"code":2339,"category":1,"messageText":"Property 'propriedade' does not exist on type 'PrismaService'."},{"start":991,"length":11,"code":2339,"category":1,"messageText":"Property 'propriedade' does not exist on type 'PrismaService'."},{"start":1694,"length":7,"code":2339,"category":1,"messageText":"Property 'empresa' does not exist on type 'PrismaService'."},{"start":1890,"length":11,"code":2339,"category":1,"messageText":"Property 'propriedade' does not exist on type 'PrismaService'."},{"start":2208,"length":9,"code":2339,"category":1,"messageText":"Property 'empresaId' does not exist on type 'UpdatePropriedadeDto'."},{"start":2261,"length":7,"code":2339,"category":1,"messageText":"Property 'empresa' does not exist on type 'PrismaService'."},{"start":2324,"length":9,"code":2339,"category":1,"messageText":"Property 'empresaId' does not exist on type 'UpdatePropriedadeDto'."},{"start":2473,"length":11,"code":2339,"category":1,"messageText":"Property 'propriedade' does not exist on type 'PrismaService'."},{"start":2760,"length":11,"code":2339,"category":1,"messageText":"Property 'propriedade' does not exist on type 'PrismaService'."},{"start":2970,"length":11,"code":2339,"category":1,"messageText":"Property 'propriedade' does not exist on type 'PrismaService'."}]],[465,[{"start":103,"length":16,"messageText":"Cannot find module '@nestjs/common' or its corresponding type declarations.","category":1,"code":2307},{"start":197,"length":17,"messageText":"Cannot find module '@nestjs/swagger' or its corresponding type declarations.","category":1,"code":2307},{"start":967,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":1011,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":1376,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":1695,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":2048,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":2091,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":2446,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":2710,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206}]],[466,[{"start":23,"length":16,"messageText":"Cannot find module '@nestjs/common' or its corresponding type declarations.","category":1,"code":2307}]],[467,[{"start":55,"length":17,"messageText":"Cannot find module 'class-validator' or its corresponding type declarations.","category":1,"code":2307},{"start":123,"length":17,"messageText":"Cannot find module '@nestjs/swagger' or its corresponding type declarations.","category":1,"code":2307},{"start":151,"length":15,"messageText":"Module '\"@prisma/client\"' has no exported member 'StatusAvaliacao'.","category":1,"code":2305},{"start":168,"length":10,"messageText":"Module '\"@prisma/client\"' has no exported member 'NivelRisco'.","category":1,"code":2305},{"start":320,"length":13,"messageText":"Property 'propriedadeId' has no initializer and is not definitely assigned in the constructor.","category":1,"code":2564}]],[468,[{"start":28,"length":17,"messageText":"Cannot find module '@nestjs/swagger' or its corresponding type declarations.","category":1,"code":2307}]],[469,[{"start":67,"length":16,"messageText":"Cannot find module '@nestjs/common' or its corresponding type declarations.","category":1,"code":2307},{"start":282,"length":15,"messageText":"Module '\"@prisma/client\"' has no exported member 'StatusAvaliacao'.","category":1,"code":2305},{"start":299,"length":10,"messageText":"Module '\"@prisma/client\"' has no exported member 'NivelRisco'.","category":1,"code":2305},{"start":913,"length":9,"code":2339,"category":1,"messageText":"Property 'avaliacao' does not exist on type 'PrismaService'."},{"start":1469,"length":9,"code":2339,"category":1,"messageText":"Property 'avaliacao' does not exist on type 'PrismaService'."},{"start":2069,"length":11,"code":2339,"category":1,"messageText":"Property 'propriedade' does not exist on type 'PrismaService'."},{"start":2279,"length":9,"code":2339,"category":1,"messageText":"Property 'avaliacao' does not exist on type 'PrismaService'."},{"start":2793,"length":13,"code":2339,"category":1,"messageText":"Property 'propriedadeId' does not exist on type 'UpdateAvaliacaoDto'."},{"start":2854,"length":11,"code":2339,"category":1,"messageText":"Property 'propriedade' does not exist on type 'PrismaService'."},{"start":2919,"length":13,"code":2339,"category":1,"messageText":"Property 'propriedadeId' does not exist on type 'UpdateAvaliacaoDto'."},{"start":3080,"length":9,"code":2339,"category":1,"messageText":"Property 'avaliacao' does not exist on type 'PrismaService'."},{"start":3449,"length":9,"code":2339,"category":1,"messageText":"Property 'avaliacao' does not exist on type 'PrismaService'."},{"start":4877,"length":9,"code":2339,"category":1,"messageText":"Property 'avaliacao' does not exist on type 'PrismaService'."},{"start":5728,"length":9,"code":2339,"category":1,"messageText":"Property 'avaliacao' does not exist on type 'PrismaService'."},{"start":6182,"length":9,"code":2339,"category":1,"messageText":"Property 'avaliacao' does not exist on type 'PrismaService'."},{"start":6400,"length":9,"code":2339,"category":1,"messageText":"Property 'avaliacao' does not exist on type 'PrismaService'."}]],[470,[{"start":105,"length":16,"messageText":"Cannot find module '@nestjs/common' or its corresponding type declarations.","category":1,"code":2307},{"start":199,"length":17,"messageText":"Cannot find module '@nestjs/swagger' or its corresponding type declarations.","category":1,"code":2307},{"start":470,"length":15,"messageText":"Module '\"@prisma/client\"' has no exported member 'StatusAvaliacao'.","category":1,"code":2305},{"start":996,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":1048,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":1390,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":1707,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":1755,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":2081,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":2124,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":2465,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":2820,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":3144,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":3388,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":3635,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":3674,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206}]],[471,[{"start":23,"length":16,"messageText":"Cannot find module '@nestjs/common' or its corresponding type declarations.","category":1,"code":2307}]],[472,[{"start":67,"length":16,"messageText":"Cannot find module '@nestjs/common' or its corresponding type declarations.","category":1,"code":2307},{"start":975,"length":9,"code":2339,"category":1,"messageText":"Property 'documento' does not exist on type 'PrismaService'."},{"start":1387,"length":9,"code":2339,"category":1,"messageText":"Property 'documento' does not exist on type 'PrismaService'."},{"start":1850,"length":6,"messageText":"Namespace 'global.Express' has no exported member 'Multer'.","category":1,"code":2694},{"start":2127,"length":11,"code":2339,"category":1,"messageText":"Property 'propriedade' does not exist on type 'PrismaService'."},{"start":2375,"length":9,"code":2339,"category":1,"messageText":"Property 'avaliacao' does not exist on type 'PrismaService'."},{"start":2927,"length":9,"code":2339,"category":1,"messageText":"Property 'documento' does not exist on type 'PrismaService'."},{"start":3685,"length":9,"code":2339,"category":1,"messageText":"Property 'documento' does not exist on type 'PrismaService'."}]],[473,[{"start":173,"length":16,"messageText":"Cannot find module '@nestjs/common' or its corresponding type declarations.","category":1,"code":2307},{"start":223,"length":26,"messageText":"Cannot find module '@nestjs/platform-express' or its corresponding type declarations.","category":1,"code":2307},{"start":349,"length":17,"messageText":"Cannot find module '@nestjs/swagger' or its corresponding type declarations.","category":1,"code":2307},{"start":393,"length":9,"messageText":"Cannot find module 'express' or its corresponding type declarations.","category":1,"code":2307},{"start":1024,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":1076,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":1424,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":1746,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":1785,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":2664,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":2694,"length":6,"messageText":"Namespace 'global.Express' has no exported member 'Multer'.","category":1,"code":2694},{"start":2711,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":2736,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":2788,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206},{"start":3149,"length":1,"messageText":"Decorators are not valid here.","category":1,"code":1206}]],[474,[{"start":23,"length":16,"messageText":"Cannot find module '@nestjs/common' or its corresponding type declarations.","category":1,"code":2307}]],[475,[{"start":27,"length":16,"messageText":"Cannot find module '@nestjs/common' or its corresponding type declarations.","category":1,"code":2307},{"start":406,"length":7,"code":2339,"category":1,"messageText":"Property 'empresa' does not exist on type 'PrismaService'."},{"start":467,"length":11,"code":2339,"category":1,"messageText":"Property 'propriedade' does not exist on type 'PrismaService'."},{"start":532,"length":9,"code":2339,"category":1,"messageText":"Property 'avaliacao' does not exist on type 'PrismaService'."},{"start":569,"length":9,"code":2339,"category":1,"messageText":"Property 'documento' does not exist on type 'PrismaService'."},{"start":628,"length":5,"code":2353,"category":1,"messageText":"Object literal may only specify known properties, and 'ativo' does not exist in type 'UserWhereInput'."},{"start":732,"length":9,"code":2339,"category":1,"messageText":"Property 'avaliacao' does not exist on type 'PrismaService'."},{"start":961,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":978,"length":25,"code":7053,"category":1,"messageText":"Element implicitly has an 'any' type because expression of type 'any' can't be used to index type '{ RASCUNHO: number; EM_ANALISE: number; APROVADA: number; REPROVADA: number; }'."},{"start":1120,"length":11,"code":2339,"category":1,"messageText":"Property 'propriedade' does not exist on type 'PrismaService'."},{"start":1375,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":1392,"length":28,"code":7053,"category":1,"messageText":"Element implicitly has an 'any' type because expression of type 'any' can't be used to index type '{ BAIXO: number; MEDIO: number; ALTO: number; CRITICO: number; }'."},{"start":1528,"length":9,"code":2339,"category":1,"messageText":"Property 'avaliacao' does not exist on type 'PrismaService'."},{"start":1834,"length":7,"code":2339,"category":1,"messageText":"Property 'empresa' does not exist on type 'PrismaService'."},{"start":2280,"length":9,"code":2339,"category":1,"messageText":"Property 'avaliacao' does not exist on type 'PrismaService'."},{"start":2534,"length":4,"messageText":"Parameter 'item' implicitly has an 'any' type.","category":1,"code":7006},{"start":3048,"length":1,"messageText":"Parameter 'a' implicitly has an 'any' type.","category":1,"code":7006},{"start":3295,"length":1,"messageText":"Parameter 'e' implicitly has an 'any' type.","category":1,"code":7006}]],[476,[{"start":43,"length":16,"messageText":"Cannot find module '@nestjs/common' or its corresponding type declarations.","category":1,"code":2307},{"start":127,"length":17,"messageText":"Cannot find module '@nestjs/swagger' or its corresponding type declarations.","category":1,"code":2307}]],[477,[{"start":23,"length":16,"messageText":"Cannot find module '@nestjs/common' or its corresponding type declarations.","category":1,"code":2307}]],[478,[{"start":23,"length":16,"messageText":"Cannot find module '@nestjs/common' or its corresponding type declarations.","category":1,"code":2307},{"start":70,"length":16,"messageText":"Cannot find module '@nestjs/config' or its corresponding type declarations.","category":1,"code":2307}]],[479,[{"start":28,"length":14,"messageText":"Cannot find module '@nestjs/core' or its corresponding type declarations.","category":1,"code":2307},{"start":75,"length":16,"messageText":"Cannot find module '@nestjs/common' or its corresponding type declarations.","category":1,"code":2307},{"start":140,"length":17,"messageText":"Cannot find module '@nestjs/swagger' or its corresponding type declarations.","category":1,"code":2307}]],[510,[{"start":69,"length":14,"messageText":"Cannot find module '@/api/client' or its corresponding type declarations.","category":1,"code":2307}]],[511,[{"start":64,"length":24,"messageText":"Cannot find module '@/contexts/AuthContext' or its corresponding type declarations.","category":1,"code":2307}]],[515,[{"start":416,"length":14,"code":2561,"category":1,"messageText":"Object literal may only specify known properties, but 'hashedPassword' does not exist in type '(Without & UserUncheckedCreateInput) | (Without<...> & UserCreateInput)'. Did you mean to write 'hashed_password'?","relatedInformation":[{"file":"./node_modules/.prisma/client/index.d.ts","start":81311,"length":6,"messageText":"The expected type comes from property 'create' which is declared here on type '{ select?: UserSelect | null | undefined; include?: UserInclude | null | undefined; where: UserWhereUniqueInput; create: (Without<...> & UserUncheckedCreateInput) | (Without<...> & UserCreateInput); update: (Without<...> & UserUncheckedUpdateInput) | (Without<...> & UserUpdateInput); }'","category":3,"code":6500}]},{"start":845,"length":14,"code":2561,"category":1,"messageText":"Object literal may only specify known properties, but 'hashedPassword' does not exist in type '(Without & UserUncheckedCreateInput) | (Without<...> & UserCreateInput)'. Did you mean to write 'hashed_password'?","relatedInformation":[{"file":"./node_modules/.prisma/client/index.d.ts","start":81311,"length":6,"messageText":"The expected type comes from property 'create' which is declared here on type '{ select?: UserSelect | null | undefined; include?: UserInclude | null | undefined; where: UserWhereUniqueInput; create: (Without<...> & UserUncheckedCreateInput) | (Without<...> & UserCreateInput); update: (Without<...> & UserUncheckedUpdateInput) | (Without<...> & UserUpdateInput); }'","category":3,"code":6500}]},{"start":1307,"length":12,"code":2561,"category":1,"messageText":"Object literal may only specify known properties, but 'euOperatorId' does not exist in type '(Without & CompanyUncheckedCreateInput) | (Without<...> & CompanyCreateInput)'. Did you mean to write 'eu_operator_id'?","relatedInformation":[{"file":"./node_modules/.prisma/client/index.d.ts","start":115813,"length":6,"messageText":"The expected type comes from property 'create' which is declared here on type '{ select?: CompanySelect | null | undefined; include?: CompanyInclude | null | undefined; where: CompanyWhereUniqueInput; create: (Without<...> & CompanyUncheckedCreateInput) | (Without<...> & CompanyCreateInput); update: (Without<...> & CompanyUncheckedUpdateInput) | (Without<...> & Compan...'","category":3,"code":6500}]},{"start":1466,"length":11,"code":2339,"category":1,"messageText":"Property 'propriedade' does not exist on type 'PrismaClient'."},{"start":1858,"length":9,"code":2339,"category":1,"messageText":"Property 'avaliacao' does not exist on type 'PrismaClient'."}]],[602,[{"start":914,"length":21,"code":2352,"category":1,"messageText":{"messageText":"Conversion of type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/node_modules/jose/dist/types/types\").JWTPayload' to type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/src/lib/auth\").JWTPayload' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first.","category":1,"code":2352,"next":[{"messageText":"Type 'JWTPayload' is missing the following properties from type 'JWTPayload': email, role","category":1,"code":2739}]}}]],[603,[{"start":42,"length":11,"messageText":"Module '\"@/lib/auth\"' has no exported member 'authOptions'.","category":1,"code":2305}]],[651,[{"start":118,"length":11,"messageText":"An import path can only end with a '.tsx' extension when 'allowImportingTsExtensions' is enabled.","category":1,"code":5097},{"start":187,"length":10,"code":2786,"category":1,"messageText":{"messageText":"'StrictMode' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ExoticComponent<{ children?: ReactNode; }>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ExoticComponent<{ children?: ReactNode; }>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ExoticComponent<{ children?: ReactNode; }>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]}]],[653,[{"start":1566,"length":1,"code":2786,"category":1,"messageText":{"messageText":"'X' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":1747,"length":10,"code":2322,"category":1,"messageText":{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728},{"file":"./node_modules/@types/react/index.d.ts","start":92632,"length":8,"messageText":"The expected type comes from property 'children' which is declared here on type 'DetailedHTMLProps, HTMLDivElement>'","category":3,"code":6500}]}]],[654,[{"start":169,"length":16,"messageText":"Cannot find module '@/hooks/useApi' or its corresponding type declarations.","category":1,"code":2307},{"start":196,"length":9,"messageText":"Module '\"@/types\"' has no exported member 'Avaliacao'.","category":1,"code":2305},{"start":3113,"length":11,"code":2786,"category":1,"messageText":{"messageText":"'CheckCircle' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":3210,"length":11,"code":2786,"category":1,"messageText":{"messageText":"'AlertCircle' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":4750,"length":7,"code":2786,"category":1,"messageText":{"messageText":"'Loader2' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":4901,"length":8,"code":2786,"category":1,"messageText":{"messageText":"'FileText' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":5150,"length":8,"code":2786,"category":1,"messageText":{"messageText":"'Download' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]}]],[663,[{"start":78,"length":17,"messageText":"Cannot find module '@/hooks/useAuth' or its corresponding type declarations.","category":1,"code":2307},{"start":1041,"length":4,"code":2786,"category":1,"messageText":{"messageText":"'Link' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":1486,"length":4,"code":2786,"category":1,"messageText":{"messageText":"'Link' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":1659,"length":9,"code":2786,"category":1,"messageText":{"messageText":"'item.icon' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":2096,"length":4,"code":2786,"category":1,"messageText":{"messageText":"'Link' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":2289,"length":9,"code":2786,"category":1,"messageText":{"messageText":"'item.icon' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":3253,"length":6,"code":2786,"category":1,"messageText":{"messageText":"'LogOut' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]}]],[664,[{"start":252,"length":6,"code":2786,"category":1,"messageText":{"messageText":"'Outlet' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type '(props: OutletProps) => ReactElement> | null' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type '(props: OutletProps) => ReactElement> | null' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement> | null' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type '(props: OutletProps) => ReactElement> | null' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]}]],[665,[{"start":800,"length":7,"code":2786,"category":1,"messageText":{"messageText":"'Loader2' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":1996,"length":133,"code":2322,"category":1,"messageText":{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728},{"file":"./node_modules/@types/react/index.d.ts","start":92632,"length":8,"messageText":"The expected type comes from property 'children' which is declared here on type 'DetailedHTMLProps, HTMLTableDataCellElement>'","category":3,"code":6500}]},{"start":2865,"length":11,"code":2786,"category":1,"messageText":{"messageText":"'ChevronLeft' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":3219,"length":12,"code":2786,"category":1,"messageText":{"messageText":"'ChevronRight' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]}]],[667,[{"start":283,"length":4,"code":2786,"category":1,"messageText":{"messageText":"'Link' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":805,"length":4,"code":2786,"category":1,"messageText":{"messageText":"'Link' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]}]],[668,[{"start":82,"length":17,"messageText":"Cannot find module '@/hooks/useAuth' or its corresponding type declarations.","category":1,"code":2307},{"start":539,"length":7,"code":2786,"category":1,"messageText":{"messageText":"'Loader2' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]}]],[669,[{"start":451,"length":6,"code":2322,"category":1,"messageText":{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728},{"file":"./node_modules/@types/react/index.d.ts","start":92632,"length":8,"messageText":"The expected type comes from property 'children' which is declared here on type 'DetailedHTMLProps, HTMLDivElement>'","category":3,"code":6500}]},{"start":629,"length":10,"code":2786,"category":1,"messageText":{"messageText":"'TrendingUp' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":666,"length":12,"code":2786,"category":1,"messageText":{"messageText":"'TrendingDown' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]}]],[670,[{"start":93,"length":14,"messageText":"Cannot find module '@/api/client' or its corresponding type declarations.","category":1,"code":2307},{"start":124,"length":12,"messageText":"Module '\"@/types\"' has no exported member 'AuthResponse'.","category":1,"code":2305},{"start":138,"length":16,"messageText":"Module '\"@/types\"' has no exported member 'LoginCredentials'.","category":1,"code":2305},{"start":156,"length":12,"messageText":"Module '\"@/types\"' has no exported member 'RegistroData'.","category":1,"code":2305},{"start":1026,"length":8,"messageText":"Parameter 'response' implicitly has an 'any' type.","category":1,"code":7006},{"start":2272,"length":20,"code":2786,"category":1,"messageText":{"messageText":"'AuthContext.Provider' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'Provider' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ProviderExoticComponent>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ProviderExoticComponent>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]}]],[797,[{"start":299,"length":16,"messageText":"Cannot find module '@/hooks/useApi' or its corresponding type declarations.","category":1,"code":2307},{"start":326,"length":14,"messageText":"Module '\"@/types\"' has no exported member 'DashboardStats'.","category":1,"code":2305},{"start":1445,"length":7,"code":2786,"category":1,"messageText":{"messageText":"'Loader2' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":2212,"length":9,"code":2786,"category":1,"messageText":{"messageText":"'Building2' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":2269,"length":5,"code":2322,"category":1,"messageText":{"messageText":"Type '{ icon: Element; label: string; value: any; }' is not assignable to type 'IntrinsicAttributes & StatsCardProps'.","category":1,"code":2322,"next":[{"messageText":"Property 'label' does not exist on type 'IntrinsicAttributes & StatsCardProps'.","category":1,"code":2339}]}},{"start":2378,"length":6,"code":2786,"category":1,"messageText":{"messageText":"'MapPin' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":2432,"length":5,"code":2322,"category":1,"messageText":{"messageText":"Type '{ icon: Element; label: string; value: any; }' is not assignable to type 'IntrinsicAttributes & StatsCardProps'.","category":1,"code":2322,"next":[{"messageText":"Property 'label' does not exist on type 'IntrinsicAttributes & StatsCardProps'.","category":1,"code":2339}]}},{"start":2549,"length":14,"code":2786,"category":1,"messageText":{"messageText":"'ClipboardCheck' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":2611,"length":5,"code":2322,"category":1,"messageText":{"messageText":"Type '{ icon: Element; label: string; value: any; }' is not assignable to type 'IntrinsicAttributes & StatsCardProps'.","category":1,"code":2322,"next":[{"messageText":"Property 'label' does not exist on type 'IntrinsicAttributes & StatsCardProps'.","category":1,"code":2339}]}},{"start":2724,"length":8,"code":2786,"category":1,"messageText":{"messageText":"'FileText' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":2852,"length":5,"code":2322,"category":1,"messageText":"Type 'string' is not assignable to type '{ value: number; isPositive: boolean; }'.","relatedInformation":[{"file":"./src/components/StatsCard.tsx","start":94,"length":5,"messageText":"The expected type comes from property 'trend' which is declared here on type 'IntrinsicAttributes & StatsCardProps'","category":3,"code":6500}]},{"start":3240,"length":19,"code":2786,"category":1,"messageText":{"messageText":"'ResponsiveContainer' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":3303,"length":8,"code":2786,"category":1,"messageText":{"messageText":"'BarChart' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":3442,"length":5,"code":2786,"category":1,"messageText":{"messageText":"'XAxis' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ComponentType' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ComponentClass' is not assignable to type 'ElementType'.","category":1,"code":2322,"next":[{"messageText":"Type 'ComponentClass' is not assignable to type 'new (props: any, deprecatedLegacyContext?: any) => Component'.","category":1,"code":2322,"next":[{"messageText":"Property 'refs' is missing in type 'Component' but required in type 'Component'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ComponentClass' is not assignable to type 'new (props: any, deprecatedLegacyContext?: any) => Component'."}}]}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":35462,"length":4,"messageText":"'refs' is declared here.","category":3,"code":2728}]},{"start":3513,"length":5,"code":2786,"category":1,"messageText":{"messageText":"'YAxis' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ComponentType' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ComponentClass' is not assignable to type 'ElementType'.","category":1,"code":2322,"next":[{"messageText":"Type 'ComponentClass' is not assignable to type 'new (props: any, deprecatedLegacyContext?: any) => Component'.","category":1,"code":2322,"next":[{"messageText":"Property 'refs' is missing in type 'Component' but required in type 'Component'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ComponentClass' is not assignable to type 'new (props: any, deprecatedLegacyContext?: any) => Component'."}}]}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":35462,"length":4,"messageText":"'refs' is declared here.","category":3,"code":2728}]},{"start":3799,"length":3,"code":2786,"category":1,"messageText":{"messageText":"'Bar' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ComponentType' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ComponentClass' is not assignable to type 'ElementType'.","category":1,"code":2322,"next":[{"messageText":"Type 'ComponentClass' is not assignable to type 'new (props: any, deprecatedLegacyContext?: any) => Component'.","category":1,"code":2322,"next":[{"messageText":"Property 'refs' is missing in type 'Component' but required in type 'Component'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ComponentClass' is not assignable to type 'new (props: any, deprecatedLegacyContext?: any) => Component'."}}]}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":35462,"length":4,"messageText":"'refs' is declared here.","category":3,"code":2728}]},{"start":5728,"length":9,"code":2786,"category":1,"messageText":{"messageText":"'Building2' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":6092,"length":6,"code":2786,"category":1,"messageText":{"messageText":"'MapPin' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":6455,"length":14,"code":2786,"category":1,"messageText":{"messageText":"'ClipboardCheck' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":6824,"length":8,"code":2786,"category":1,"messageText":{"messageText":"'FileText' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]}]],[923,[{"start":312,"length":16,"messageText":"Cannot find module '@/hooks/useApi' or its corresponding type declarations.","category":1,"code":2307},{"start":2758,"length":7,"code":2786,"category":1,"messageText":{"messageText":"'Loader2' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":3086,"length":9,"code":2786,"category":1,"messageText":{"messageText":"'ArrowLeft' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":7568,"length":6,"code":2786,"category":1,"messageText":{"messageText":"'Trash2' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":8209,"length":7,"code":2786,"category":1,"messageText":{"messageText":"'Loader2' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":8371,"length":4,"code":2786,"category":1,"messageText":{"messageText":"'Save' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]}]],[924,[{"start":232,"length":16,"messageText":"Cannot find module '@/hooks/useApi' or its corresponding type declarations.","category":1,"code":2307},{"start":259,"length":7,"messageText":"Module '\"@/types\"' has no exported member 'Empresa'.","category":1,"code":2305},{"start":2496,"length":9,"code":2786,"category":1,"messageText":{"messageText":"'Building2' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":2943,"length":6,"code":2786,"category":1,"messageText":{"messageText":"'MapPin' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":3367,"length":5,"code":2786,"category":1,"messageText":{"messageText":"'Phone' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":4623,"length":4,"code":2786,"category":1,"messageText":{"messageText":"'Plus' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":4811,"length":6,"code":2786,"category":1,"messageText":{"messageText":"'Search' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":5210,"length":7,"code":2322,"category":1,"messageText":{"messageText":"Type '{ key: string; label: string; render: (empresa: Empresa) => Element; }[]' is not assignable to type 'Column[]'.","category":1,"code":2322,"next":[{"messageText":"Property 'header' is missing in type '{ key: string; label: string; render: (empresa: Empresa) => JSX.Element; }' but required in type 'Column'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type '{ key: string; label: string; render: (empresa: Empresa) => JSX.Element; }' is not assignable to type 'Column'."}}]},"relatedInformation":[{"file":"./src/components/DataTable.tsx","start":105,"length":6,"messageText":"'header' is declared here.","category":3,"code":2728},{"file":"./src/components/DataTable.tsx","start":245,"length":7,"messageText":"The expected type comes from property 'columns' which is declared here on type 'IntrinsicAttributes & DataTableProps'","category":3,"code":6500}]},{"start":5312,"length":7,"messageText":"Parameter 'empresa' implicitly has an 'any' type.","category":1,"code":7006}]],[925,[{"start":239,"length":6,"code":2786,"category":1,"messageText":{"messageText":"'Shield' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":429,"length":3,"code":2786,"category":1,"messageText":{"messageText":"'Map' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":616,"length":8,"code":2786,"category":1,"messageText":{"messageText":"'FileText' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":791,"length":5,"code":2786,"category":1,"messageText":{"messageText":"'Link2' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":970,"length":9,"code":2786,"category":1,"messageText":{"messageText":"'BarChart3' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":1145,"length":5,"code":2786,"category":1,"messageText":{"messageText":"'Globe' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":2759,"length":4,"code":2786,"category":1,"messageText":{"messageText":"'Link' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":4753,"length":4,"code":2786,"category":1,"messageText":{"messageText":"'Link' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]}]],[926,[{"start":248,"length":17,"messageText":"Cannot find module '@/hooks/useAuth' or its corresponding type declarations.","category":1,"code":2307},{"start":1981,"length":4,"code":2786,"category":1,"messageText":{"messageText":"'Link' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":3727,"length":11,"code":2786,"category":1,"messageText":{"messageText":"'AlertCircle' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":4071,"length":7,"code":2786,"category":1,"messageText":{"messageText":"'Loader2' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":4326,"length":4,"code":2786,"category":1,"messageText":{"messageText":"'Link' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]}]],[927,[{"start":312,"length":16,"messageText":"Cannot find module '@/hooks/useApi' or its corresponding type declarations.","category":1,"code":2307},{"start":379,"length":7,"messageText":"Module '\"@/types\"' has no exported member 'Empresa'.","category":1,"code":2305},{"start":1471,"length":8,"code":2322,"category":1,"messageText":{"messageText":"Type 'Resolver<{ nome: string; empresa_id: unknown; area_total_ha: unknown; codigo_car?: string | undefined; latitude?: unknown; longitude?: unknown; cidade?: string | undefined; estado?: string | undefined; }, any, { nome: string; empresa_id: number; ... 5 more ...; estado?: string | undefined; }>' is not assignable to type 'Resolver<{ nome: string; empresa_id: number; area_total_ha: number; codigo_car?: string | undefined; latitude?: number | undefined; longitude?: number | undefined; cidade?: string | undefined; estado?: string | undefined; }, any, { ...; }>'.","category":1,"code":2322,"next":[{"messageText":"Types of parameters 'options' and 'options' are incompatible.","category":1,"code":2328,"next":[{"messageText":"Type 'ResolverOptions<{ nome: string; empresa_id: number; area_total_ha: number; codigo_car?: string | undefined; latitude?: number | undefined; longitude?: number | undefined; cidade?: string | undefined; estado?: string | undefined; }>' is not assignable to type 'ResolverOptions<{ nome: string; empresa_id: unknown; area_total_ha: unknown; codigo_car?: string | undefined; latitude?: unknown; longitude?: unknown; cidade?: string | undefined; estado?: string | undefined; }>'.","category":1,"code":2322,"next":[{"messageText":"Type 'unknown' is not assignable to type 'number'.","category":1,"code":2322,"canonicalHead":{"code":2322,"messageText":"Type '{ nome: string; empresa_id: unknown; area_total_ha: unknown; codigo_car?: string | undefined; latitude?: unknown; longitude?: unknown; cidade?: string | undefined; estado?: string | undefined; }' is not assignable to type '{ nome: string; empresa_id: number; area_total_ha: number; codigo_car?: string | undefined; latitude?: number | undefined; longitude?: number | undefined; cidade?: string | undefined; estado?: string | undefined; }'."}}]}]}]}},{"start":3335,"length":7,"code":2786,"category":1,"messageText":{"messageText":"'Loader2' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":3667,"length":9,"code":2786,"category":1,"messageText":{"messageText":"'ArrowLeft' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":4182,"length":8,"code":2345,"category":1,"messageText":{"messageText":"Argument of type '(data: PropriedadeFormData) => Promise' is not assignable to parameter of type 'SubmitHandler'.","category":1,"code":2345,"next":[{"messageText":"Types of parameters 'data' and 'data' are incompatible.","category":1,"code":2328,"next":[{"messageText":"Type 'TFieldValues' is not assignable to type '{ nome: string; empresa_id: number; area_total_ha: number; codigo_car?: string | undefined; latitude?: number | undefined; longitude?: number | undefined; cidade?: string | undefined; estado?: string | undefined; }'.","category":1,"code":2322,"next":[{"messageText":"Type 'FieldValues' is missing the following properties from type '{ nome: string; empresa_id: number; area_total_ha: number; codigo_car?: string | undefined; latitude?: number | undefined; longitude?: number | undefined; cidade?: string | undefined; estado?: string | undefined; }': nome, empresa_id, area_total_ha","category":1,"code":2739,"canonicalHead":{"code":2322,"messageText":"Type 'FieldValues' is not assignable to type '{ nome: string; empresa_id: number; area_total_ha: number; codigo_car?: string | undefined; latitude?: number | undefined; longitude?: number | undefined; cidade?: string | undefined; estado?: string | undefined; }'."}}]}]}]}},{"start":8097,"length":6,"code":2786,"category":1,"messageText":{"messageText":"'Trash2' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":8742,"length":7,"code":2786,"category":1,"messageText":{"messageText":"'Loader2' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":8904,"length":4,"code":2786,"category":1,"messageText":{"messageText":"'Save' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]}]],[928,[{"start":232,"length":16,"messageText":"Cannot find module '@/hooks/useApi' or its corresponding type declarations.","category":1,"code":2307},{"start":259,"length":11,"messageText":"Module '\"@/types\"' has no exported member 'Propriedade'.","category":1,"code":2305},{"start":2810,"length":6,"code":2786,"category":1,"messageText":{"messageText":"'MapPin' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":3264,"length":9,"code":2786,"category":1,"messageText":{"messageText":"'Building2' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":3738,"length":5,"code":2786,"category":1,"messageText":{"messageText":"'Ruler' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":4804,"length":4,"code":2786,"category":1,"messageText":{"messageText":"'Plus' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":4996,"length":6,"code":2786,"category":1,"messageText":{"messageText":"'Search' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":5402,"length":7,"code":2322,"category":1,"messageText":{"messageText":"Type '{ key: string; label: string; render: (prop: Propriedade) => Element; }[]' is not assignable to type 'Column[]'.","category":1,"code":2322,"next":[{"messageText":"Property 'header' is missing in type '{ key: string; label: string; render: (prop: Propriedade) => JSX.Element; }' but required in type 'Column'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type '{ key: string; label: string; render: (prop: Propriedade) => JSX.Element; }' is not assignable to type 'Column'."}}]},"relatedInformation":[{"file":"./src/components/DataTable.tsx","start":105,"length":6,"messageText":"'header' is declared here.","category":3,"code":2728},{"file":"./src/components/DataTable.tsx","start":245,"length":7,"messageText":"The expected type comes from property 'columns' which is declared here on type 'IntrinsicAttributes & DataTableProps'","category":3,"code":6500}]},{"start":5508,"length":4,"messageText":"Parameter 'prop' implicitly has an 'any' type.","category":1,"code":7006}]],[929,[{"start":235,"length":17,"messageText":"Cannot find module '@/hooks/useAuth' or its corresponding type declarations.","category":1,"code":2307},{"start":1874,"length":4,"code":2786,"category":1,"messageText":{"messageText":"'Link' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":4849,"length":11,"code":2786,"category":1,"messageText":{"messageText":"'AlertCircle' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":5193,"length":7,"code":2786,"category":1,"messageText":{"messageText":"'Loader2' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent & RefAttributes>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent & RefAttributes>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]},{"start":5458,"length":4,"code":2786,"category":1,"messageText":{"messageText":"'Link' cannot be used as a JSX component.","category":1,"code":2786,"next":[{"messageText":"Its type 'ForwardRefExoticComponent>' is not a valid JSX element type.","category":1,"code":18053,"next":[{"messageText":"Type 'ForwardRefExoticComponent>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'import(\"/home/kernelpanic/projetos_jarvis/duorigin-v2/frontend/node_modules/@types/react/index\").ReactNode' is not assignable to type 'React.ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Type 'ReactElement>' is not assignable to type 'ReactNode'.","category":1,"code":2322,"next":[{"messageText":"Property 'children' is missing in type 'ReactElement>' but required in type 'ReactPortal'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type 'ReactElement>' is not assignable to type 'ReactPortal'."}}]}],"canonicalHead":{"code":2322,"messageText":"Type 'ForwardRefExoticComponent>' is not assignable to type '(props: any, deprecatedLegacyContext?: any) => ReactNode'."}}]}]}]},"relatedInformation":[{"file":"./node_modules/@types/react/index.d.ts","start":12829,"length":8,"messageText":"'children' is declared here.","category":3,"code":2728}]}]],[930,[{"start":88,"length":30,"messageText":"Cannot find module '@/components/SessionProvider' or its corresponding type declarations.","category":1,"code":2307}]],[937,[{"start":143,"length":24,"messageText":"Cannot find module '@/components/RiskBadge' or its corresponding type declarations.","category":1,"code":2307},{"start":188,"length":22,"messageText":"Cannot find module '@/components/DDSCard' or its corresponding type declarations.","category":1,"code":2307},{"start":2058,"length":5,"code":2322,"category":1,"messageText":{"messageText":"Type '{ icon: string; label: string; value: number; }' is not assignable to type 'IntrinsicAttributes & StatsCardProps'.","category":1,"code":2322,"next":[{"messageText":"Property 'label' does not exist on type 'IntrinsicAttributes & StatsCardProps'.","category":1,"code":2339}]}},{"start":2140,"length":5,"code":2322,"category":1,"messageText":{"messageText":"Type '{ icon: string; label: string; value: number; }' is not assignable to type 'IntrinsicAttributes & StatsCardProps'.","category":1,"code":2322,"next":[{"messageText":"Property 'label' does not exist on type 'IntrinsicAttributes & StatsCardProps'.","category":1,"code":2339}]}},{"start":2222,"length":5,"code":2322,"category":1,"messageText":{"messageText":"Type '{ icon: string; label: string; value: number; }' is not assignable to type 'IntrinsicAttributes & StatsCardProps'.","category":1,"code":2322,"next":[{"messageText":"Property 'label' does not exist on type 'IntrinsicAttributes & StatsCardProps'.","category":1,"code":2339}]}},{"start":2304,"length":5,"code":2322,"category":1,"messageText":{"messageText":"Type '{ icon: string; label: string; value: number; }' is not assignable to type 'IntrinsicAttributes & StatsCardProps'.","category":1,"code":2322,"next":[{"messageText":"Property 'label' does not exist on type 'IntrinsicAttributes & StatsCardProps'.","category":1,"code":2339}]}},{"start":2375,"length":5,"code":2322,"category":1,"messageText":{"messageText":"Type '{ icon: string; label: string; value: number; }' is not assignable to type 'IntrinsicAttributes & StatsCardProps'.","category":1,"code":2322,"next":[{"messageText":"Property 'label' does not exist on type 'IntrinsicAttributes & StatsCardProps'.","category":1,"code":2339}]}},{"start":2490,"length":5,"code":2322,"category":1,"messageText":"Type 'string' is not assignable to type '{ value: number; isPositive: boolean; }'.","relatedInformation":[{"file":"./src/components/StatsCard.tsx","start":94,"length":5,"messageText":"The expected type comes from property 'trend' which is declared here on type 'IntrinsicAttributes & StatsCardProps'","category":3,"code":6500}]},{"start":2613,"length":5,"code":2322,"category":1,"messageText":{"messageText":"Type '{ icon: string; label: string; value: number; }' is not assignable to type 'IntrinsicAttributes & StatsCardProps'.","category":1,"code":2322,"next":[{"messageText":"Property 'label' does not exist on type 'IntrinsicAttributes & StatsCardProps'.","category":1,"code":2339}]}},{"start":2690,"length":5,"code":2322,"category":1,"messageText":{"messageText":"Type '{ icon: string; label: string; value: number; }' is not assignable to type 'IntrinsicAttributes & StatsCardProps'.","category":1,"code":2322,"next":[{"messageText":"Property 'label' does not exist on type 'IntrinsicAttributes & StatsCardProps'.","category":1,"code":2339}]}}]]],"affectedFilesPendingEmit":[440,478,447,456,445,443,444,446,448,453,452,470,471,469,467,468,476,477,475,473,474,472,457,458,460,461,459,479,442,441,462,463,465,466,464,449,450,454,455,451,649,506,654,664,665,666,653,667,668,663,669,670,510,511,651,797,923,924,925,926,927,928,929,512,504,515,936,937,935,518,517,519,603,605,606,607,608,611,610,609,613,612,614,616,617,615,619,618,621,620,623,622,625,624,627,626,629,628,631,630,930,938,931,639,644,634,638,640,635,646,645,642,636,632,641,643,633,637,647,602,604,516,648,435],"version":"5.9.3"} \ No newline at end of file