diff --git a/.github/workflows/jest_tests.yml b/.github/workflows/jest_tests.yml index fcca85f..531d512 100644 --- a/.github/workflows/jest_tests.yml +++ b/.github/workflows/jest_tests.yml @@ -7,7 +7,8 @@ on: - developer jobs: - test_frontend: + frontend-tests: + name: Frontend Tests runs-on: ubuntu-22.04 steps: @@ -19,6 +20,14 @@ jobs: with: node-version: '20.12.2' + - name: Cache Node.js modules + uses: actions/cache@v3 + with: + path: ./front/node_modules + key: ${{ runner.os }}-node-${{ hashFiles('**/front/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-node- + - name: Install dependencies working-directory: ./front run: npm install @@ -29,4 +38,37 @@ jobs: - name: Run tests working-directory: ./front + run: npm test + + backend-tests: + name: Backend Tests + runs-on: ubuntu-22.04 + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up Node.js + uses: actions/setup-node@v3 + with: + node-version: '20.12.2' + + - name: Cache Node.js modules + uses: actions/cache@v3 + with: + path: ./backend/node_modules + key: ${{ runner.os }}-node-${{ hashFiles('**/backend/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-node- + + - name: Install dependencies + working-directory: ./backend + run: npm install + + - name: Run Lint + working-directory: ./backend + run: npm run lint + + - name: Run tests + working-directory: ./backend run: npm test \ No newline at end of file diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 5eed213..63f0ae2 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -2,7 +2,7 @@ name: Run Scraper Monthly on: schedule: - - cron: "59 2 2 * *" + - cron: "0 0 1 * *" jobs: run-scraper: diff --git a/README.md b/README.md index 6b3ae97..9aa406d 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,43 @@ Através desta aplicação, buscamos oferecer uma maneira mais transparente e ac ## 🚀 Getting Started +### Pré-requisito + +- [Docker compose](https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository) + +### Clonar o repositório + +```bash +git clone https://github.com/unb-mds/2024-1-MinasDeCultura.git +``` + +### Acessar o repositório + +```bash +cd 2024-1-MinasDeCultura +``` + +### Configurar o arquivo .env + +O projeto depende de algumas variáveis de ambiente que precisam ser configuradas antes de iniciar os containers. No diretório backend do projeto , crie um arquivo .env com as seguintes variáveis, no caso do nosso projeto estamos usando um banco de dados no SUPABASE: + +```bash +SUPABASE_URL= +SUPABASE_KEY= +``` + +Iniciar os containers + +Após configurar o .env, você pode iniciar o projeto executando o comando abaixo. Este comando irá construir as imagens Docker necessárias e iniciar todos os serviços definidos no docker-compose.yml: + +```bash + + docker compose up +``` +### Acessar o projeto + +Depois que os containers estiverem em execução, você poderá acessar o projeto em http://localhost:3000. + ## ⚙️ Funcionalidades Previstas - **Coleta de Dados:** Implementação de um raspadores utilizando as ferramentas scrapy e selenium. diff --git a/backend/README.md b/backend/README.md index ede7b87..4985483 100644 --- a/backend/README.md +++ b/backend/README.md @@ -8,41 +8,32 @@ Esta API permite consultar informações relacionadas a licitações culturais d A API está localizada no diretório `backend/src/`, e é composta por três endpoints principais: -1. **/units** -2. **/cities** -3. **/tenders** +1. **/tenders** +2. **/tenders/year** ### **Endpoints** -#### **1. Listar Unidades Administrativas: `/units`** +#### **1. Consultar Licitações Mensais: `/tenders`** -- **Descrição:** Retorna uma lista de todas as unidades administrativas de Minas Gerais relacionadas à cultura. -- **URL:** `http://localhost:5000/units` +- **Descrição:** Retorna uma lista de licitações baseadas nos parâmetros de data inicial e final. +- **URL:** `http://localhost:5000/tenders?start=201501&end=201502` - **Método:** `GET` -- **Parâmetros:** Nenhum - -#### **2. Listar Cidades Disponíveis: `/cities`** - -- **Descrição:** Retorna uma lista das cidades de Minas Gerais que estão disponíveis para consulta no banco de dados. -- **URL:** `http://localhost:5000/cities` -- **Método:** `GET` -- **Parâmetros:** Nenhum +- **Parâmetros:** + - `start`: Representa o início do período de consulta no formato `AAAAMM` (ano/mês). Por exemplo, `201501` corresponde a janeiro de 2015. + - `end`: Representa o fim do período de consulta no formato `AAAAMM`. -#### **3. Consultar Licitações: `/tenders`** +#### **2. Consultar Licitações Anuais: `/tenders/year`** -- **Descrição:** Retorna uma lista de licitações baseadas nos parâmetros de data e cidade. -- **URL:** `http://localhost:5000/tenders?start=2401&end=2402&city=1` +- **Descrição:** Retorna os valores totais empenhados, liquidados e pagos no ano informado no parâmetro "year". +- **URL:** `http://localhost:5000/tenders/year?year=2024` - **Método:** `GET` - **Parâmetros:** - - `start`: Representa o início do período de consulta no formato `AAMM` (ano/mês). Por exemplo, `2401` corresponde a janeiro de 2024. - - `end`: Representa o fim do período de consulta no formato `AAMM`. - - `city`: ID da cidade conforme cadastrado na tabela de cidades. Por exemplo, `city=1` corresponde a Juiz de Fora e `city=2` a Montes Claros. + - `year`: Representa o ano de consulta no formato `AAAA` (ano). Por exemplo, `year=2024` retornará o total de licitações empenhadas, liquidadas e pagas no ano de 2024. + ### **Considerações Importantes** -- **Formato de Data:** No banco de dados, os anos são representados pelos dois últimos dígitos. Por exemplo, o ano 2024 é armazenado como `24`. - **Porta:** A API está configurada para rodar na porta `5000`. - --- Siga este guia para consultar e explorar as licitações culturais de Minas Gerais. Caso tenha dúvidas ou precise de suporte adicional, entre em contato com o time de desenvolvimento. \ No newline at end of file diff --git a/backend/eslint.config.mjs b/backend/eslint.config.mjs new file mode 100644 index 0000000..9ed00d3 --- /dev/null +++ b/backend/eslint.config.mjs @@ -0,0 +1,19 @@ +import globals from 'globals'; + +export default [ + { + files: ["**/*.{js,jsx,ts,tsx}"], + languageOptions: { + ecmaVersion: 2021, + sourceType: "module", + globals: { + ...globals.node, + ...globals.es2021, + }, + }, + rules: { + "no-unused-vars": "warn", + "no-console": "off" + } + } +]; diff --git a/backend/package-lock.json b/backend/package-lock.json index 960560b..1b1e78e 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -17,8 +17,12 @@ "pg": "^8.12.0" }, "devDependencies": { + "eslint": "^8.57.0", + "eslint-plugin-react": "^7.35.0", + "globals": "^15.9.0", "jest": "^29.7.0", - "supertest": "^7.0.0" + "supertest": "^7.0.0", + "typescript-eslint": "^8.3.0" } }, "node_modules/@ampproject/remapping": { @@ -650,6 +654,16 @@ } } }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/traverse/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -679,6 +693,203 @@ "dev": true, "license": "MIT" }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/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/@eslint/eslintrc/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, + "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/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, "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", @@ -1051,6 +1262,44 @@ "@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/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -1304,1150 +1553,2817 @@ "dev": true, "license": "MIT" }, - "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==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.3.0.tgz", + "integrity": "sha512-FLAIn63G5KH+adZosDYiutqkOkYEx0nvcwNNfJAf+c7Ae/H35qWwTYvPZUKFj5AS+WfHG/WJJfWnDnyNUlp8UA==", + "dev": true, "license": "MIT", "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.3.0", + "@typescript-eslint/type-utils": "8.3.0", + "@typescript-eslint/utils": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": ">= 0.6" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "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==", + "node_modules/@typescript-eslint/parser": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.3.0.tgz", + "integrity": "sha512-h53RhVyLu6AtpUzVCYLPhZGL5jzTD9fZL+SYf/+hYOx2bDkyQXztXSc4tbvKYHzfMXExMLiL9CWqJmVz6+78IQ==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "type-fest": "^0.21.3" + "@typescript-eslint/scope-manager": "8.3.0", + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/typescript-estree": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0", + "debug": "^4.3.4" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "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==", + "node_modules/@typescript-eslint/parser/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dev": true, "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, "engines": { - "node": ">=8" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "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==", + "node_modules/@typescript-eslint/parser/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.3.0.tgz", + "integrity": "sha512-mz2X8WcN2nVu5Hodku+IR8GgCOl4C0G/Z1ruaWN4dgec64kDBabuXyPAr+/RgJtumv8EEkqIzf3X2U5DUKB2eg==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "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==", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.3.0.tgz", + "integrity": "sha512-wrV6qh//nLbfXZQoj32EXKmwHf4b7L+xXLrP3FZ0GOUU72gSvLjeWUl5J5Ue5IwRxIV1TfF73j/eaBapxx99Lg==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "@typescript-eslint/typescript-estree": "8.3.0", + "@typescript-eslint/utils": "8.3.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": ">= 8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/@typescript-eslint/type-utils/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dev": true, "license": "MIT", "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "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" + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "node_modules/@typescript-eslint/type-utils/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true, "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==", + "node_modules/@typescript-eslint/types": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.3.0.tgz", + "integrity": "sha512-y6sSEeK+facMaAyixM36dQ5NVXTnKWunfD1Ft4xraYqxP0lC0POJmIaL/mw72CUMqjY9qfyVfXafMeaUj0noWw==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } }, - "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==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.3.0.tgz", + "integrity": "sha512-Mq7FTHl0R36EmWlCJWojIC1qn/ZWo2YiWYc1XVtasJ7FIgjo0MVv9rZWXEE7IK2CGrtwe1dVOxWwqXUdNgfRCA==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "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" + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "@babel/core": "^7.8.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "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==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "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" + "balanced-match": "^1.0.0" } }, - "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==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "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" + "ms": "2.1.2" }, "engines": { - "node": ">=8" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "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==", + "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": "MIT", + "license": "ISC", "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", - "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true, - "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" + "license": "MIT" + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "engines": { + "node": ">=10" } }, - "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==", + "node_modules/@typescript-eslint/utils": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.3.0.tgz", + "integrity": "sha512-F77WwqxIi/qGkIGOGXNBLV7nykwfjLsdauRB/DOFPdv6LTF3BHHkBpq81/b5iMPSF055oO2BiivDJV4ChvNtXA==", "dev": true, "license": "MIT", "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.3.0", + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/typescript-estree": "8.3.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "eslint": "^8.57.0 || ^9.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==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.3.0.tgz", + "integrity": "sha512-RmZwrTbQ9QveF15m/Cl28n0LXD6ea2CjkhH5rQ55ewz3H24w+AMCJHPVYaZ8/0HoG8Z3cLLFFycRXxeO2tz9FA==", "dev": true, - "license": "MIT" - }, - "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "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.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "@typescript-eslint/types": "8.3.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } + "license": "ISC" }, - "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, + "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": { - "fill-range": "^7.1.1" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "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": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" - }, "bin": { - "browserslist": "cli.js" + "acorn": "bin/acorn" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">=0.4.0" } }, - "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==", + "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": "Apache-2.0", - "dependencies": { - "node-int64": "^0.4.0" + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "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==", + "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" - }, - "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" + "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/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "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": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "type-fest": "^0.21.3" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "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": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001651", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", - "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==", - "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==", + "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": "MIT", + "license": "ISC", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">= 8" } }, - "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==", + "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", - "engines": { - "node": ">=10" + "dependencies": { + "sprintf-js": "~1.0.2" } }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/cjs-module-lexer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", - "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", - "dev": true, + "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/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==", + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "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==", + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/color-name": { + "node_modules/array.prototype.tosorted": { "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==", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, "license": "MIT", "dependencies": { - "delayed-stream": "~1.0.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" } }, - "node_modules/component-emitter": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", - "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true, "license": "MIT" }, - "node_modules/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==", + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, "license": "MIT", "dependencies": { - "safe-buffer": "5.2.1" + "possible-typed-array-names": "^1.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "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": ">= 0.6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" } }, - "node_modules/convert-source-map": { + "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-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.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "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" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "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.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "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.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "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": { + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "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-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "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.30001651", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", + "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/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/cjs-module-lexer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", + "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", + "dev": true, + "license": "MIT" + }, + "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/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.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/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.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/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/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/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "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/dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "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/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/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/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-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff-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/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.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/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.11", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.11.tgz", + "integrity": "sha512-R1CccCDYqndR25CaXFd6hp/u9RaaMcftMkphmvuepXr5b1vfLkRml6aWVeBhXJ7rbevHkKEMJtz8XqPf7ffmew==", + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", + "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "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": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "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/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.35.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz", + "integrity": "sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.19", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.0", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-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/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/eslint/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "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/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true, "license": "MIT" }, - "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "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/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "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/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.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/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/cookiejar": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "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.4" + }, + "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/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "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/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.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/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "license": "MIT", "dependencies": { - "object-assign": "^4", - "vary": "^1" + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" }, "engines": { - "node": ">= 0.10" + "node": ">= 0.8" } }, - "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==", + "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": { - "@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" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" }, "engines": { - "node": ">= 8" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, "license": "MIT", "dependencies": { - "ms": "2.0.0" + "is-callable": "^1.1.3" } }, - "node_modules/dedent": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", - "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, "license": "MIT", - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } + "engines": { + "node": ">= 6" } }, - "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==", + "node_modules/formidable": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.1.tgz", + "integrity": "sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==", "dev": true, "license": "MIT", + "dependencies": { + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "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==", + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "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": ">= 0.6" } }, - "node_modules/delayed-stream": { + "node_modules/fs": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", + "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==", + "license": "ISC" + }, + "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, + "hasInstallScript": true, "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=0.4.0" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "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", - "engines": { - "node": ">= 0.8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dezalgo": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", - "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "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": "ISC", - "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "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": "MIT", + "license": "ISC", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "6.* || 8.* || >= 10.*" } }, - "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", + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://dotenvx.com" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.11", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.11.tgz", - "integrity": "sha512-R1CccCDYqndR25CaXFd6hp/u9RaaMcftMkphmvuepXr5b1vfLkRml6aWVeBhXJ7rbevHkKEMJtz8XqPf7ffmew==", + "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": "ISC" + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "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/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "license": "MIT" + "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/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", + "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": ">= 0.8" + "node": ">=10.13.0" } }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/globals": { + "version": "15.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.9.0.tgz", + "integrity": "sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==", "dev": true, "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.4" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "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": "MIT", - "engines": { - "node": ">=6" - } + "license": "ISC" }, - "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==", + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, "license": "MIT" }, - "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==", + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/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" + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "license": "MIT", "dependencies": { - "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" + "has-symbols": "^1.0.3" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "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, + "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.8.0" + "node": ">= 0.4" } }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "node_modules/hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", "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": ">=8" } }, - "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "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.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "license": "MIT", "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "inherits": "2.0.4", "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { - "node": ">= 0.10.0" + "node": ">= 0.8" } }, - "node_modules/fast-json-stable-stringify": { + "node_modules/human-signals": { "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-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==", - "dev": true, - "license": "MIT" - }, - "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==", + "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", - "dependencies": { - "bser": "2.1.1" + "engines": { + "node": ">=10.17.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, + "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": { - "to-regex-range": "^5.0.1" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "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", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, "engines": { - "node": ">= 0.8" + "node": ">= 4" } }, - "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==", + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/form-data": { + "node_modules/import-fresh/node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, "engines": { - "node": ">= 6" + "node": ">=4" } }, - "node_modules/formidable": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.1.tgz", - "integrity": "sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==", + "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": { - "dezalgo": "^1.0.4", - "hexoid": "^1.0.0", - "once": "^1.4.0" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" }, "funding": { - "url": "https://ko-fi.com/tunnckoCore/commissions" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "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.6" + "node": ">=0.8.19" } }, - "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/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/fs": { - "version": "0.0.1-security", - "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", - "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==", + "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/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, - "license": "ISC" + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } }, - "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, + "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", - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">= 0.10" } }, - "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==", + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, "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==", + "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-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", "dev": true, "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, "engines": { - "node": ">=6.9.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -2456,106 +4372,144 @@ "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==", + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "license": "MIT", "engines": { - "node": ">=8.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/is-core-module": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", + "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", "dev": true, "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, - "license": "ISC", + "license": "MIT", "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" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": "*" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "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": ">=4" + "node": ">=0.10.0" } }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.3" + "call-bind": "^1.0.2" }, "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==", + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "license": "ISC" + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "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==", + "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": ">=8" + "node": ">=6" } }, - "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==", + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0" + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "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-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -2564,10 +4518,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -2576,86 +4531,94 @@ "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==", + "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-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, "license": "MIT", "dependencies": { - "function-bind": "^1.1.2" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hexoid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", - "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "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==", + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, - "license": "MIT" - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "engines": { - "node": ">=10.17.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "call-bind": "^1.0.7" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "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", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, "engines": { "node": ">=8" }, @@ -2663,58 +4626,30 @@ "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==", + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/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", + "has-tostringtag": "^1.0.0" + }, "engines": { - "node": ">= 0.10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-core-module": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", - "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "has-symbols": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -2723,49 +4658,72 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.14" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, "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==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2882,6 +4840,20 @@ "node": ">=8" } }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, "node_modules/jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", @@ -3512,6 +5484,13 @@ "node": ">=4" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "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", @@ -3519,6 +5498,20 @@ "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", @@ -3532,6 +5525,32 @@ "node": ">=6" } }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "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", @@ -3552,6 +5571,20 @@ "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/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -3572,6 +5605,26 @@ "node": ">=8" } }, + "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/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -3643,6 +5696,16 @@ "dev": true, "license": "MIT" }, + "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/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -3802,6 +5865,87 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -3840,6 +5984,24 @@ "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/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -3895,6 +6057,19 @@ "node": ">=6" } }, + "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", @@ -4098,6 +6273,16 @@ "node": ">=8" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postgres-array": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", @@ -4137,6 +6322,16 @@ "node": ">=0.10.0" } }, + "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/pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", @@ -4179,6 +6374,25 @@ "node": ">= 6" } }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -4192,6 +6406,16 @@ "node": ">= 0.10" } }, + "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", @@ -4224,6 +6448,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -4255,6 +6500,47 @@ "dev": true, "license": "MIT" }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -4313,7 +6599,78 @@ "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/safe-buffer": { @@ -4336,6 +6693,24 @@ ], "license": "MIT" }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -4414,6 +6789,22 @@ "node": ">= 0.4" } }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -4573,6 +6964,96 @@ "node": ">=8" } }, + "node_modules/string.prototype.matchall": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -4733,6 +7214,13 @@ "node": ">=8" } }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -4772,6 +7260,32 @@ "node": ">=0.6" } }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.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/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -4808,6 +7322,138 @@ "node": ">= 0.6" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.3.0.tgz", + "integrity": "sha512-EvWjwWLwwKDIJuBjk2I6UkV8KEQcwZ0VM10nR1rIunRDIP67QJTZAHBXTX0HW/oI1H10YESF8yWie8fRQxjvFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.3.0", + "@typescript-eslint/parser": "8.3.0", + "@typescript-eslint/utils": "8.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/undici-types": { "version": "6.19.6", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.6.tgz", @@ -4854,6 +7500,16 @@ "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/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -4913,6 +7569,99 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", + "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", + "dev": true, + "license": "MIT", + "dependencies": { + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", diff --git a/backend/package.json b/backend/package.json index 65dcbd7..fa76ccd 100644 --- a/backend/package.json +++ b/backend/package.json @@ -3,7 +3,8 @@ "version": "1.0.0", "main": "index.js", "scripts": { - "test": "jest --passWithNoTests" + "test": "jest --passWithNoTests", + "lint": "eslint ." }, "keywords": [], "author": "", @@ -18,7 +19,11 @@ "pg": "^8.12.0" }, "devDependencies": { + "eslint": "^8.57.0", + "eslint-plugin-react": "^7.35.0", + "globals": "^15.9.0", "jest": "^29.7.0", - "supertest": "^7.0.0" + "supertest": "^7.0.0", + "typescript-eslint": "^8.3.0" } } diff --git a/backend/raspadores/Selenium_transparencia/transparencia.py "b/backend/raspadores/Selenium_transparencia/portal_transpar\303\252ncia_ano.py" similarity index 96% rename from backend/raspadores/Selenium_transparencia/transparencia.py rename to "backend/raspadores/Selenium_transparencia/portal_transpar\303\252ncia_ano.py" index c11f213..69fbf0d 100644 --- a/backend/raspadores/Selenium_transparencia/transparencia.py +++ "b/backend/raspadores/Selenium_transparencia/portal_transpar\303\252ncia_ano.py" @@ -47,7 +47,7 @@ dados = [] # Loop para selecionar o ano de 2005 até o ano atual (2024) - for ano in range(2005, 2025): + for ano in range(2002, 2025): # Encontra o dropdown pelo ID e cria um objeto Select select_ano = Select(driver.find_element(By.ID, "jform_ano")) @@ -122,7 +122,7 @@ driver.execute_script("window.scrollBy(0, 500);") # Aguarda os dados da tabela serem carregados - time.sleep(5) + time.sleep(2) # Extrai dados da tabela tabela_linhas = driver.find_elements(By.CSS_SELECTOR, "tr.odd") @@ -130,7 +130,7 @@ for linha in tabela_linhas: cols = linha.find_elements(By.TAG_NAME, "td") dados.append({ - "Órgão": cols[0].text, + "orgao": cols[0].text, "Valor Empenhado": cols[1].text, "Valor Liquidado": cols[2].text, "Valor Pago": cols[3].text, @@ -138,10 +138,10 @@ }) # Espera antes de continuar o loop (ajuste conforme necessário) - time.sleep(8) + time.sleep(2) # Salva os dados em um arquivo JSON no diretório de trabalho - caminho_arquivo_json = os.path.join(working_dir, 'resultado.json') + caminho_arquivo_json = os.path.join(working_dir, 'selenium_portal_transparencia_anos.json') with open(caminho_arquivo_json, 'w') as arquivo_json: json.dump(dados, arquivo_json, indent=4, ensure_ascii=False) diff --git "a/backend/raspadores/Selenium_transparencia/portal_transpar\303\252ncia_busca_espec\303\255fica.py" "b/backend/raspadores/Selenium_transparencia/portal_transpar\303\252ncia_busca_espec\303\255fica.py" new file mode 100644 index 0000000..0d159ca --- /dev/null +++ "b/backend/raspadores/Selenium_transparencia/portal_transpar\303\252ncia_busca_espec\303\255fica.py" @@ -0,0 +1,213 @@ +import time +import os +import json +import argparse +from selenium import webdriver +from selenium.webdriver.chrome.service import Service +from selenium.webdriver.common.by import By +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC +from selenium.common.exceptions import StaleElementReferenceException, NoSuchElementException + +# Configurações do navegador Chrome +options = webdriver.ChromeOptions() +prefs = { + "download.default_directory": os.getcwd(), # Diretório de download configurado para o mesmo diretório do script + "download.prompt_for_download": False, + "download.directory_upgrade": True, + "safebrowsing.enabled": True +} +options.add_experimental_option("prefs", prefs) + +# Inicializa o Chrome WebDriver com as opções definidas +service = Service() +driver = webdriver.Chrome(service=service, options=options) + +# Configuração dos argumentos de linha de comando +parser = argparse.ArgumentParser(description="Script para acessar o portal de transparência e raspar dados") +parser.add_argument('--ano', type=int, required=True, help="Ano desejado no formato YYYY") +parser.add_argument('--mes', type=str, required=True, help="Número do mês desejado no formato MM (ex: 01, 02, etc.)") +args = parser.parse_args() + +# URL a ser acessada +url = f'https://www.transparencia.mg.gov.br/despesa-estado/despesa/despesa-orgaos/{args.ano}/01-01-{args.ano}/31-12-{args.ano}/4538' +driver.get(url) + +# Mapeamento de números para nomes de meses +numeros_meses = { + "01": "Janeiro", + "02": "Fevereiro", + "03": "Março", + "04": "Abril", + "05": "Maio", + "06": "Junho", + "07": "Julho", + "08": "Agosto", + "09": "Setembro", + "10": "Outubro", + "11": "Novembro", + "12": "Dezembro" +} + +def obter_mes_ano_atual(driver): + return driver.find_element(By.CLASS_NAME, "ui-datepicker-title").text + +def selecionar_mes_ano(driver, mes_num, ano): + mes_nome = numeros_meses[mes_num] + + # Tenta avançar para o final da esquerda + for _ in range(12): # Limite de 12 tentativas para evitar loops infinitos + mes_ano_texto = obter_mes_ano_atual(driver) + + if f"{mes_nome}" in mes_ano_texto and f"{ano}" in mes_ano_texto: + return + + try: + mes_ano_antes = mes_ano_texto + driver.find_element(By.CLASS_NAME, "ui-datepicker-next").click() + time.sleep(1) + mes_ano_depois = obter_mes_ano_atual(driver) + + if mes_ano_antes == mes_ano_depois: + raise Exception("Mês não mudou ao tentar ir para a esquerda.") + + except Exception as e: + print(f"Erro ao tentar ir para a esquerda: {e}. Tentando para a direita.") + break # Saia do loop e tente para a direita + + # Caso não encontre o mês, tenta avançar para o final da direita + for _ in range(12): + mes_ano_texto = obter_mes_ano_atual(driver) + + if f"{mes_nome}" in mes_ano_texto and f"{ano}" in mes_ano_texto: + return + + try: + mes_ano_antes = mes_ano_texto + driver.find_element(By.CLASS_NAME, "ui-datepicker-prev").click() + time.sleep(1) + mes_ano_depois = obter_mes_ano_atual(driver) + + if mes_ano_antes == mes_ano_depois: + raise Exception("Mês não mudou ao tentar ir para a direita.") + + except Exception as e: + print(f"Erro ao tentar ir para a direita: {e}. Tentando para a esquerda.") + break # Saia do loop e tente para a esquerda novamente + +try: + WebDriverWait(driver, 10).until( + EC.presence_of_element_located((By.CSS_SELECTOR, "a.btn.btn-red")) + ) + + botao_pesquisa_avancada = driver.find_element(By.CSS_SELECTOR, "a.btn.btn-red") + botao_pesquisa_avancada.click() + + WebDriverWait(driver, 10).until( + EC.presence_of_element_located((By.ID, "jform_ano")) + ) + dados = [] + ano = args.ano + mes_num = args.mes + + select_ano = driver.find_element(By.ID, "jform_ano") + select_ano.click() + select_ano.find_element(By.XPATH, f"//option[@value='{ano}']").click() + + campo_fim = driver.find_element(By.ID, "jform_datafim") + campo_fim.click() + time.sleep(2) + + selecionar_mes_ano(driver, mes_num, ano) + + try: + driver.find_element(By.XPATH, "//a[text()='31']").click() + except NoSuchElementException: + driver.find_elements(By.XPATH, "//td[@data-handler='selectDay']/a")[-1].click() + + campo_inicio = driver.find_element(By.ID, "jform_datainicio") + campo_inicio.click() + time.sleep(2) + + selecionar_mes_ano(driver, mes_num, ano) + + dia_1_link = driver.find_element(By.XPATH, "//td[not(contains(@class, 'ui-datepicker-other-month'))]//a[text()='1']") + driver.execute_script("arguments[0].click();", dia_1_link) + + WebDriverWait(driver, 10).until( + EC.presence_of_element_located((By.ID, "jform_ID_ORGAO_chosen")) + ) + campo_de_entrada = driver.find_element(By.ID, "jform_ID_ORGAO_chosen") + time.sleep(2) + campo_de_entrada.click() + + WebDriverWait(driver, 10).until( + EC.visibility_of_element_located((By.CLASS_NAME, "chosen-drop")) + ) + + try: + opcao_cultura = driver.find_element(By.XPATH, "//ul[contains(@class, 'chosen-results')]//li[contains(text(), 'Secretaria De Estado De Cultura')]") + opcao_cultura.click() + except StaleElementReferenceException: + WebDriverWait(driver, 10).until( + EC.visibility_of_element_located((By.CLASS_NAME, "chosen-drop")) + ) + opcao_cultura = driver.find_element(By.XPATH, "//ul[contains(@class, 'chosen-results')]//li[contains(text(), 'Secretaria De Estado De Cultura')]") + opcao_cultura.click() + + try: + WebDriverWait(driver, 10).until( + EC.visibility_of_element_located((By.ID, "jform_check__orgao")) + ) + checkbox = driver.find_element(By.ID, "jform_check__orgao") + + driver.execute_script("arguments[0].scrollIntoView(true);", checkbox) + if not checkbox.is_selected(): + checkbox.click() + except StaleElementReferenceException: + WebDriverWait(driver, 10).until( + EC.visibility_of_element_located((By.ID, "jform_check__orgao")) + ) + checkbox = driver.find_element(By.ID, "jform_check__orgao") + + driver.execute_script("arguments[0].scrollIntoView(true);", checkbox) + if not checkbox.is_selected(): + checkbox.click() + + try: + botao_pesquisar = driver.find_element(By.CSS_SELECTOR, "button.btn.btn-red") + botao_pesquisar.click() + except StaleElementReferenceException: + WebDriverWait(driver, 10).until( + EC.presence_of_element_located((By.CSS_SELECTOR, "button.btn.btn-red")) + ) + botao_pesquisar = driver.find_element(By.CSS_SELECTOR, "button.btn.btn-red") + botao_pesquisar.click() + + WebDriverWait(driver, 10).until( + EC.presence_of_element_located((By.CSS_SELECTOR, "table")) + ) + + driver.execute_script("window.scrollBy(0, 500);") + time.sleep(2) + + tabela_linhas = driver.find_elements(By.CSS_SELECTOR, "tr.odd") + + for linha in tabela_linhas: + cols = linha.find_elements(By.TAG_NAME, "td") + dados.append({ + "orgao": cols[0].text, + "Valor Empenhado": cols[1].text, + "Valor Liquidado": cols[2].text, + "Valor Pago": cols[3].text, + "Ano": str(ano), + "Mes": mes_num # Agora usamos o número do mês diretamente + }) + + time.sleep(2) + caminho_arquivo_json = os.path.join(os.getcwd(), 'selenium_portal_transparencia_.json') + with open(caminho_arquivo_json, 'a') as arquivo_json: + json.dump(dados, arquivo_json, indent=4, ensure_ascii=False) + +finally: + driver.quit() diff --git "a/backend/raspadores/Selenium_transparencia/portal_transpar\303\252ncia_m\303\252s.py" "b/backend/raspadores/Selenium_transparencia/portal_transpar\303\252ncia_m\303\252s.py" new file mode 100644 index 0000000..9374692 --- /dev/null +++ "b/backend/raspadores/Selenium_transparencia/portal_transpar\303\252ncia_m\303\252s.py" @@ -0,0 +1,207 @@ +import time +import os +import json +from selenium import webdriver +from selenium.webdriver.chrome.service import Service +from selenium.webdriver.common.by import By +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC +from selenium.common.exceptions import StaleElementReferenceException, NoSuchElementException + +# Configurações do navegador Chrome +options = webdriver.ChromeOptions() +prefs = { + "download.default_directory": os.getcwd(), # Diretório de download configurado para o mesmo diretório do script + "download.prompt_for_download": False, + "download.directory_upgrade": True, + "safebrowsing.enabled": True +} +options.add_experimental_option("prefs", prefs) + +# Inicializa o Chrome WebDriver com as opções definidas +service = Service() +driver = webdriver.Chrome(service=service, options=options) + +# URL a ser acessada +url = 'https://www.transparencia.mg.gov.br/despesa-estado/despesa/despesa-orgaos/2024/01-01-2024/31-12-2024/4538' +driver.get(url) + +# Mapeamento de meses para números +meses_numeros = { + "Janeiro": "01", + "Fevereiro": "02", + "Março": "03", + "Abril": "04", + "Maio": "05", + "Junho": "06", + "Julho": "07", + "Agosto": "08", + "Setembro": "09", + "Outubro": "10", + "Novembro": "11", + "Dezembro": "12" +} + +def obter_mes_ano_atual(driver): + return driver.find_element(By.CLASS_NAME, "ui-datepicker-title").text + +def selecionar_mes_ano(driver, mes_nome, ano): + # Tenta avançar para o final da esquerda + for _ in range(12): # Limite de 12 tentativas para evitar loops infinitos + mes_ano_texto = obter_mes_ano_atual(driver) + + if f"{mes_nome}" in mes_ano_texto and f"{ano}" in mes_ano_texto: + return + + try: + mes_ano_antes = mes_ano_texto + driver.find_element(By.CLASS_NAME, "ui-datepicker-next").click() + time.sleep(1) + mes_ano_depois = obter_mes_ano_atual(driver) + + if mes_ano_antes == mes_ano_depois: + raise Exception("Mês não mudou ao tentar ir para a esquerda.") + + except Exception as e: + print(f"Erro ao tentar ir para a esquerda: {e}. Tentando para a direita.") + break # Saia do loop e tente para a direita + + # Caso não encontre o mês, tenta avançar para o final da direita + for _ in range(12): + mes_ano_texto = obter_mes_ano_atual(driver) + + if f"{mes_nome}" in mes_ano_texto and f"{ano}" in mes_ano_texto: + return + + try: + mes_ano_antes = mes_ano_texto + driver.find_element(By.CLASS_NAME, "ui-datepicker-prev").click() + time.sleep(1) + mes_ano_depois = obter_mes_ano_atual(driver) + + if mes_ano_antes == mes_ano_depois: + raise Exception("Mês não mudou ao tentar ir para a direita.") + + except Exception as e: + print(f"Erro ao tentar ir para a direita: {e}. Tentando para a esquerda.") + break # Saia do loop e tente para a esquerda novamente + +try: + WebDriverWait(driver, 10).until( + EC.presence_of_element_located((By.CSS_SELECTOR, "a.btn.btn-red")) + ) + + botao_pesquisa_avancada = driver.find_element(By.CSS_SELECTOR, "a.btn.btn-red") + botao_pesquisa_avancada.click() + + WebDriverWait(driver, 10).until( + EC.presence_of_element_located((By.ID, "jform_ano")) + ) + dados = [] + + for ano in range(2002, 2025): + select_ano = driver.find_element(By.ID, "jform_ano") + select_ano.click() + select_ano.find_element(By.XPATH, f"//option[@value='{ano}']").click() + + for mes_nome in meses_numeros.keys(): + campo_fim = driver.find_element(By.ID, "jform_datafim") + campo_fim.click() + time.sleep(2) + + selecionar_mes_ano(driver, mes_nome, ano) + + try: + driver.find_element(By.XPATH, "//a[text()='31']").click() + except NoSuchElementException: + driver.find_elements(By.XPATH, "//td[@data-handler='selectDay']/a")[-1].click() + + campo_inicio = driver.find_element(By.ID, "jform_datainicio") + campo_inicio.click() + time.sleep(2) + + selecionar_mes_ano(driver, mes_nome, ano) + + dia_1_link = driver.find_element(By.XPATH, "//td[not(contains(@class, 'ui-datepicker-other-month'))]//a[text()='1']") + driver.execute_script("arguments[0].click();", dia_1_link) + + if mes_nome == "Janeiro": + WebDriverWait(driver, 10).until( + EC.presence_of_element_located((By.ID, "jform_ID_ORGAO_chosen")) + ) + campo_de_entrada = driver.find_element(By.ID, "jform_ID_ORGAO_chosen") + time.sleep(2) + campo_de_entrada.click() + + WebDriverWait(driver, 10).until( + EC.visibility_of_element_located((By.CLASS_NAME, "chosen-drop")) + ) + + try: + opcao_cultura = driver.find_element(By.XPATH, "//ul[contains(@class, 'chosen-results')]//li[contains(text(), 'Secretaria De Estado De Cultura')]") + opcao_cultura.click() + except StaleElementReferenceException: + WebDriverWait(driver, 10).until( + EC.visibility_of_element_located((By.CLASS_NAME, "chosen-drop")) + ) + opcao_cultura = driver.find_element(By.XPATH, "//ul[contains(@class, 'chosen-results')]//li[contains(text(), 'Secretaria De Estado De Cultura')]") + opcao_cultura.click() + + try: + WebDriverWait(driver, 10).until( + EC.visibility_of_element_located((By.ID, "jform_check__orgao")) + ) + checkbox = driver.find_element(By.ID, "jform_check__orgao") + + driver.execute_script("arguments[0].scrollIntoView(true);", checkbox) + if not checkbox.is_selected(): + checkbox.click() + except StaleElementReferenceException: + WebDriverWait(driver, 10).until( + EC.visibility_of_element_located((By.ID, "jform_check__orgao")) + ) + checkbox = driver.find_element(By.ID, "jform_check__orgao") + + driver.execute_script("arguments[0].scrollIntoView(true);", checkbox) + if not checkbox.is_selected(): + checkbox.click() + + try: + botao_pesquisar = driver.find_element(By.CSS_SELECTOR, "button.btn.btn-red") + botao_pesquisar.click() + except StaleElementReferenceException: + WebDriverWait(driver, 10).until( + EC.presence_of_element_located((By.CSS_SELECTOR, "button.btn.btn-red")) + ) + botao_pesquisar = driver.find_element(By.CSS_SELECTOR, "button.btn.btn-red") + botao_pesquisar.click() + + WebDriverWait(driver, 10).until( + EC.presence_of_element_located((By.CSS_SELECTOR, "table")) + ) + + driver.execute_script("window.scrollBy(0, 500);") + time.sleep(2) + + tabela_linhas = driver.find_elements(By.CSS_SELECTOR, "tr.odd") + + for linha in tabela_linhas: + cols = linha.find_elements(By.TAG_NAME, "td") + dados.append({ + "orgao": cols[0].text, + "Valor Empenhado": cols[1].text, + "Valor Liquidado": cols[2].text, + "Valor Pago": cols[3].text, + "Ano": str(ano), + "Mes": meses_numeros[mes_nome] # Substitui o nome do mês pelo número correspondente + }) + + time.sleep(2) + caminho_arquivo_json = os.path.join(os.getcwd(), 'selenium_portal_transparencia_meses.json') + with open(caminho_arquivo_json, 'w') as arquivo_json: + json.dump(dados, arquivo_json, indent=4, ensure_ascii=False) + + + +finally: + driver.quit() diff --git a/backend/raspadores/Selenium_transparencia/resultado.json b/backend/raspadores/Selenium_transparencia/selenium_portal_transparencia_anos.json similarity index 84% rename from backend/raspadores/Selenium_transparencia/resultado.json rename to backend/raspadores/Selenium_transparencia/selenium_portal_transparencia_anos.json index 1b88e43..6cc4c78 100644 --- a/backend/raspadores/Selenium_transparencia/resultado.json +++ b/backend/raspadores/Selenium_transparencia/selenium_portal_transparencia_anos.json @@ -1,4 +1,25 @@ [ + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "12.393.520,76", + "Valor Liquidado": "12.256.568,78", + "Valor Pago": "11.631.714,36", + "Ano": "2002" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "11.330.370,08", + "Valor Liquidado": "11.328.156,86", + "Valor Pago": "11.060.012,21", + "Ano": "2003" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "8.561.824,17", + "Valor Liquidado": "8.488.209,37", + "Valor Pago": "8.299.818,13", + "Ano": "2004" + }, { "orgao": "SECRETARIA DE ESTADO DE CULTURA", "Valor Empenhado": "11.836.724,34", @@ -134,9 +155,9 @@ }, { "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", - "Valor Empenhado": "219.325.565,07", - "Valor Liquidado": "204.456.362,49", - "Valor Pago": "202.236.778,42", + "Valor Empenhado": "221.040.326,09", + "Valor Liquidado": "205.473.411,30", + "Valor Pago": "203.449.438,78", "Ano": "2024" } ] \ No newline at end of file diff --git a/backend/raspadores/Selenium_transparencia/selenium_portal_transparencia_meses.json b/backend/raspadores/Selenium_transparencia/selenium_portal_transparencia_meses.json new file mode 100644 index 0000000..dfc7f90 --- /dev/null +++ b/backend/raspadores/Selenium_transparencia/selenium_portal_transparencia_meses.json @@ -0,0 +1,2178 @@ +[ + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "164.939,18", + "Valor Liquidado": "129.005,21", + "Valor Pago": "41.891,44", + "Ano": "2002", + "Mes": "01" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "948.202,60", + "Valor Liquidado": "899.760,26", + "Valor Pago": "908.854,33", + "Ano": "2002", + "Mes": "02" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "888.187,51", + "Valor Liquidado": "900.843,28", + "Valor Pago": "842.069,96", + "Ano": "2002", + "Mes": "03" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.583.819,60", + "Valor Liquidado": "1.575.475,99", + "Valor Pago": "1.522.126,36", + "Ano": "2002", + "Mes": "04" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "950.225,52", + "Valor Liquidado": "945.882,27", + "Valor Pago": "918.061,07", + "Ano": "2002", + "Mes": "05" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "925.060,54", + "Valor Liquidado": "925.501,16", + "Valor Pago": "846.495,59", + "Ano": "2002", + "Mes": "06" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.037.634,62", + "Valor Liquidado": "982.603,17", + "Valor Pago": "1.008.233,29", + "Ano": "2002", + "Mes": "07" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "957.166,68", + "Valor Liquidado": "963.055,00", + "Valor Pago": "923.966,35", + "Ano": "2002", + "Mes": "08" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.008.024,92", + "Valor Liquidado": "1.017.007,11", + "Valor Pago": "953.027,98", + "Ano": "2002", + "Mes": "09" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.036.696,64", + "Valor Liquidado": "1.040.669,35", + "Valor Pago": "982.407,48", + "Ano": "2002", + "Mes": "10" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.218.447,47", + "Valor Liquidado": "997.240,66", + "Valor Pago": "786.720,34", + "Ano": "2002", + "Mes": "11" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.675.115,48", + "Valor Liquidado": "1.879.525,32", + "Valor Pago": "1.897.860,17", + "Ano": "2002", + "Mes": "12" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "836.163,29", + "Valor Liquidado": "836.146,01", + "Valor Pago": "707.091,73", + "Ano": "2003", + "Mes": "01" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "751.830,41", + "Valor Liquidado": "751.522,13", + "Valor Pago": "850.727,06", + "Ano": "2003", + "Mes": "02" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "954.309,19", + "Valor Liquidado": "953.046,83", + "Valor Pago": "928.210,94", + "Ano": "2003", + "Mes": "03" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "874.424,35", + "Valor Liquidado": "873.533,05", + "Valor Pago": "796.227,48", + "Ano": "2003", + "Mes": "04" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "880.989,83", + "Valor Liquidado": "880.232,88", + "Valor Pago": "854.075,77", + "Ano": "2003", + "Mes": "05" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "242.721,34", + "Valor Liquidado": "238.430,23", + "Valor Pago": "163.373,81", + "Ano": "2003", + "Mes": "06" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.691.126,26", + "Valor Liquidado": "1.690.438,99", + "Valor Pago": "1.684.906,96", + "Ano": "2003", + "Mes": "07" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "895.963,45", + "Valor Liquidado": "891.601,55", + "Valor Pago": "890.477,18", + "Ano": "2003", + "Mes": "08" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "907.284,71", + "Valor Liquidado": "909.931,07", + "Valor Pago": "873.657,63", + "Ano": "2003", + "Mes": "09" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "198.809,56", + "Valor Liquidado": "198.103,91", + "Valor Pago": "197.407,12", + "Ano": "2003", + "Mes": "10" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "864.232,89", + "Valor Liquidado": "871.108,27", + "Valor Pago": "857.573,39", + "Ano": "2003", + "Mes": "11" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "2.232.514,80", + "Valor Liquidado": "2.234.061,94", + "Valor Pago": "2.256.283,14", + "Ano": "2003", + "Mes": "12" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "112.204,10", + "Valor Liquidado": "100.248,83", + "Valor Pago": "989,29", + "Ano": "2004", + "Mes": "01" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "574.445,07", + "Valor Liquidado": "496.240,34", + "Valor Pago": "551.881,45", + "Ano": "2004", + "Mes": "02" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "956.941,79", + "Valor Liquidado": "1.019.945,94", + "Valor Pago": "965.341,64", + "Ano": "2004", + "Mes": "03" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "577.676,68", + "Valor Liquidado": "576.522,52", + "Valor Pago": "560.572,61", + "Ano": "2004", + "Mes": "04" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "801.529,59", + "Valor Liquidado": "779.257,53", + "Valor Pago": "633.763,32", + "Ano": "2004", + "Mes": "05" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "684.910,77", + "Valor Liquidado": "213.682,67", + "Valor Pago": "349.330,17", + "Ano": "2004", + "Mes": "06" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "967.333,99", + "Valor Liquidado": "1.459.687,38", + "Valor Pago": "1.477.053,96", + "Ano": "2004", + "Mes": "07" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "632.737,60", + "Valor Liquidado": "565.619,83", + "Valor Pago": "554.155,39", + "Ano": "2004", + "Mes": "08" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "615.031,53", + "Valor Liquidado": "593.073,14", + "Valor Pago": "580.472,08", + "Ano": "2004", + "Mes": "09" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "634.144,47", + "Valor Liquidado": "621.318,65", + "Valor Pago": "607.907,48", + "Ano": "2004", + "Mes": "10" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "975.920,27", + "Valor Liquidado": "1.005.966,50", + "Valor Pago": "989.699,49", + "Ano": "2004", + "Mes": "11" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.028.948,31", + "Valor Liquidado": "1.056.646,04", + "Valor Pago": "1.028.651,25", + "Ano": "2004", + "Mes": "12" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "173.838,90", + "Valor Liquidado": "126.377,98", + "Valor Pago": "12.200,22", + "Ano": "2005", + "Mes": "01" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "963.963,67", + "Valor Liquidado": "962.780,93", + "Valor Pago": "921.432,14", + "Ano": "2005", + "Mes": "02" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "618.807,27", + "Valor Liquidado": "612.645,24", + "Valor Pago": "725.536,96", + "Ano": "2005", + "Mes": "03" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "608.967,56", + "Valor Liquidado": "591.132,51", + "Valor Pago": "562.900,60", + "Ano": "2005", + "Mes": "04" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "600.602,23", + "Valor Liquidado": "570.180,33", + "Valor Pago": "571.789,38", + "Ano": "2005", + "Mes": "05" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "606.548,55", + "Valor Liquidado": "571.196,30", + "Valor Pago": "551.471,49", + "Ano": "2005", + "Mes": "06" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "777.615,14", + "Valor Liquidado": "793.372,77", + "Valor Pago": "777.667,49", + "Ano": "2005", + "Mes": "07" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "701.622,50", + "Valor Liquidado": "751.396,44", + "Valor Pago": "735.084,45", + "Ano": "2005", + "Mes": "08" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "896.874,72", + "Valor Liquidado": "815.305,26", + "Valor Pago": "799.627,13", + "Ano": "2005", + "Mes": "09" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.669.012,62", + "Valor Liquidado": "799.040,53", + "Valor Pago": "760.350,16", + "Ano": "2005", + "Mes": "10" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.560.483,51", + "Valor Liquidado": "1.020.100,77", + "Valor Pago": "1.017.049,20", + "Ano": "2005", + "Mes": "11" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "2.658.387,67", + "Valor Liquidado": "3.081.732,24", + "Valor Pago": "2.682.508,39", + "Ano": "2005", + "Mes": "12" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "713.881,27", + "Valor Liquidado": "576.905,07", + "Valor Pago": "560.057,55", + "Ano": "2006", + "Mes": "01" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "717.925,80", + "Valor Liquidado": "634.844,08", + "Valor Pago": "617.271,50", + "Ano": "2006", + "Mes": "02" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "674.330,05", + "Valor Liquidado": "766.863,32", + "Valor Pago": "739.702,66", + "Ano": "2006", + "Mes": "03" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.052.357,62", + "Valor Liquidado": "766.183,01", + "Valor Pago": "750.247,43", + "Ano": "2006", + "Mes": "04" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "2.469.018,84", + "Valor Liquidado": "1.244.367,16", + "Valor Pago": "1.213.742,79", + "Ano": "2006", + "Mes": "05" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.916.613,51", + "Valor Liquidado": "2.078.877,77", + "Valor Pago": "2.040.052,59", + "Ano": "2006", + "Mes": "06" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.086.236,51", + "Valor Liquidado": "1.555.253,24", + "Valor Pago": "1.261.533,14", + "Ano": "2006", + "Mes": "07" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "2.592.835,55", + "Valor Liquidado": "1.379.606,00", + "Valor Pago": "1.561.003,82", + "Ano": "2006", + "Mes": "08" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.011.767,09", + "Valor Liquidado": "1.194.510,75", + "Valor Pago": "1.063.595,39", + "Ano": "2006", + "Mes": "09" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.815.928,94", + "Valor Liquidado": "3.226.482,11", + "Valor Pago": "3.363.359,70", + "Ano": "2006", + "Mes": "10" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.694.992,54", + "Valor Liquidado": "1.495.427,84", + "Valor Pago": "1.475.201,13", + "Ano": "2006", + "Mes": "11" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.955.686,54", + "Valor Liquidado": "2.045.065,18", + "Valor Pago": "1.968.811,66", + "Ano": "2006", + "Mes": "12" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "294.620,54", + "Valor Liquidado": "205.534,82", + "Valor Pago": "183.548,78", + "Ano": "2007", + "Mes": "01" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.376.706,90", + "Valor Liquidado": "1.337.177,08", + "Valor Pago": "1.197.395,85", + "Ano": "2007", + "Mes": "02" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "842.935,90", + "Valor Liquidado": "781.579,33", + "Valor Pago": "876.106,34", + "Ano": "2007", + "Mes": "03" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "933.303,23", + "Valor Liquidado": "964.232,05", + "Valor Pago": "942.672,19", + "Ano": "2007", + "Mes": "04" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.101.730,86", + "Valor Liquidado": "1.030.297,20", + "Valor Pago": "1.007.960,92", + "Ano": "2007", + "Mes": "05" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.022.222,43", + "Valor Liquidado": "1.032.856,75", + "Valor Pago": "979.422,87", + "Ano": "2007", + "Mes": "06" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "937.951,96", + "Valor Liquidado": "963.009,94", + "Valor Pago": "972.844,14", + "Ano": "2007", + "Mes": "07" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.392.871,65", + "Valor Liquidado": "1.047.031,24", + "Valor Pago": "1.024.452,44", + "Ano": "2007", + "Mes": "08" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.586.549,39", + "Valor Liquidado": "1.477.623,71", + "Valor Pago": "1.455.175,83", + "Ano": "2007", + "Mes": "09" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.391.882,13", + "Valor Liquidado": "1.631.110,22", + "Valor Pago": "1.608.630,11", + "Ano": "2007", + "Mes": "10" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "3.147.450,49", + "Valor Liquidado": "2.269.062,68", + "Valor Pago": "2.225.294,51", + "Ano": "2007", + "Mes": "11" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "2.838.818,50", + "Valor Liquidado": "3.217.437,38", + "Valor Pago": "3.110.118,20", + "Ano": "2007", + "Mes": "12" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.023.451,84", + "Valor Liquidado": "877.510,08", + "Valor Pago": "857.398,89", + "Ano": "2008", + "Mes": "01" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.238.298,45", + "Valor Liquidado": "1.217.767,66", + "Valor Pago": "1.191.822,53", + "Ano": "2008", + "Mes": "02" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.045.471,99", + "Valor Liquidado": "1.037.637,61", + "Valor Pago": "1.011.550,01", + "Ano": "2008", + "Mes": "03" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.079.603,37", + "Valor Liquidado": "1.064.974,90", + "Valor Pago": "1.038.548,59", + "Ano": "2008", + "Mes": "04" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.371.851,33", + "Valor Liquidado": "1.077.517,77", + "Valor Pago": "1.042.595,12", + "Ano": "2008", + "Mes": "05" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.979.380,09", + "Valor Liquidado": "2.049.265,22", + "Valor Pago": "2.008.021,91", + "Ano": "2008", + "Mes": "06" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "2.592.535,57", + "Valor Liquidado": "2.216.213,21", + "Valor Pago": "2.108.561,11", + "Ano": "2008", + "Mes": "07" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.161.058,30", + "Valor Liquidado": "1.387.675,48", + "Valor Pago": "1.391.777,67", + "Ano": "2008", + "Mes": "08" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.355.827,75", + "Valor Liquidado": "1.131.371,71", + "Valor Pago": "1.095.419,37", + "Ano": "2008", + "Mes": "09" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.404.690,30", + "Valor Liquidado": "1.243.058,49", + "Valor Pago": "1.146.035,64", + "Ano": "2008", + "Mes": "10" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "3.332.100,52", + "Valor Liquidado": "2.160.421,09", + "Valor Pago": "2.148.557,13", + "Ano": "2008", + "Mes": "11" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "4.522.300,73", + "Valor Liquidado": "5.403.447,39", + "Valor Pago": "5.341.564,22", + "Ano": "2008", + "Mes": "12" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.052.340,85", + "Valor Liquidado": "812.427,32", + "Valor Pago": "789.320,02", + "Ano": "2009", + "Mes": "01" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.112.111,53", + "Valor Liquidado": "901.154,26", + "Valor Pago": "893.494,96", + "Ano": "2009", + "Mes": "02" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.290.657,79", + "Valor Liquidado": "1.094.325,29", + "Valor Pago": "1.066.946,90", + "Ano": "2009", + "Mes": "03" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "2.388.269,34", + "Valor Liquidado": "2.421.460,28", + "Valor Pago": "2.386.761,79", + "Ano": "2009", + "Mes": "04" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "2.672.426,70", + "Valor Liquidado": "2.479.030,10", + "Valor Pago": "2.444.101,53", + "Ano": "2009", + "Mes": "05" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.816.561,47", + "Valor Liquidado": "1.649.986,42", + "Valor Pago": "1.419.485,16", + "Ano": "2009", + "Mes": "06" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.714.381,87", + "Valor Liquidado": "2.141.905,66", + "Valor Pago": "2.214.022,86", + "Ano": "2009", + "Mes": "07" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.447.755,47", + "Valor Liquidado": "1.233.114,99", + "Valor Pago": "1.226.718,11", + "Ano": "2009", + "Mes": "08" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.806.511,51", + "Valor Liquidado": "1.987.826,23", + "Valor Pago": "1.705.226,01", + "Ano": "2009", + "Mes": "09" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "2.020.007,36", + "Valor Liquidado": "1.819.433,55", + "Valor Pago": "2.036.305,04", + "Ano": "2009", + "Mes": "10" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "2.427.488,24", + "Valor Liquidado": "1.916.906,62", + "Valor Pago": "1.884.425,29", + "Ano": "2009", + "Mes": "11" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "4.785.006,06", + "Valor Liquidado": "4.146.238,24", + "Valor Pago": "2.962.588,24", + "Ano": "2009", + "Mes": "12" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "3.338.593,42", + "Valor Liquidado": "2.899.851,55", + "Valor Pago": "2.897.801,71", + "Ano": "2010", + "Mes": "01" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.114.863,01", + "Valor Liquidado": "980.276,63", + "Valor Pago": "955.501,01", + "Ano": "2010", + "Mes": "02" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.435.481,28", + "Valor Liquidado": "1.665.393,37", + "Valor Pago": "1.343.657,12", + "Ano": "2010", + "Mes": "03" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "909.456,52", + "Valor Liquidado": "977.080,54", + "Valor Pago": "1.228.164,64", + "Ano": "2010", + "Mes": "04" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "2.650.225,55", + "Valor Liquidado": "2.412.337,39", + "Valor Pago": "2.376.680,37", + "Ano": "2010", + "Mes": "05" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "8.288.761,13", + "Valor Liquidado": "7.755.735,03", + "Valor Pago": "7.603.270,86", + "Ano": "2010", + "Mes": "06" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.498.729,01", + "Valor Liquidado": "2.000.527,69", + "Valor Pago": "1.936.312,34", + "Ano": "2010", + "Mes": "07" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.415.580,31", + "Valor Liquidado": "1.364.728,02", + "Valor Pago": "1.401.239,01", + "Ano": "2010", + "Mes": "08" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "2.113.495,83", + "Valor Liquidado": "1.411.628,96", + "Valor Pago": "1.368.345,19", + "Ano": "2010", + "Mes": "09" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "715.575,58", + "Valor Liquidado": "1.111.851,40", + "Valor Pago": "1.087.069,11", + "Ano": "2010", + "Mes": "10" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "2.685.198,44", + "Valor Liquidado": "2.906.231,48", + "Valor Pago": "2.873.930,37", + "Ano": "2010", + "Mes": "11" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "981.242,92", + "Valor Liquidado": "1.512.902,54", + "Valor Pago": "1.568.424,67", + "Ano": "2010", + "Mes": "12" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "818.064,57", + "Valor Liquidado": "714.056,21", + "Valor Pago": "713.890,59", + "Ano": "2011", + "Mes": "01" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.322.909,13", + "Valor Liquidado": "994.555,03", + "Valor Pago": "969.154,68", + "Ano": "2011", + "Mes": "02" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "3.973.326,79", + "Valor Liquidado": "4.055.393,08", + "Valor Pago": "3.657.331,74", + "Ano": "2011", + "Mes": "03" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "2.174.870,28", + "Valor Liquidado": "2.138.781,66", + "Valor Pago": "2.399.100,37", + "Ano": "2011", + "Mes": "04" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "2.246.579,46", + "Valor Liquidado": "2.140.370,25", + "Valor Pago": "2.152.176,13", + "Ano": "2011", + "Mes": "05" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "3.736.503,20", + "Valor Liquidado": "3.436.013,28", + "Valor Pago": "3.410.699,70", + "Ano": "2011", + "Mes": "06" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "2.531.066,92", + "Valor Liquidado": "2.459.508,11", + "Valor Pago": "2.420.978,85", + "Ano": "2011", + "Mes": "07" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "2.401.504,27", + "Valor Liquidado": "2.774.318,83", + "Valor Pago": "2.719.024,94", + "Ano": "2011", + "Mes": "08" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "6.105.010,49", + "Valor Liquidado": "5.528.336,35", + "Valor Pago": "5.508.344,09", + "Ano": "2011", + "Mes": "09" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.862.129,65", + "Valor Liquidado": "1.654.149,31", + "Valor Pago": "1.623.452,87", + "Ano": "2011", + "Mes": "10" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "3.821.712,74", + "Valor Liquidado": "3.386.482,73", + "Valor Pago": "3.352.890,59", + "Ano": "2011", + "Mes": "11" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "6.254.139,61", + "Valor Liquidado": "4.856.059,98", + "Valor Pago": "4.273.324,69", + "Ano": "2011", + "Mes": "12" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.020.944,54", + "Valor Liquidado": "801.155,54", + "Valor Pago": "801.155,54", + "Ano": "2012", + "Mes": "01" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.533.376,71", + "Valor Liquidado": "1.146.951,91", + "Valor Pago": "1.091.741,89", + "Ano": "2012", + "Mes": "02" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "12.555.891,66", + "Valor Liquidado": "11.496.951,98", + "Valor Pago": "11.367.192,51", + "Ano": "2012", + "Mes": "03" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.287.948,09", + "Valor Liquidado": "1.977.700,86", + "Valor Pago": "2.002.484,93", + "Ano": "2012", + "Mes": "04" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "2.712.788,68", + "Valor Liquidado": "3.119.462,68", + "Valor Pago": "3.031.364,19", + "Ano": "2012", + "Mes": "05" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "6.513.743,64", + "Valor Liquidado": "4.453.661,97", + "Valor Pago": "4.443.980,64", + "Ano": "2012", + "Mes": "06" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "8.796.433,15", + "Valor Liquidado": "8.689.578,19", + "Valor Pago": "4.291.073,58", + "Ano": "2012", + "Mes": "07" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.984.697,88", + "Valor Liquidado": "1.941.266,00", + "Valor Pago": "2.930.237,60", + "Ano": "2012", + "Mes": "08" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "3.913.926,75", + "Valor Liquidado": "3.789.119,31", + "Valor Pago": "6.158.416,29", + "Ano": "2012", + "Mes": "09" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.936.589,25", + "Valor Liquidado": "2.500.572,07", + "Valor Pago": "1.986.095,53", + "Ano": "2012", + "Mes": "10" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "6.334.065,04", + "Valor Liquidado": "5.102.360,42", + "Valor Pago": "6.305.837,59", + "Ano": "2012", + "Mes": "11" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "9.107.896,24", + "Valor Liquidado": "7.827.633,03", + "Valor Pago": "7.297.110,50", + "Ano": "2012", + "Mes": "12" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.618.447,29", + "Valor Liquidado": "816.370,55", + "Valor Pago": "816.338,82", + "Ano": "2013", + "Mes": "01" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "2.759.575,38", + "Valor Liquidado": "1.358.787,62", + "Valor Pago": "1.317.138,20", + "Ano": "2013", + "Mes": "02" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "17.941.278,56", + "Valor Liquidado": "17.848.752,26", + "Valor Pago": "4.639.273,14", + "Ano": "2013", + "Mes": "03" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "2.632.612,19", + "Valor Liquidado": "2.633.024,01", + "Valor Pago": "5.313.954,15", + "Ano": "2013", + "Mes": "04" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "2.372.948,28", + "Valor Liquidado": "2.569.696,21", + "Valor Pago": "4.163.438,09", + "Ano": "2013", + "Mes": "05" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "4.162.851,20", + "Valor Liquidado": "2.432.112,58", + "Valor Pago": "4.533.120,49", + "Ano": "2013", + "Mes": "06" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "3.774.119,84", + "Valor Liquidado": "2.753.204,07", + "Valor Pago": "3.713.954,65", + "Ano": "2013", + "Mes": "07" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "4.188.079,88", + "Valor Liquidado": "4.007.038,94", + "Valor Pago": "5.347.110,28", + "Ano": "2013", + "Mes": "08" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "10.129.202,68", + "Valor Liquidado": "7.492.643,44", + "Valor Pago": "7.431.383,87", + "Ano": "2013", + "Mes": "09" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "3.498.656,50", + "Valor Liquidado": "2.854.197,21", + "Valor Pago": "4.545.712,21", + "Ano": "2013", + "Mes": "10" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "3.510.374,12", + "Valor Liquidado": "4.530.030,99", + "Valor Pago": "5.875.571,91", + "Ano": "2013", + "Mes": "11" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "11.391.960,29", + "Valor Liquidado": "14.225.044,73", + "Valor Pago": "14.752.037,80", + "Ano": "2013", + "Mes": "12" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "2.575.963,66", + "Valor Liquidado": "826.502,67", + "Valor Pago": "826.184,13", + "Ano": "2014", + "Mes": "01" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "10.866.804,23", + "Valor Liquidado": "4.473.449,68", + "Valor Pago": "4.090.647,61", + "Ano": "2014", + "Mes": "02" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "3.815.119,87", + "Valor Liquidado": "4.944.369,83", + "Valor Pago": "3.734.902,54", + "Ano": "2014", + "Mes": "03" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "2.078.526,13", + "Valor Liquidado": "6.039.944,85", + "Valor Pago": "6.633.752,88", + "Ano": "2014", + "Mes": "04" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "4.718.867,80", + "Valor Liquidado": "4.331.717,92", + "Valor Pago": "4.784.467,98", + "Ano": "2014", + "Mes": "05" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "7.537.870,53", + "Valor Liquidado": "5.879.216,23", + "Valor Pago": "5.999.282,48", + "Ano": "2014", + "Mes": "06" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "3.072.262,59", + "Valor Liquidado": "5.023.716,47", + "Valor Pago": "4.129.548,26", + "Ano": "2014", + "Mes": "07" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.407.383,50", + "Valor Liquidado": "1.533.242,69", + "Valor Pago": "2.193.576,13", + "Ano": "2014", + "Mes": "08" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "10.820.227,63", + "Valor Liquidado": "5.006.841,54", + "Valor Pago": "4.618.550,38", + "Ano": "2014", + "Mes": "09" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.825.656,17", + "Valor Liquidado": "5.948.478,32", + "Valor Pago": "5.906.903,42", + "Ano": "2014", + "Mes": "10" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "-141.007,18", + "Valor Liquidado": "4.211.854,25", + "Valor Pago": "4.106.254,77", + "Ano": "2014", + "Mes": "11" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "6.268.551,70", + "Valor Liquidado": "5.962.593,99", + "Valor Pago": "6.387.114,11", + "Ano": "2014", + "Mes": "12" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.471.728,13", + "Valor Liquidado": "944.697,37", + "Valor Pago": "944.697,37", + "Ano": "2015", + "Mes": "01" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.725.665,87", + "Valor Liquidado": "1.554.405,25", + "Valor Pago": "1.408.175,15", + "Ano": "2015", + "Mes": "02" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "3.299.716,02", + "Valor Liquidado": "2.839.916,38", + "Valor Pago": "2.654.155,03", + "Ano": "2015", + "Mes": "03" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "7.611.223,30", + "Valor Liquidado": "3.162.726,02", + "Valor Pago": "3.333.658,79", + "Ano": "2015", + "Mes": "04" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.832.076,33", + "Valor Liquidado": "3.492.965,20", + "Valor Pago": "3.455.074,44", + "Ano": "2015", + "Mes": "05" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "9.157.433,42", + "Valor Liquidado": "10.257.613,44", + "Valor Pago": "8.319.138,88", + "Ano": "2015", + "Mes": "06" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "9.734.359,08", + "Valor Liquidado": "5.708.520,36", + "Valor Pago": "3.299.735,96", + "Ano": "2015", + "Mes": "07" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "2.423.149,10", + "Valor Liquidado": "3.961.796,14", + "Valor Pago": "6.128.633,37", + "Ano": "2015", + "Mes": "08" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "2.074.990,02", + "Valor Liquidado": "3.894.687,39", + "Valor Pago": "3.706.943,60", + "Ano": "2015", + "Mes": "09" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "7.997.856,59", + "Valor Liquidado": "6.073.418,89", + "Valor Pago": "5.515.996,55", + "Ano": "2015", + "Mes": "10" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "5.736.057,75", + "Valor Liquidado": "4.381.408,79", + "Valor Pago": "4.899.838,68", + "Ano": "2015", + "Mes": "11" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "7.871.030,31", + "Valor Liquidado": "12.393.960,61", + "Valor Pago": "11.560.781,09", + "Ano": "2015", + "Mes": "12" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.319.547,12", + "Valor Liquidado": "885.902,07", + "Valor Pago": "885.902,07", + "Ano": "2016", + "Mes": "01" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "2.911.460,33", + "Valor Liquidado": "2.674.506,71", + "Valor Pago": "2.228.741,84", + "Ano": "2016", + "Mes": "02" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "4.214.648,18", + "Valor Liquidado": "3.309.220,05", + "Valor Pago": "2.804.667,77", + "Ano": "2016", + "Mes": "03" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "3.652.153,70", + "Valor Liquidado": "3.498.338,73", + "Valor Pago": "3.902.437,44", + "Ano": "2016", + "Mes": "04" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "3.084.702,05", + "Valor Liquidado": "3.397.502,58", + "Valor Pago": "3.088.482,10", + "Ano": "2016", + "Mes": "05" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "4.598.149,00", + "Valor Liquidado": "4.789.009,08", + "Valor Pago": "4.231.439,31", + "Ano": "2016", + "Mes": "06" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "4.093.652,12", + "Valor Liquidado": "3.721.287,71", + "Valor Pago": "2.650.822,75", + "Ano": "2016", + "Mes": "07" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "3.184.749,50", + "Valor Liquidado": "2.771.805,16", + "Valor Pago": "1.561.264,74", + "Ano": "2016", + "Mes": "08" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "3.431.602,03", + "Valor Liquidado": "3.313.665,46", + "Valor Pago": "3.201.955,93", + "Ano": "2016", + "Mes": "09" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "8.222.443,88", + "Valor Liquidado": "3.324.901,40", + "Valor Pago": "3.723.496,50", + "Ano": "2016", + "Mes": "10" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "2.551.330,84", + "Valor Liquidado": "4.140.202,23", + "Valor Pago": "3.399.160,89", + "Ano": "2016", + "Mes": "11" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "3.916.472,66", + "Valor Liquidado": "5.014.183,38", + "Valor Pago": "5.145.732,06", + "Ano": "2016", + "Mes": "12" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.055.993,48", + "Valor Liquidado": "906.267,00", + "Valor Pago": "906.267,00", + "Ano": "2017", + "Mes": "01" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "4.517.204,51", + "Valor Liquidado": "2.048.423,56", + "Valor Pago": "1.899.482,42", + "Ano": "2017", + "Mes": "02" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "4.447.829,29", + "Valor Liquidado": "3.207.812,41", + "Valor Pago": "3.195.822,03", + "Ano": "2017", + "Mes": "03" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "3.013.448,21", + "Valor Liquidado": "3.030.632,31", + "Valor Pago": "1.336.795,28", + "Ano": "2017", + "Mes": "04" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.743.235,48", + "Valor Liquidado": "3.455.947,60", + "Valor Pago": "4.315.945,10", + "Ano": "2017", + "Mes": "05" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "7.818.474,74", + "Valor Liquidado": "5.201.281,31", + "Valor Pago": "4.121.257,95", + "Ano": "2017", + "Mes": "06" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "3.824.055,89", + "Valor Liquidado": "5.524.745,81", + "Valor Pago": "4.591.658,02", + "Ano": "2017", + "Mes": "07" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "3.306.059,70", + "Valor Liquidado": "3.402.768,80", + "Valor Pago": "3.360.494,44", + "Ano": "2017", + "Mes": "08" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.616.230,71", + "Valor Liquidado": "1.672.823,26", + "Valor Pago": "1.872.140,25", + "Ano": "2017", + "Mes": "09" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "6.322.205,43", + "Valor Liquidado": "6.475.131,88", + "Valor Pago": "3.768.429,42", + "Ano": "2017", + "Mes": "10" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "8.418.309,82", + "Valor Liquidado": "7.599.859,42", + "Valor Pago": "3.489.313,07", + "Ano": "2017", + "Mes": "11" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "6.976.026,87", + "Valor Liquidado": "8.354.746,12", + "Valor Pago": "7.635.328,57", + "Ano": "2017", + "Mes": "12" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "915.426,83", + "Valor Liquidado": "915.426,83", + "Valor Pago": "915.426,83", + "Ano": "2018", + "Mes": "01" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "7.552.246,27", + "Valor Liquidado": "1.513.588,64", + "Valor Pago": "939.810,45", + "Ano": "2018", + "Mes": "02" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "1.438.808,14", + "Valor Liquidado": "6.730.693,75", + "Valor Pago": "1.894.056,04", + "Ano": "2018", + "Mes": "03" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "3.068.747,15", + "Valor Liquidado": "1.818.884,44", + "Valor Pago": "943.367,60", + "Ano": "2018", + "Mes": "04" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "6.567.155,80", + "Valor Liquidado": "1.887.523,17", + "Valor Pago": "1.851.872,62", + "Ano": "2018", + "Mes": "05" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "3.538.679,54", + "Valor Liquidado": "7.850.473,65", + "Valor Pago": "2.863.843,86", + "Ano": "2018", + "Mes": "06" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "5.266.237,54", + "Valor Liquidado": "3.442.571,13", + "Valor Pago": "5.868.735,97", + "Ano": "2018", + "Mes": "07" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "7.193.966,85", + "Valor Liquidado": "1.716.340,84", + "Valor Pago": "3.460.319,76", + "Ano": "2018", + "Mes": "08" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "2.432.949,41", + "Valor Liquidado": "7.245.750,19", + "Valor Pago": "4.744.639,22", + "Ano": "2018", + "Mes": "09" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "5.095.878,78", + "Valor Liquidado": "2.419.586,27", + "Valor Pago": "3.904.546,51", + "Ano": "2018", + "Mes": "10" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "4.262.692,70", + "Valor Liquidado": "7.130.941,46", + "Valor Pago": "3.454.135,27", + "Ano": "2018", + "Mes": "11" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA", + "Valor Empenhado": "2.359.099,16", + "Valor Liquidado": "2.281.317,11", + "Valor Pago": "10.132.446,25", + "Ano": "2018", + "Mes": "12" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "1.308.100,03", + "Valor Liquidado": "736.886,32", + "Valor Pago": "736.886,32", + "Ano": "2019", + "Mes": "01" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "1.546.449,50", + "Valor Liquidado": "1.071.742,93", + "Valor Pago": "772.849,69", + "Ano": "2019", + "Mes": "02" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "1.629.400,13", + "Valor Liquidado": "1.569.235,38", + "Valor Pago": "1.447.071,15", + "Ano": "2019", + "Mes": "03" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "4.168.074,82", + "Valor Liquidado": "2.673.625,41", + "Valor Pago": "2.547.625,60", + "Ano": "2019", + "Mes": "04" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "7.121.512,47", + "Valor Liquidado": "8.528.834,80", + "Valor Pago": "3.226.683,05", + "Ano": "2019", + "Mes": "05" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "1.931.802,69", + "Valor Liquidado": "1.335.209,04", + "Valor Pago": "2.647.597,82", + "Ano": "2019", + "Mes": "06" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "1.480.870,12", + "Valor Liquidado": "1.409.111,89", + "Valor Pago": "2.706.006,88", + "Ano": "2019", + "Mes": "07" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "6.989.202,43", + "Valor Liquidado": "6.810.173,94", + "Valor Pago": "3.200.665,60", + "Ano": "2019", + "Mes": "08" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "2.951.427,12", + "Valor Liquidado": "1.452.484,30", + "Valor Pago": "2.968.788,09", + "Ano": "2019", + "Mes": "09" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "2.892.179,00", + "Valor Liquidado": "1.781.910,22", + "Valor Pago": "4.921.186,83", + "Ano": "2019", + "Mes": "10" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "6.661.526,53", + "Valor Liquidado": "3.926.506,86", + "Valor Pago": "3.610.171,89", + "Ano": "2019", + "Mes": "11" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "4.934.504,27", + "Valor Liquidado": "10.863.299,20", + "Valor Pago": "9.853.637,72", + "Ano": "2019", + "Mes": "12" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "1.032.143,15", + "Valor Liquidado": "257.736,57", + "Valor Pago": "257.736,57", + "Ano": "2020", + "Mes": "01" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "9.130.567,65", + "Valor Liquidado": "4.331.490,51", + "Valor Pago": "4.280.532,07", + "Ano": "2020", + "Mes": "02" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "7.839.890,69", + "Valor Liquidado": "4.277.437,47", + "Valor Pago": "4.015.395,22", + "Ano": "2020", + "Mes": "03" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "2.172.692,46", + "Valor Liquidado": "3.879.876,76", + "Valor Pago": "3.211.222,24", + "Ano": "2020", + "Mes": "04" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "3.427.475,04", + "Valor Liquidado": "3.967.610,65", + "Valor Pago": "4.679.685,22", + "Ano": "2020", + "Mes": "05" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "2.572.814,07", + "Valor Liquidado": "3.271.477,38", + "Valor Pago": "3.235.404,16", + "Ano": "2020", + "Mes": "06" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "2.355.192,17", + "Valor Liquidado": "2.927.851,64", + "Valor Pago": "2.471.369,94", + "Ano": "2020", + "Mes": "07" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "6.470.963,01", + "Valor Liquidado": "7.239.955,54", + "Valor Pago": "3.334.983,19", + "Ano": "2020", + "Mes": "08" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "2.296.188,90", + "Valor Liquidado": "2.409.438,07", + "Valor Pago": "4.513.222,59", + "Ano": "2020", + "Mes": "09" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "1.873.077,87", + "Valor Liquidado": "2.391.184,29", + "Valor Pago": "3.987.288,83", + "Ano": "2020", + "Mes": "10" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "8.239.893,38", + "Valor Liquidado": "8.159.600,02", + "Valor Pago": "3.913.843,71", + "Ano": "2020", + "Mes": "11" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "154.590.522,54", + "Valor Liquidado": "71.602.252,73", + "Valor Pago": "36.423.994,35", + "Ano": "2020", + "Mes": "12" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "2.642.364,10", + "Valor Liquidado": "1.986.748,47", + "Valor Pago": "1.986.407,60", + "Ano": "2021", + "Mes": "01" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "12.155.414,43", + "Valor Liquidado": "6.549.024,91", + "Valor Pago": "2.084.531,30", + "Ano": "2021", + "Mes": "02" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "4.063.894,98", + "Valor Liquidado": "4.677.239,80", + "Valor Pago": "6.059.629,95", + "Ano": "2021", + "Mes": "03" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "2.298.894,41", + "Valor Liquidado": "2.726.403,80", + "Valor Pago": "4.759.461,90", + "Ano": "2021", + "Mes": "04" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "6.443.469,48", + "Valor Liquidado": "7.032.828,37", + "Valor Pago": "4.247.997,57", + "Ano": "2021", + "Mes": "05" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "2.091.784,58", + "Valor Liquidado": "2.646.688,22", + "Valor Pago": "4.247.595,78", + "Ano": "2021", + "Mes": "06" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "5.176.973,56", + "Valor Liquidado": "5.559.865,57", + "Valor Pago": "4.240.212,22", + "Ano": "2021", + "Mes": "07" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "8.435.969,93", + "Valor Liquidado": "9.285.183,59", + "Valor Pago": "6.019.675,82", + "Ano": "2021", + "Mes": "08" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "17.547.454,61", + "Valor Liquidado": "15.109.867,91", + "Valor Pago": "4.754.497,56", + "Ano": "2021", + "Mes": "09" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "6.055.962,28", + "Valor Liquidado": "2.739.178,53", + "Valor Pago": "6.563.704,24", + "Ano": "2021", + "Mes": "10" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "14.230.668,57", + "Valor Liquidado": "16.982.899,10", + "Valor Pago": "6.831.791,66", + "Ano": "2021", + "Mes": "11" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "11.398.629,86", + "Valor Liquidado": "11.179.835,07", + "Valor Pago": "16.872.832,76", + "Ano": "2021", + "Mes": "12" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "2.899.862,70", + "Valor Liquidado": "2.133.533,92", + "Valor Pago": "2.133.533,92", + "Ano": "2022", + "Mes": "01" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "8.549.013,28", + "Valor Liquidado": "4.212.517,32", + "Valor Pago": "4.151.378,50", + "Ano": "2022", + "Mes": "02" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "8.426.595,13", + "Valor Liquidado": "4.707.092,69", + "Valor Pago": "4.630.379,35", + "Ano": "2022", + "Mes": "03" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "11.600.763,40", + "Valor Liquidado": "13.206.007,77", + "Valor Pago": "4.532.788,10", + "Ano": "2022", + "Mes": "04" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "7.717.920,95", + "Valor Liquidado": "8.822.555,53", + "Valor Pago": "5.972.911,97", + "Ano": "2022", + "Mes": "05" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "2.097.410,39", + "Valor Liquidado": "2.803.452,32", + "Valor Pago": "4.226.917,70", + "Ano": "2022", + "Mes": "06" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "7.335.525,04", + "Valor Liquidado": "4.022.849,73", + "Valor Pago": "5.222.201,27", + "Ano": "2022", + "Mes": "07" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "2.406.492,21", + "Valor Liquidado": "5.238.816,83", + "Valor Pago": "4.921.000,70", + "Ano": "2022", + "Mes": "08" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "3.859.441,08", + "Valor Liquidado": "6.124.992,57", + "Valor Pago": "5.982.625,60", + "Ano": "2022", + "Mes": "09" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "6.926.645,51", + "Valor Liquidado": "7.402.617,60", + "Valor Pago": "12.766.882,67", + "Ano": "2022", + "Mes": "10" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "6.467.445,90", + "Valor Liquidado": "6.690.330,97", + "Valor Pago": "8.756.051,27", + "Ano": "2022", + "Mes": "11" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "3.638.375,81", + "Valor Liquidado": "5.225.032,36", + "Valor Pago": "6.381.661,73", + "Ano": "2022", + "Mes": "12" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "3.305.054,99", + "Valor Liquidado": "2.415.302,82", + "Valor Pago": "2.415.302,82", + "Ano": "2023", + "Mes": "01" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "10.199.231,75", + "Valor Liquidado": "4.863.619,41", + "Valor Pago": "4.798.941,02", + "Ano": "2023", + "Mes": "02" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "8.429.460,67", + "Valor Liquidado": "8.354.959,33", + "Valor Pago": "5.654.467,07", + "Ano": "2023", + "Mes": "03" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "2.123.761,07", + "Valor Liquidado": "3.441.924,41", + "Valor Pago": "5.045.169,94", + "Ano": "2023", + "Mes": "04" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "8.148.117,06", + "Valor Liquidado": "8.166.315,00", + "Valor Pago": "5.094.953,64", + "Ano": "2023", + "Mes": "05" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "2.703.010,20", + "Valor Liquidado": "4.213.677,12", + "Valor Pago": "5.626.335,37", + "Ano": "2023", + "Mes": "06" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "9.901.953,48", + "Valor Liquidado": "10.394.287,41", + "Valor Pago": "9.923.364,41", + "Ano": "2023", + "Mes": "07" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "8.202.607,42", + "Valor Liquidado": "9.185.359,66", + "Valor Pago": "8.542.388,96", + "Ano": "2023", + "Mes": "08" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "8.299.615,25", + "Valor Liquidado": "5.202.243,65", + "Valor Pago": "6.556.420,54", + "Ano": "2023", + "Mes": "09" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "7.784.447,09", + "Valor Liquidado": "4.076.629,21", + "Valor Pago": "5.825.753,41", + "Ano": "2023", + "Mes": "10" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "3.585.339,19", + "Valor Liquidado": "9.311.359,89", + "Valor Pago": "7.022.148,40", + "Ano": "2023", + "Mes": "11" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "16.630.860,67", + "Valor Liquidado": "16.887.411,86", + "Valor Pago": "15.875.392,34", + "Ano": "2023", + "Mes": "12" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "3.124.451,22", + "Valor Liquidado": "2.193.848,28", + "Valor Pago": "2.193.855,07", + "Ano": "2024", + "Mes": "01" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "8.962.945,93", + "Valor Liquidado": "5.500.810,54", + "Valor Pago": "4.592.184,95", + "Ano": "2024", + "Mes": "02" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "51.705.801,15", + "Valor Liquidado": "27.169.128,44", + "Valor Pago": "13.014.874,87", + "Ano": "2024", + "Mes": "03" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "119.127.573,43", + "Valor Liquidado": "126.920.652,66", + "Valor Pago": "116.214.214,27", + "Ano": "2024", + "Mes": "04" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "15.789.606,81", + "Valor Liquidado": "20.080.509,45", + "Valor Pago": "38.171.936,71", + "Ano": "2024", + "Mes": "05" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "4.417.947,00", + "Valor Liquidado": "6.584.898,09", + "Valor Pago": "10.766.610,83", + "Ano": "2024", + "Mes": "06" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "12.177.542,84", + "Valor Liquidado": "13.078.591,22", + "Valor Pago": "12.885.351,10", + "Ano": "2024", + "Mes": "07" + }, + { + "orgao": "SECRETARIA DE ESTADO DE CULTURA E TURISMO", + "Valor Empenhado": "5.734.457,71", + "Valor Liquidado": "3.950.421,37", + "Valor Pago": "5.615.859,73", + "Ano": "2024", + "Mes": "08" + } +] \ No newline at end of file diff --git a/backend/src/controllers/tendersMonthController.js b/backend/src/controllers/tendersMonthController.js new file mode 100644 index 0000000..a0f3b01 --- /dev/null +++ b/backend/src/controllers/tendersMonthController.js @@ -0,0 +1,33 @@ +const tendersMonthService = require('../services/tendersMonthService'); + +async function getTendersByMonth(req, res) { + const { start, end } = req.query; + + if(!start || !end) { + return res.status(400).json({ error: "Data inicial e final são obrigatórios" }); + } + + if(start > end) { + return res.status(400).json({ error: "A data inicial deve ser menor ou igual à data final" }); + } + + const startCompare = parseInt(start); + const endCompare = parseInt(end); + + try { + const tenders = await tendersMonthService.getTendersByMonth(startCompare, endCompare); + + if (tenders.length > 0) { + res.json(tenders); + } else { + res.status(400).json({ message: "Nenhum dado encontrado para o intervalo de datas informado" }); + } + } catch (err) { + console.error(err); + res.status(500).json({ error: err.message }); + } +} + +module.exports = { + getTendersByMonth, +}; \ No newline at end of file diff --git a/backend/src/controllers/tendersYearController.js b/backend/src/controllers/tendersYearController.js new file mode 100644 index 0000000..d7776fe --- /dev/null +++ b/backend/src/controllers/tendersYearController.js @@ -0,0 +1,31 @@ +const tendersYearService = require('../services/tendersYearService'); + +async function getTendersByYear(req, res) { + const { year } = req.query; + + if(!year) { + return res.status(400).json({ error: "Informe o ano de consulta" }); + } + + const yearInt = parseInt(year); + if (isNaN(yearInt) || yearInt.toString().length !== 4){ + return res.status(400).json({ error: "Ano inválido. Informe um ano no formato YYYY."}); + } + + try { + const tenders = await tendersYearService.getTendersByYear(yearInt); + + if (tenders.length > 0) { + res.json(tenders); + } else { + res.status(404).json({ message: "Nenhum dado encontrado para o ano informado" }); + } + } catch (err) { + console.error(err); + res.status(500).json({ error: err.message }); + } +} + +module.exports = { + getTendersByYear, +}; \ No newline at end of file diff --git a/backend/src/index.js b/backend/src/index.js index 16b779b..54e1008 100644 --- a/backend/src/index.js +++ b/backend/src/index.js @@ -1,17 +1,20 @@ -const express = require('express') +const express = require('express'); const cors = require('cors'); -const app = express() -const port = 5000 +const app = express(); +const port = 5000; -const citiesRoutes = require('./routes/citiesRoutes') -const tendersRoutes = require('./routes/tendersRoutes') -const unitsRoutes = require('./routes/unitsRoutes') +const citiesRoutes = require('./routes/citiesRoutes'); +const tendersMonthRoutes = require('./routes/tendersMonthRoutes'); +const tendersYearRoutes = require('./routes/tendersYearRoutes'); +const tendersRoutes = require('./routes/tendersRoutes'); +const unitsRoutes = require('./routes/unitsRoutes'); app.use(cors()) app.use('/cities', citiesRoutes) -app.use('/tenders', tendersRoutes) +app.use('/tenders', tendersMonthRoutes) +app.use('/tenders/year', tendersYearRoutes) app.use('/units', unitsRoutes) app.listen(port, () => { diff --git a/backend/src/routes/tendersMonthRoutes.js b/backend/src/routes/tendersMonthRoutes.js new file mode 100644 index 0000000..8cd6fa7 --- /dev/null +++ b/backend/src/routes/tendersMonthRoutes.js @@ -0,0 +1,7 @@ +const express = require('express'); +const router = express.Router(); +const tendersMonthController = require('../controllers/tendersMonthController'); + +router.get('/', tendersMonthController.getTendersByMonth); + +module.exports = router; \ No newline at end of file diff --git a/backend/src/routes/tendersYearRoutes.js b/backend/src/routes/tendersYearRoutes.js new file mode 100644 index 0000000..9007f71 --- /dev/null +++ b/backend/src/routes/tendersYearRoutes.js @@ -0,0 +1,7 @@ +const express = require('express'); +const router = express.Router(); +const tendersYearController = require('../controllers/tendersYearController'); + +router.get('/', tendersYearController.getTendersByYear); + +module.exports = router; \ No newline at end of file diff --git a/backend/src/scripts/insertTendersMonth.js b/backend/src/scripts/insertTendersMonth.js new file mode 100644 index 0000000..14d3890 --- /dev/null +++ b/backend/src/scripts/insertTendersMonth.js @@ -0,0 +1,73 @@ +const path = require('path'); +require('dotenv').config({ path: path.resolve(__dirname, '../../.env') }) + +const fs = require('fs'); +const { createClient } = require('@supabase/supabase-js'); + +const supabaseUrl = process.env.SUPABASE_URL; +const supabaseKey = process.env.SUPABASE_KEY; + +if (!supabaseUrl || !supabaseKey) { + throw new Error('SUPABASE_URL and SUPABASE_KEY are required in the .env file.'); +} + +const supabase = createClient(supabaseUrl, supabaseKey); + +async function main() { + try { + const data = JSON.parse(fs.readFileSync('../../raspadores/Selenium_transparencia/selenium_portal_transparencia_meses.json', 'utf-8')); + + for (const item of data) { + const committed_value = parseFloat(item["Valor Empenhado"].replace(/[.,]/g, match => (match === '.' ? '' : '.'))); + const liquidated_value = parseFloat(item["Valor Liquidado"].replace(/[.,]/g, match => (match === '.' ? '' : '.'))); + const paid_value = parseFloat(item["Valor Pago"].replace(/[.,]/g, match => (match === '.' ? '' : '.'))); + const year = parseInt(item["Ano"], 10); + const month = parseInt(item["Mes"], 10); + + // Inserir a licitação se não existir + await insertTender(committed_value, liquidated_value, paid_value, year, month); + } + } catch (error) { + console.error('Erro ao inserir Licitações:', error); + } +} + +async function insertTender(committed_value, liquidated_value, paid_value, year, month) { + // Verificar se a licitação já existe + const { data: existingTender, error: selectError } = await supabase + .from('tendersmonth') + .select('id') + .eq('year', year) + .eq('month', month) + .single(); + + if (selectError && selectError.code !== 'PGRST116') { + console.error('Erro ao verificar Licitações:', selectError); + return; + } + + if (existingTender) { + console.log('A licitação já existe, pulando inserção'); + return; + } + + const { data, error } = await supabase + .from('tendersmonth') + .insert([ + { + committed_value: committed_value, + liquidated_value: liquidated_value, + paid_value: paid_value, + year: year, + month: month + } + ]); + + if (error) { + console.error('Erro ao inserir as licitações:', error); + } else { + console.log('Licitações inseridas com sucesso:', data); + } +} + +main(); diff --git a/backend/src/scripts/insertTendersYear.js b/backend/src/scripts/insertTendersYear.js new file mode 100644 index 0000000..4fa07d6 --- /dev/null +++ b/backend/src/scripts/insertTendersYear.js @@ -0,0 +1,70 @@ +const path = require('path'); +require('dotenv').config({ path: path.resolve(__dirname, '../../.env') }); + +const fs = require('fs'); +const { createClient } = require('@supabase/supabase-js'); + +const supabaseUrl = process.env.SUPABASE_URL; +const supabaseKey = process.env.SUPABASE_KEY; + +if (!supabaseUrl || !supabaseKey) { + throw new Error('SUPABASE_URL and SUPABASE_KEY are required in the .env file.'); +} + +const supabase = createClient(supabaseUrl, supabaseKey); + +async function main() { + try { + const data = JSON.parse(fs.readFileSync('../../raspadores/Selenium_transparencia/selenium_portal_transparencia_anos.json', 'utf-8')); + + for (const item of data) { + const committed_value = parseFloat(item["Valor Empenhado"].replace(/[.,]/g, match => (match === '.' ? '' : '.'))); + const liquidated_value = parseFloat(item["Valor Liquidado"].replace(/[.,]/g, match => (match === '.' ? '' : '.'))); + const paid_value = parseFloat(item["Valor Pago"].replace(/[.,]/g, match => (match === '.' ? '' : '.'))); + const year = parseInt(item["Ano"], 10); + + // Inserir a licitação se não existir + await insertTender(committed_value, liquidated_value, paid_value, year); + } + } catch (error) { + console.error('Erro ao inserir Licitações:', error); + } +} + +async function insertTender(committed_value, liquidated_value, paid_value, year) { + // Verificar se a licitação já existe + const { data: existingTender, error: selectError } = await supabase + .from('tendersyear') + .select('id') + .eq('year', year) + .single(); + + if (selectError && selectError.code !== 'PGRST116') { + console.error('Erro ao verificar Licitações:', selectError); + return; + } + + if (existingTender) { + console.log('A licitação já existe, pulando inserção'); + return; + } + + const { data, error } = await supabase + .from('tendersyear') + .insert([ + { + committed_value: committed_value, + liquidated_value: liquidated_value, + paid_value: paid_value, + year: year, + } + ]); + + if (error) { + console.error('Erro ao inserir as licitações:', error); + } else { + console.log('Licitações inseridas com sucesso:', data); + } +} + +main(); diff --git a/backend/src/services/tendersMonthService.js b/backend/src/services/tendersMonthService.js new file mode 100644 index 0000000..1f25a3b --- /dev/null +++ b/backend/src/services/tendersMonthService.js @@ -0,0 +1,27 @@ +const supabase = require('../config/supabaseClient'); + +async function getTendersByMonth(start, end) { + const startYear = Math.floor(start / 100); + const startMonth = start % 100; + const endYear = Math.floor(end / 100); + const endMonth = end % 100; + + const { data, error } = await supabase + .from('tendersmonth') + .select('*') + .or( + `and(year.eq.${startYear},month.gte.${startMonth}),` + + `and(year.gt.${startYear},year.lt.${endYear}),` + + `and(year.eq.${endYear},month.lte.${endMonth})` + ); + + if (error) { + throw new Error(error.message); + } + + return data; +} + +module.exports = { + getTendersByMonth, +}; \ No newline at end of file diff --git a/backend/src/services/tendersYearService.js b/backend/src/services/tendersYearService.js new file mode 100644 index 0000000..edf7f5e --- /dev/null +++ b/backend/src/services/tendersYearService.js @@ -0,0 +1,19 @@ +const supabase = require('../config/supabaseClient'); + +async function getTendersByYear(year) { + const { data, error } = await supabase + .from('tendersyear') + .select('year, liquidated_value, committed_value, paid_value') + .eq('year', year); + + if (error) { + throw new Error(error.message); + } + + return data; +} + +module.exports = { + getTendersByYear, +}; + diff --git "a/docs/Como executar/Front-end/Testes unit\303\241rios/Testes do Componente Filtro.md" "b/docs/Como executar/Front-end/Testes unit\303\241rios/Testes do Componente Filtro.md" index 3130ce3..972c368 100644 --- "a/docs/Como executar/Front-end/Testes unit\303\241rios/Testes do Componente Filtro.md" +++ "b/docs/Como executar/Front-end/Testes unit\303\241rios/Testes do Componente Filtro.md" @@ -2,43 +2,25 @@ ## Descrição Geral -Este conjunto de testes foi desenvolvido para verificar o comportamento e a renderização correta do componente `Filtro` no projeto. A abordagem adotada utiliza a biblioteca `@testing-library/react` e `Jest` para renderizar o componente e validar os elementos visíveis na interface de usuário, garantindo que todos os elementos essenciais estejam presentes e corretamente configurados. +Este conjunto de testes foi desenvolvido para verificar o comportamento e a renderização correta do componente `Filtro` no projeto. A abordagem adotada utiliza a biblioteca `@testing-library/react` e `Jest` para renderizar o componente e validar os elementos visíveis na interface do usuário, garantindo que todos os elementos essenciais estejam presentes e configurados corretamente. Além disso, o mock de funções de API e de gráficos foi implementado para isolar o componente e testar seu comportamento de forma independente. -### Casos de Teste +## Casos de Teste -#### Renderização do Componente Filtro +### 1. Renderização e Interação com o Componente Filtro -1. **Objetivo**: Verificar se o componente `Filtro` é renderizado corretamente com todos os seus elementos principais. -2. **Teste**: - - Renderizar o componente `Filtro`. - - Verificar se o título com o texto "Pesquise por cidade, período e tema" está presente no documento. - - Verificar se o seletor de cidades está presente com a opção "Selecione uma cidade". +**Objetivo:** Verificar se o componente `Filtro` é renderizado corretamente, com todos os seus elementos principais, e interage corretamente com os selecionadores de data. -#### Manipulação da Seleção de Cidade +**Teste:** -1. **Objetivo**: Garantir que a seleção de uma cidade no campo de entrada é manipulada corretamente. -2. **Teste**: - - Renderizar o componente `Filtro`. - - Simular a seleção de uma cidade do seletor de cidades. - - Verificar se a cidade selecionada é refletida no campo de entrada. - -#### Manipulação de Seleção de Datas Inicial e Final - -1. **Objetivo**: Testar a funcionalidade de seleção de datas e garantir que as datas inicial e final são manipuladas corretamente. -2. **Teste**: - - Renderizar o componente `Filtro`. - - Simular a seleção de uma data inicial com o valor "01 / 2023". - - Simular a seleção de uma data final com o valor "12 / 2023". - - Verificar se os campos de entrada para "Data Inicial" e "Data final" contêm os valores selecionados. - -#### Verificação dos Gráficos - -1. **Objetivo**: Garantir que os gráficos são renderizados corretamente após a seleção de dados. -2. **Teste**: - - Renderizar o componente `Filtro`. - - Verificar se os gráficos para "Valor Empenhado", "Valor Liquidado" e "Valor Pago" estão presentes no documento. - - Verificar se o número de gráficos renderizados corresponde ao esperado (três gráficos). +- Renderizar o componente `Filtro`. +- Verificar se o título com o texto "Pesquise por período" está presente no documento. +- Verificar se os campos de data inicial e final estão presentes. +- Simular a seleção de uma data inicial com o valor "01/2023". +- Simular a seleção de uma data final com o valor "12/2023". +- Verificar se a função `fettchYearAndMonthTender` foi chamada após a seleção das datas. +- Verificar se os valores totais ("Total Empenhado", "Total Liquidado", "Total Pago") são exibidos no documento. +- Verificar se os gráficos são renderizados corretamente, garantindo que o mock de gráficos está presente e o número de gráficos renderizados corresponde ao esperado (dois gráficos). ## Considerações Finais -Esses testes garantem que o componente `Filtro` está sendo renderizado corretamente e que os elementos principais estão presentes com o conteúdo esperado. Além disso, verificam se as funcionalidades básicas, como a manipulação de entradas e a seleção de datas, estão funcionando conforme o esperado. Estes testes são essenciais para assegurar que o componente se comporta conforme projetado em diversos cenários de uso. +Os testes garantem que o componente `Filtro` é renderizado corretamente, com os elementos essenciais presentes, e que as funcionalidades básicas, como a manipulação das seleções de data e a exibição de gráficos, estão funcionando conforme o esperado. A utilização de mocks para funções de API e gráficos assegura que o teste seja executado de maneira isolada, focando exclusivamente no comportamento do componente. diff --git a/docs/Como executar/backend/Executar a API.md b/docs/Como executar/backend/Executar a API.md index ede7b87..4985483 100644 --- a/docs/Como executar/backend/Executar a API.md +++ b/docs/Como executar/backend/Executar a API.md @@ -8,41 +8,32 @@ Esta API permite consultar informações relacionadas a licitações culturais d A API está localizada no diretório `backend/src/`, e é composta por três endpoints principais: -1. **/units** -2. **/cities** -3. **/tenders** +1. **/tenders** +2. **/tenders/year** ### **Endpoints** -#### **1. Listar Unidades Administrativas: `/units`** +#### **1. Consultar Licitações Mensais: `/tenders`** -- **Descrição:** Retorna uma lista de todas as unidades administrativas de Minas Gerais relacionadas à cultura. -- **URL:** `http://localhost:5000/units` +- **Descrição:** Retorna uma lista de licitações baseadas nos parâmetros de data inicial e final. +- **URL:** `http://localhost:5000/tenders?start=201501&end=201502` - **Método:** `GET` -- **Parâmetros:** Nenhum - -#### **2. Listar Cidades Disponíveis: `/cities`** - -- **Descrição:** Retorna uma lista das cidades de Minas Gerais que estão disponíveis para consulta no banco de dados. -- **URL:** `http://localhost:5000/cities` -- **Método:** `GET` -- **Parâmetros:** Nenhum +- **Parâmetros:** + - `start`: Representa o início do período de consulta no formato `AAAAMM` (ano/mês). Por exemplo, `201501` corresponde a janeiro de 2015. + - `end`: Representa o fim do período de consulta no formato `AAAAMM`. -#### **3. Consultar Licitações: `/tenders`** +#### **2. Consultar Licitações Anuais: `/tenders/year`** -- **Descrição:** Retorna uma lista de licitações baseadas nos parâmetros de data e cidade. -- **URL:** `http://localhost:5000/tenders?start=2401&end=2402&city=1` +- **Descrição:** Retorna os valores totais empenhados, liquidados e pagos no ano informado no parâmetro "year". +- **URL:** `http://localhost:5000/tenders/year?year=2024` - **Método:** `GET` - **Parâmetros:** - - `start`: Representa o início do período de consulta no formato `AAMM` (ano/mês). Por exemplo, `2401` corresponde a janeiro de 2024. - - `end`: Representa o fim do período de consulta no formato `AAMM`. - - `city`: ID da cidade conforme cadastrado na tabela de cidades. Por exemplo, `city=1` corresponde a Juiz de Fora e `city=2` a Montes Claros. + - `year`: Representa o ano de consulta no formato `AAAA` (ano). Por exemplo, `year=2024` retornará o total de licitações empenhadas, liquidadas e pagas no ano de 2024. + ### **Considerações Importantes** -- **Formato de Data:** No banco de dados, os anos são representados pelos dois últimos dígitos. Por exemplo, o ano 2024 é armazenado como `24`. - **Porta:** A API está configurada para rodar na porta `5000`. - --- Siga este guia para consultar e explorar as licitações culturais de Minas Gerais. Caso tenha dúvidas ou precise de suporte adicional, entre em contato com o time de desenvolvimento. \ No newline at end of file diff --git a/docs/index.md b/docs/index.md index 7f18866..4b698f1 100644 --- a/docs/index.md +++ b/docs/index.md @@ -61,6 +61,46 @@ Através desta aplicação, buscamos oferecer uma maneira mais transparente e ac +## 🚀 Getting Started + +### Pré-requisito + +- [Docker compose](https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository) + +### Clonar o repositório + +```bash +git clone https://github.com/unb-mds/2024-1-MinasDeCultura.git +``` + +### Acessar o repositório + +```bash +cd 2024-1-MinasDeCultura +``` + +### Configurar o arquivo .env + +O projeto depende de algumas variáveis de ambiente que precisam ser configuradas antes de iniciar os containers. No diretório backend do projeto , crie um arquivo .env com as seguintes variáveis, no caso do nosso projeto estamos usando um banco de dados no SUPABASE: + +```bash +SUPABASE_URL= +SUPABASE_KEY= +``` + +Iniciar os containers + +Após configurar o .env, você pode iniciar o projeto executando o comando abaixo. Este comando irá construir as imagens Docker necessárias e iniciar todos os serviços definidos no docker-compose.yml: + +```bash + + docker compose up +``` +### Acessar o projeto + +Depois que os containers estiverem em execução, você poderá acessar o projeto em http://localhost:3000. + + ## 🤖 Identidade Visual - *Desenvolvimento da Identidade Visual:* Investimos tempo no desenvolvimento de uma identidade visual consistente para o projeto, incluindo seleção de cores, tipografia e uma logo autêntica baseada na bandeira. Essa identidade visual reflete nossa visão e valores, e está integrada em toda a interface do usuário e materiais de design. diff --git a/front/package-lock.json b/front/package-lock.json index f8a3487..bc5159d 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -10542,9 +10542,10 @@ } }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" diff --git a/front/src/app/globals.css b/front/src/app/globals.css index 745952f..cd891e5 100644 --- a/front/src/app/globals.css +++ b/front/src/app/globals.css @@ -59,6 +59,23 @@ color: #FFFFFF; /* Texto branco */ } +/* Estilo para linhas do gráfico */ +.high-contrast .chart-line-emp-enhanced, +.high-contrast .chart-line-liquidated, +.high-contrast .chart-line-paid { + stroke: #FFFFFF; /* Linha branca para manter contraste */ +} + +/* Estilo para a legenda do gráfico */ +.high-contrast .chart-legend-item { + color: #FFD700; /* Cor dourada para itens da legenda */ +} + +/* Estilo para explicações do gráfico */ +.high-contrast .chart-explanation { + color: #FFD700; /* Cor dourada para explicações */ +} + /* Estilo para aumentar o tamanho da fonte */ .font-lg { font-size: 1.25rem; /* Tamanho da fonte aumentado */ @@ -68,3 +85,22 @@ .font-original { font-size: 1rem; /* Tamanho da fonte original */ } + +/* Força a aplicação da cor vermelha */ +.swiper-button-next, +.swiper-button-prev { + color: #ED1C24 !important; +} +/* styles.css or a relevant CSS file */ +.legend-color-red { + background-color: #ED1C24 !important; + } + + .legend-color-orange { + background-color: #F19C28 !important; + } + + .legend-color-green { + background-color: #2FB551 !important; + } + \ No newline at end of file diff --git a/front/src/app/page.tsx b/front/src/app/page.tsx index 861a558..2eb0581 100644 --- a/front/src/app/page.tsx +++ b/front/src/app/page.tsx @@ -1,25 +1,23 @@ "use client"; -import { Search, MapPin, CalendarClock, MoveRight } from "lucide-react"; +import { Search, MapPin, CalendarClock, MoveRight } from "lucide-react"; import Busca from "@/components/Busca"; import dynamic from 'next/dynamic'; import Slider from "@/components/Slider"; import Pilares from "@/components/Pilares"; - -const Grafico = dynamic(() => import('@/components/Grafico'), { ssr: false }); +import Mensagem from "@/components/Mensagem"; +import Grafico from '@/components/Grafico'; export default function Home() { return (
-
- - -
-
- {/* Conteúdo adicional pode ir aqui */} -
+ + +
+ +
); } diff --git a/front/src/components/Busca.tsx b/front/src/components/Busca.tsx index 98450b4..0b09e79 100644 --- a/front/src/components/Busca.tsx +++ b/front/src/components/Busca.tsx @@ -5,21 +5,21 @@ import Link from 'next/link'; const Busca = () => { return ( -
+
Lupa1 -
-

- Faça sua busca
filtrada
: -

- Veja os dados para cada município do Estado de
Minas Gerais -

+
+

+ Faça sua busca
filtrada
:

+

+ Veja os dados para cada município do Estado de
Minas Gerais +

- diff --git a/front/src/components/Filtro.tsx b/front/src/components/Filtro.tsx index 77f8509..cff4e22 100644 --- a/front/src/components/Filtro.tsx +++ b/front/src/components/Filtro.tsx @@ -1,16 +1,15 @@ -'use client'; +"use client"; + import React, { useState, useEffect } from 'react'; -import Chart from 'react-apexcharts'; +import dynamic from 'next/dynamic'; import { ApexOptions } from 'apexcharts'; -import { fetchCities, fetchUnits, searchLicitacoes } from '../services/api'; -import { MapPin, CalendarClock, MoveLeft, MoveRight } from 'lucide-react'; +import { CalendarClock, MoveLeft, MoveRight, HelpCircle } from 'lucide-react'; // Importação do HelpCircle import DatePicker from 'react-datepicker'; import 'react-datepicker/dist/react-datepicker.css'; import { ptBR } from 'date-fns/locale'; +import { fettchYearAndMonthTender } from '../services/api'; -interface LicitacaoData { - administrative_unit_id: number; - city_id: number; +interface Dados { committed_value: number; liquidated_value: number; paid_value: number; @@ -18,160 +17,333 @@ interface LicitacaoData { month: number; } -const Filtro: React.FC = () => { - const [selectedCityId, setSelectedCityId] = useState(null); - const [selectedUnit, setSelectedUnit] = useState(''); - const [cities, setCities] = useState<{ id: number; name: string }[]>([]); - const [units, setUnits] = useState<{ id: number; name: string }[]>([]); - const [empenhadoSeries, setEmpenhadoSeries] = useState([]); - const [liquidadoSeries, setLiquidadoSeries] = useState([]); - const [pagoSeries, setPagoSeries] = useState([]); +const ReactApexChart = dynamic(() => import('react-apexcharts'), { ssr: false }); + +const Dashboard: React.FC = () => { + const [data, setData] = useState([]); + const [lineChartSeries, setLineChartSeries] = useState([]); + const [pieChartSeries, setPieChartSeries] = useState([]); + const [totalSales, setTotalSales] = useState(0); + const [totalRevenue, setTotalRevenue] = useState(0); + const [totalUsers, setTotalUsers] = useState(0); const [startDate, setStartDate] = useState(null); const [endDate, setEndDate] = useState(null); - const [isClient, setIsClient] = useState(false); const [errorMessage, setErrorMessage] = useState(null); - const isHighContrastMode = document.documentElement.classList.contains('high-contrast'); - const [chartOptions, setChartOptions] = useState({ + + // Inicialização dos estados dos gráficos com opções padrão + const [lineChartOptions, setLineChartOptions] = useState({ chart: { - type: 'bar', + type: 'line', + height: 350, + toolbar: { + show: true, + }, + zoom: { + enabled: true, + }, + animations: { + enabled: true, + }, background: '#ffffff', + foreColor: '#000000', }, - plotOptions: { - bar: { - horizontal: false, - distributed: true, - barHeight: '100%', - colors: { - ranges: [{ from: 0, to: 5000000000, color: '#ED1C24' }], - }, - }, + stroke: { + curve: 'smooth', + width: 2, + }, + dataLabels: { + enabled: false, + }, + markers: { + size: 4, }, xaxis: { - categories: ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez'], - type: 'category', + categories: [], + labels: { + style: { + fontSize: '12px', + }, + }, + tickAmount: 10, }, yaxis: { - labels: { - formatter: (value) => `R$ ${value.toLocaleString('pt-BR')}`, // Adiciona o símbolo R$ e formata os números + title: { + text: 'Valores', + style: { + fontSize: '14px', }, + }, + labels: { + formatter: (value: number) => `R$ ${value.toLocaleString('pt-BR', { minimumFractionDigits: 2 })}`, + style: { + fontSize: '12px', + }, + }, }, - dataLabels: { - enabled: false, - }, - legend: { - show: false, + position: 'top', + horizontalAlign: 'center', + fontSize: '14px', }, - responsive: [ - { breakpoint: 2500, options: { chart: { height: 200, width: 1200 } } }, - { breakpoint: 1025, options: { chart: { height: 424, width: 800 } } }, - { breakpoint: 640, options: { chart: { height: 200, width: 310 } } }, - { breakpoint: 769, options: { chart: { height: 424, width: 700 } } }, - - ], - theme: { - mode: 'light', // Default mode + tooltip: { + y: { + formatter: (value: number) => `R$ ${value.toLocaleString('pt-BR', { minimumFractionDigits: 2 })}`, + }, }, - }); - useEffect(() => { - setIsClient(true); - - const root = document.documentElement; - const observer = new MutationObserver((mutations) => { - mutations.forEach((mutation) => { - if (mutation.attributeName === "class") { - const isDarkMode = root.classList.contains('dark'); - const isHighContrastMode = root.classList.contains('high-contrast'); - - setChartOptions((prevOptions) => ({ - ...prevOptions, - chart: { - ...prevOptions.chart, - background: isHighContrastMode ? '#000000' : isDarkMode ? '#1f1f1f' : '#ffffff', - foreColor: isHighContrastMode ? '#FFFFFF' : isDarkMode ? '#e5e7eb' : '#000000', + colors: ['#ED1C24', '#F19C28', '#2FB551'], + responsive: [ + { + breakpoint: 1024, + options: { + xaxis: { + labels: { + style: { + fontSize: '10px', + }, }, - xaxis: { - ...prevOptions.xaxis, + }, + yaxis: [ + { labels: { style: { - colors: isHighContrastMode ? '#FFFFFF' : isDarkMode ? '#e5e7eb' : '#000000', - } - } + fontSize: '10px', + }, + }, + }, + ], + legend: { + fontSize: '12px', + }, + }, + }, + { + breakpoint: 768, + options: { + chart: { + height: 300, + }, + xaxis: { + labels: { + style: { + fontSize: '8px', + }, }, - yaxis: { - ...prevOptions.yaxis, + }, + yaxis: [ + { labels: { style: { - colors: isHighContrastMode ? '#FFFFFF' : isDarkMode ? '#e5e7eb' : '#000000', + fontSize: '8px', }, - formatter: (value) => `R$ ${value.toLocaleString('pt-BR')}`, // Adiciona o símbolo R$ e formata os números - } + }, }, - plotOptions: { - ...prevOptions.plotOptions, - bar: { - ...prevOptions.plotOptions?.bar ?? {}, - colors: { - ranges: [{ - from: 0, - to: 5000000000, - color: isHighContrastMode ? '#FFEA00' : isDarkMode ? '#ED1C24' : '#ED1C24', - }] - } - } - } - })); - } - }); - }); - - observer.observe(root, { - attributes: true, - attributeFilter: ['class'] - }); - - return () => observer.disconnect(); - }, []); - const loadCities = async () => { + ], + legend: { + fontSize: '10px', + }, + }, + }, + ], + }); + + const [pieChartOptions, setPieChartOptions] = useState({ + chart: { + type: 'pie', + height: 350, + background: '#ffffff', + foreColor: '#000000', + }, + labels: ['Valor Empenhado', 'Valor Liquidado', 'Valor Pago'], + legend: { + position: 'bottom', + fontSize: '14px', + }, + tooltip: { + y: { + formatter: (value: number) => `R$ ${value.toLocaleString('pt-BR', { minimumFractionDigits: 2 })}`, + }, + }, + colors: ['#ED1C24', '#F19C28', '#2FB551'], + responsive: [ + { + breakpoint: 1024, + options: { + legend: { + fontSize: '12px', + }, + }, + }, + { + breakpoint: 768, + options: { + chart: { + height: 300, + }, + legend: { + fontSize: '10px', + }, + }, + }, + ], + }); + + const fetchData = async (startDate: Date | null, endDate: Date | null) => { + if (!startDate || !endDate) return; + try { - const cities = await fetchCities(); - setCities(cities); + const startMonth = (startDate.getMonth() + 1).toString().padStart(2, '0'); + const startYear = startDate.getFullYear().toString(); + const endMonth = (endDate.getMonth() + 1).toString().padStart(2, '0'); + const endYear = endDate.getFullYear().toString(); + + const fetchedData = await fettchYearAndMonthTender({ startYear, startMonth, endYear, endMonth }); + + if (Array.isArray(fetchedData) && fetchedData.length > 0) { + setData(fetchedData); + + const categories = fetchedData.map(item => `${item.year}-${String(item.month).padStart(2, '0')}`); + const committedValues = fetchedData.map((item: Dados) => item.committed_value); + const liquidatedValues = fetchedData.map((item: Dados) => item.liquidated_value); + const paidValues = fetchedData.map((item: Dados) => item.paid_value); + + setLineChartSeries([ + { name: 'Valor Empenhado', data: committedValues }, + { name: 'Valor Liquidado', data: liquidatedValues }, + { name: 'Valor Pago', data: paidValues }, + ]); + + setLineChartOptions(prevOptions => ({ + ...prevOptions, + xaxis: { + ...prevOptions.xaxis, + categories, + }, + })); + + const totalCommitted = committedValues.reduce((acc, val) => acc + val, 0); + const totalLiquidated = liquidatedValues.reduce((acc, val) => acc + val, 0); + const totalPaid = paidValues.reduce((acc, val) => acc + val, 0); + + setPieChartSeries([totalCommitted, totalLiquidated, totalPaid]); + setTotalSales(totalCommitted); + setTotalRevenue(totalLiquidated); + setTotalUsers(totalPaid); + + setErrorMessage(null); + } else { + setErrorMessage('Nenhum dado encontrado para o período selecionado.'); + } } catch (error) { - console.error('Erro ao buscar cidades:', error); + console.error('Erro ao buscar dados:', error); + setErrorMessage('Erro ao buscar dados.'); } }; - const loadUnits = async () => { - try { - const units = await fetchUnits(); - setUnits(units); - } catch (error) { - console.error('Erro ao buscar unidades:', error); - } + useEffect(() => { + fetchData(startDate, endDate); + }, [startDate, endDate]); + + const updateChartOptionsForTheme = () => { + const isDarkMode = document.documentElement.classList.contains('dark'); + const isHighContrastMode = document.documentElement.classList.contains('high-contrast'); + + const backgroundColor = isHighContrastMode ? '#000000' : isDarkMode ? '#1f1f1f' : '#ffffff'; + const foreColor = isHighContrastMode ? '#FFFFFF' : isDarkMode ? '#e5e7eb' : '#000000'; + + setLineChartOptions(prevOptions => ({ + ...prevOptions, + chart: { + ...prevOptions.chart, + background: backgroundColor, + foreColor: foreColor, + }, + xaxis: { + ...prevOptions.xaxis, + labels: { + ...prevOptions.xaxis?.labels, + style: { + ...prevOptions.xaxis?.labels?.style, + colors: foreColor, + }, + }, + }, + yaxis: { + ...prevOptions.yaxis, + labels: { + ...(Array.isArray(prevOptions.yaxis) ? {} : prevOptions.yaxis?.labels), + style: { + ...(Array.isArray(prevOptions.yaxis) ? {} : prevOptions.yaxis?.labels?.style), + colors: foreColor, + }, + }, + }, + legend: { + ...prevOptions.legend, + labels: { + colors: foreColor, + }, + }, + })); + + setPieChartOptions(prevOptions => ({ + ...prevOptions, + chart: { + ...prevOptions.chart, + background: backgroundColor, + foreColor: foreColor, + }, + legend: { + ...prevOptions.legend, + labels: { + colors: foreColor, + }, + }, + })); }; + useEffect(() => { + updateChartOptionsForTheme(); + + const observer = new MutationObserver(() => { + updateChartOptionsForTheme(); + }); + + observer.observe(document.documentElement, { + attributes: true, + attributeFilter: ['class'], + }); + + return () => { + observer.disconnect(); + }; + }, []); + const renderCustomHeader = ({ date, + decreaseMonth, + increaseMonth, decreaseYear, increaseYear, }: { date: Date; + decreaseMonth: () => void; + increaseMonth: () => void; decreaseYear: () => void; increaseYear: () => void; }) => { const months = [ 'Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', - 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro' + 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro', ]; return (
- {months[date.getMonth()]} de {date.getFullYear()} -
@@ -187,179 +359,133 @@ const Filtro: React.FC = () => { const handleEndDateChange = (date: Date | null) => { if (date && startDate && date < startDate) { - setEndDate(startDate); - } else { - setEndDate(date); + setStartDate(date); } + setEndDate(date); }; - const fetchAndProcessData = async () => { - if (!selectedCityId) return; - - try { - const startMonth = startDate ? (startDate.getMonth() + 1).toString().padStart(2, '0') : ''; - const startYear = startDate ? startDate.getFullYear().toString() : ''; - const endMonth = endDate ? (endDate.getMonth() + 1).toString().padStart(2, '0') : ''; - const endYear = endDate ? endDate.getFullYear().toString() : ''; - - const data: LicitacaoData[] = await searchLicitacoes({ - startYear, - startMonth, - endYear, - endMonth, - cityId: selectedCityId, - unitId: selectedUnit, - }); - - const empData: { [key: number]: number[] } = {}; - const liquidData: { [key: number]: number[] } = {}; - const pagoData: { [key: number]: number[] } = {}; - - const filteredData = selectedUnit - ? data.filter(item => item.administrative_unit_id === Number(selectedUnit)) - : data; - - filteredData.forEach((item: LicitacaoData) => { - const unitId = item.administrative_unit_id; - const month = item.month - 1; - - if (!empData[unitId]) empData[unitId] = new Array(12).fill(0); - if (!liquidData[unitId]) liquidData[unitId] = new Array(12).fill(0); - if (!pagoData[unitId]) pagoData[unitId] = new Array(12).fill(0); - - empData[unitId][month] += item.committed_value; - liquidData[unitId][month] += item.liquidated_value; - pagoData[unitId][month] += item.paid_value; - }); - - const empenhadoSeries: ApexAxisChartSeries = Object.keys(empData).map(key => ({ - name: `Unidade ${key}`, - data: empData[parseInt(key)] - })); - - const liquidadoSeries: ApexAxisChartSeries = Object.keys(liquidData).map(key => ({ - name: `Unidade ${key}`, - data: liquidData[parseInt(key)] - })); - - const pagoSeries: ApexAxisChartSeries = Object.keys(pagoData).map(key => ({ - name: `Unidade ${key}`, - data: pagoData[parseInt(key)] - })); - - setEmpenhadoSeries(empenhadoSeries); - setLiquidadoSeries(liquidadoSeries); - setPagoSeries(pagoSeries); - setErrorMessage(null); - - - } catch (error) { - console.error('Erro ao buscar dados de licitações:', error); - setErrorMessage('Erro ao buscar dados de licitações.'); - } - }; - - useEffect(() => { - loadCities(); - loadUnits(); - }, []); - - useEffect(() => { - if (selectedCityId && startDate && endDate) { - fetchAndProcessData(); - } - }, [selectedCityId, selectedUnit, startDate, endDate]); - - return ( - <> -
-

- Pesquise por cidade, período e tema +
+
+

+ Pesquise por período

-
    -
  • - - -
    -
  • - - {/*
  • - - -
    -
  • */} - -
  • - +
    +
    + - +
    + até +
    + -
    -
  • -
+
+
+ {errorMessage &&

{errorMessage}

}

+
+ {/* Total Empenhado */} +
+

+ Total Empenhado + {/* Tooltip */} +
+ +
+
+ Valor Empenhado: Valor do orçamento reservado para fazer face a compromisso formalmente assumido com fornecedor ou credor. +
+
+
+

+

+ R$ {totalSales.toLocaleString('pt-BR', { minimumFractionDigits: 2 })} +

+
-
-
-
-

Valor Empenhado

- -
-
-

Valor Liquidado

- -
-
-

Valor Pago

- -
+ {/* Total Liquidado */} +
+

+ Total Liquidado + {/* Tooltip */} +
+ +
+
+ Valor Liquidado: Valor que o fornecedor ou credor tem direito a receber referente a produto ou serviço devidamente entregue. +
+
+
+

+

+ R$ {totalRevenue.toLocaleString('pt-BR', { minimumFractionDigits: 2 })} +

+
+ + {/* Total Pago */} +
+

+ Total Pago + {/* Tooltip */} +
+ +
+
+ Valor Pago: Valor referente aos pagamentos efetuados através de movimentações bancárias, escriturais e apropriação contábil da despesa. +
+
+
+

+

+ R$ {totalUsers.toLocaleString('pt-BR', { minimumFractionDigits: 2 })} +

+
+
+ +
+
+ +
+
+
- +
); }; -export default Filtro; \ No newline at end of file +export default Dashboard; diff --git a/front/src/components/Footer.tsx b/front/src/components/Footer.tsx index 55ff157..5b2ac72 100644 --- a/front/src/components/Footer.tsx +++ b/front/src/components/Footer.tsx @@ -27,10 +27,12 @@ const Footer = () => {
- unblogo + + unblogo + import('react-apexcharts'), { ssr: false }); +const ReactApexChart = dynamic(() => import('react-apexcharts'), { ssr: false }); + +interface Dados { + year: number; + committed_value: number; + liquidated_value: number; + paid_value: number; +} const Grafico: React.FC = () => { - const [isClient, setIsClient] = useState(false); - const isHighContrastMode = document.documentElement.classList.contains('high-contrast'); - const [chartOptions, setChartOptions] = useState({ - chart: { - type: 'bar', - height: 500, - background: '#ffffff', - foreColor: '#000000', + const [series, setSeries] = useState([]); + const [errorMessage, setErrorMessage] = useState(null); + const [chartOptions, setChartOptions] = useState({ + chart: { + type: 'line', + height: 600, + zoom: { + enabled: true, + type: 'x', + zoomedArea: { + fill: { + color: '#90CAF9', + opacity: 0.4 + } + } + }, + toolbar: { + tools: { + zoomin: true, + zoomout: true, + pan: true, + reset: true }, - plotOptions: { - bar: { - horizontal: false, - distributed: true, - barHeight: '100%', - colors: { - ranges: [{ - from: 0, - to: 500000, - color: '#ED1C24' - }], - } - } + autoSelected: 'pan' + }, + background: '#ffffff', + }, + colors: ['#ED1C24', '#F19C28', '#2FB551'], + dataLabels: { + enabled: false + }, + stroke: { + curve: 'smooth' + }, + fill: { + type: 'gradient', + gradient: { + opacityFrom: 0.6, + opacityTo: 0.8, + } + }, + legend: { + position: 'top', + horizontalAlign: 'center', + fontSize: '14px', + }, + xaxis: { + type: 'datetime', + labels: { + format: 'yyyy', + style: { + fontSize: '12px', }, - xaxis: { - categories: ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez'], - type: 'category', - labels: { - style: { - colors: '#000000' - } - } + }, + tickAmount: 10, + min: new Date(2014, 0, 1).getTime(), + max: new Date(2023, 0, 1).getTime(), + }, + yaxis: { + labels: { + style: { + fontSize: '14px', }, - yaxis: { - title: { - text: 'Valor', - style: { - color: '#000000' - } + formatter: (value: number) => `R$ ${Number(value).toLocaleString('pt-BR', { minimumFractionDigits: 2 })}`, + }, + tickAmount: 4, + min: 5000000, + }, + tooltip: { + x: { + format: 'DESPESA DE yyyy' + }, + }, + responsive: [ + { + breakpoint: 1024, + options: { + xaxis: { + tickAmount: 5, + min: new Date(2016, 0, 1).getTime(), + max: new Date(2023, 0, 1).getTime(), + labels: { + style: { + fontSize: '10px', + }, }, + }, + yaxis: { labels: { - style: { - colors: '#000000' - } - } - }, - legend: { - show: false, - }, - responsive: [ - { - breakpoint: 1025, - options: { - chart: { - height: 424, - width: 800, - } - } + style: { + fontSize: '12px', + }, + }, + }, + legend: { + fontSize: '12px', + }, + } + }, + { + breakpoint: 768, + options: { + chart: { + height: 400, + }, + xaxis: { + tickAmount: 3, + min: new Date(2018, 0, 1).getTime(), + max: new Date(2023, 0, 1).getTime(), + labels: { + style: { + fontSize: '10px', + }, + }, + }, + yaxis: { + labels: { + style: { + fontSize: '10px', + }, + formatter: (value: number) => `${(value / 1000000).toFixed(1)}M`, // Formato em milhões + }, + }, + legend: { + position: 'bottom', + horizontalAlign: 'center', + fontSize: '10px', + }, + } + }, + { + breakpoint: 480, + options: { + chart: { + height: 300, + }, + xaxis: { + tickAmount: 2, + min: new Date(2020, 0, 1).getTime(), + max: new Date(2023, 0, 1).getTime(), + labels: { + style: { + fontSize: '8px', + }, }, - { - breakpoint: 640, - options: { - chart: { - height: 200, - width: 310, - } - } + }, + yaxis: { + labels: { + style: { + fontSize: '8px', + }, + formatter: (value: number) => `${(value / 1000000).toFixed(1)}M`, // Formato em milhões }, - { - breakpoint: 769, - options: { - chart: { - height: 424, - width: 700 - } - } + }, + legend: { + fontSize: '8px', + }, + } + } + ] + }); + + const isMobileScreen = () => window.innerWidth <= 768; + + useEffect(() => { + const updateChartOptionsForTheme = () => { + const isDarkMode = document.documentElement.classList.contains('dark'); + const isHighContrastMode = document.documentElement.classList.contains('high-contrast'); + + setChartOptions((prevOptions) => ({ + ...prevOptions, + chart: { + ...prevOptions.chart, + background: isHighContrastMode ? '#000000' : isDarkMode ? '#1f1f1f' : '#ffffff', + foreColor: isHighContrastMode ? '#FFFFFF' : isDarkMode ? '#e5e7eb' : '#000000', + }, + xaxis: { + ...prevOptions.xaxis, + labels: { + style: { + colors: isHighContrastMode ? '#FFFFFF' : isDarkMode ? '#e5e7eb' : '#000000', } - ], - theme: { - mode: 'light', // Modo padrão inicial - palette: 'palette1', + } }, + yaxis: { + ...prevOptions.yaxis, + labels: { + style: { + colors: isHighContrastMode ? '#FFFFFF' : isDarkMode ? '#e5e7eb' : '#000000', + }, + formatter: (value: number) => isMobileScreen() + ? `${(value / 1000000).toFixed(1)}M` + : `R$ ${value.toLocaleString('pt-BR', { minimumFractionDigits: 2 })}`, + } + }, + colors: isHighContrastMode ? ['#ED1C24', '#F19C28', '#2FB551'] : ['#ED1C24', '#F19C28', '#2FB551'], + })); + }; + + updateChartOptionsForTheme(); + + const observer = new MutationObserver(() => { + updateChartOptionsForTheme(); }); + + observer.observe(document.documentElement, { + attributes: true, + attributeFilter: ['class'] + }); + + window.addEventListener('resize', () => updateChartOptionsForTheme()); + + return () => { + observer.disconnect(); + window.removeEventListener('resize', () => updateChartOptionsForTheme()); + }; + }, []); - const series = [{ - name: 'Valor gasto', - data: [20000, 300000, 65000, 100000, 200000, 200000, 20000, 30000, 20000, 75000, 300000, 200000] - }]; - - useEffect(() => { - setIsClient(true); - - const root = document.documentElement; - const observer = new MutationObserver((mutations) => { - mutations.forEach((mutation) => { - if (mutation.attributeName === "class") { - const isDarkMode = root.classList.contains('dark'); - const isHighContrastMode = root.classList.contains('high-contrast'); // Verifica o modo de alto contraste - setChartOptions((prevOptions) => ({ - ...prevOptions, - chart: { - ...prevOptions.chart, - background: isHighContrastMode ? '#000000' : isDarkMode ? '#1f1f1f' : '#ffffff', - foreColor: isHighContrastMode ? '#FFFFFF' : isDarkMode ? '#e5e7eb' : '#000000', - }, - xaxis: { - ...prevOptions.xaxis, - labels: { - style: { - colors: isHighContrastMode ? '#FFFFFF' : isDarkMode ? '#e5e7eb' : '#000000' - } - } - }, - yaxis: { - ...prevOptions.yaxis, - labels: { - style: { - colors: isHighContrastMode ? '#FFFFFF' : isDarkMode ? '#e5e7eb' : '#000000' - } - }, - title: { - style: { - color: isDarkMode ? '#e5e7eb' : '#000000' - } - } - }, - theme: { - mode: isDarkMode ? 'dark' : 'light', - } - })); - } - }); - }); - - observer.observe(root, { attributes: true }); + const fetchData = async () => { + try { + const data = await fetchYearlyTendersData(); + console.log('API Response:', data); + + if (Array.isArray(data) && data.length > 0) { + const series = [ + { + name: 'Valor Empenhado', + data: data.map((item) => ({ + x: new Date(item.year, 0, 1).toISOString(), + y: item.committed_value || 0 + })), + }, + { + name: 'Valor Liquidado', + data: data.map((item) => ({ + x: new Date(item.year, 0, 1).toISOString(), + y: item.liquidated_value || 0 + })), + }, + { + name: 'Valor Pago', + data: data.map((item) => ({ + x: new Date(item.year, 0, 1).toISOString(), + y: item.paid_value || 0 + })), + }, + ]; + + console.log('Series Data Transformada:', series); + + setSeries(series); + setErrorMessage(null); + } else { + console.error('Dados inválidos retornados pela API.'); + setErrorMessage('Dados inválidos retornados pela API.'); + } + } catch (error) { + console.error('Erro ao buscar dados para o gráfico:', error); + setErrorMessage('Erro ao buscar dados para o gráfico.'); + } + }; + - return () => { - observer.disconnect(); - }; - }, []); + useEffect(() => { + fetchData(); + }, []); - return ( - <> - {isClient && ( - - )} - - ); -} + return ( +
+

+ Despesas em Cultura em Minas Gerais ao Longo dos Anos (2002-2023) +

+ {errorMessage &&

{errorMessage}

} +
+ +
+
    +
  • +
    +
    + Valor Empenhado: + Valor do orçamento reservado para fazer face a compromisso formalmente assumido com fornecedor ou credor. +
    +
  • +
  • +
    +
    + Valor Liquidado: + Valor que o fornecedor ou credor tem direito a receber referente a produto ou serviço devidamente entregue. +
    +
  • +
  • +
    +
    + Valor Pago: + Valor referente aos pagamentos efetuados através de movimentações bancárias, escriturais e apropriação contábil da despesa. +
    +
  • +
+
+ ); +}; export default Grafico; diff --git a/front/src/components/Header.tsx b/front/src/components/Header.tsx index ede779a..4d9ccd3 100644 --- a/front/src/components/Header.tsx +++ b/front/src/components/Header.tsx @@ -14,11 +14,28 @@ export function Header() { const [accessibilityMenuOpen, setAccessibilityMenuOpen] = useState(false); const [keepMenuOpen, setKeepMenuOpen] = useState(false); + // Carrega as configurações do localStorage + useEffect(() => { + const savedDarkMode = localStorage.getItem('darkMode') === 'true'; + const savedHighContrast = localStorage.getItem('highContrast') === 'true'; + const savedFontSize = localStorage.getItem('fontSize') || 'text-base'; + + setDarkMode(savedDarkMode); + setHighContrast(savedHighContrast); + setFontSize(savedFontSize); + }, []); + + // Atualiza as configurações e aplica as classes useEffect(() => { document.documentElement.classList.toggle('dark', darkMode); document.documentElement.classList.toggle('high-contrast', highContrast); document.documentElement.classList.toggle('font-lg', fontSize === 'text-lg'); document.documentElement.classList.toggle('font-original', fontSize === 'text-base'); + + // Salva as configurações no localStorage + localStorage.setItem('darkMode', darkMode.toString()); + localStorage.setItem('highContrast', highContrast.toString()); + localStorage.setItem('fontSize', fontSize); }, [darkMode, highContrast, fontSize]); const toggleNavbar = () => setIsOpen(!isOpen); @@ -64,7 +81,7 @@ export function Header() {
diff --git a/front/src/components/Informacoes.tsx b/front/src/components/Informacoes.tsx index b56d5a5..7780cc9 100644 --- a/front/src/components/Informacoes.tsx +++ b/front/src/components/Informacoes.tsx @@ -20,8 +20,16 @@ const Informacoes = () => {

Este é um projeto desenvolvido como parte da disciplina de Métodos de Desenvolvimento de Software (MDS) da Universidade de Brasília (UnB). O objetivo principal deste projeto é criar uma plataforma online para análise e - armazenamento de dados de licitações relacionadas aos gastos culturais apoiados pelo Governo Federal, utilizando a - plataforma e a API do Querido Diário. + armazenamento de dados de licitações relacionadas aos gastos culturais apoiados pelo Governo Federal, utilizando + informações da Secretaria de Cultura do Estado de Minas Gerais. +

+

+

+

A plataforma permite aos usuários filtrar dados por um intervalo de tempo para obter informações de interesse, + além de oferecer um dashboard informativo que facilita a consulta e visualização dos dados. Adicionalmente, + a plataforma busca abranger a comunidade com funcionalidades como modo noturno, alto contraste e aumento de + fonte para melhorar a acessibilidade, além de permitir o acesso via dispositivos móveis, garantindo + disponibilidade em várias plataformas.

diff --git a/front/src/components/Integrantes.tsx b/front/src/components/Integrantes.tsx index 8f6036f..c495d51 100644 --- a/front/src/components/Integrantes.tsx +++ b/front/src/components/Integrantes.tsx @@ -9,7 +9,7 @@ import Image from "next/image"; const Integrantes = () => { return (
-
+
@@ -90,7 +90,7 @@ const Integrantes = () => {
- + diff --git a/front/src/components/Mensagem.tsx b/front/src/components/Mensagem.tsx new file mode 100644 index 0000000..f8a6231 --- /dev/null +++ b/front/src/components/Mensagem.tsx @@ -0,0 +1,37 @@ +import { useState, useEffect } from "react"; + +const Mensagem = () => { + const [currentText, setCurrentText] = useState(0); + + const texts = [ + "Simplificando o acesso aos investimentos culturais", + "Facilitando a visualização de dados culturais", + "Promovendo a transparência nos gastos culturais", + "Aprimorando o acesso à cultura em Minas Gerais" + ]; + + useEffect(() => { + const interval = setInterval(() => { + setCurrentText((prevText) => (prevText + 1) % texts.length); + }, 2000); + + return () => clearInterval(interval); + }, [texts.length]); + + return ( +
+
+

+ Dados oficiais das despesas da Secretaria de Estado de Cultura de Minas Gerais +

+
+
+ +
+

{texts[currentText]}

+
+
+ ); +} + +export default Mensagem; diff --git a/front/src/components/Pilares.tsx b/front/src/components/Pilares.tsx index 9d1672a..5739580 100644 --- a/front/src/components/Pilares.tsx +++ b/front/src/components/Pilares.tsx @@ -17,17 +17,17 @@ const Pilares = () => { A Secretaria de Cultura e Turismo do Estado de Minas Gerais:

-
-

Deve preservar

-

o patrimônio cultural do estado de Minas gerais

+
+

Deve preservar

+

patrimônio cultural do estado de Minas gerais

-
-

Deve promover

-

a acessibilidade e inclusão social à cultura

+
+

Deve promover

+

acessibilidade e inclusão social à cultura

-
-

Deve fomentar

-

a produção artística da população

+
+

Deve fomentar

+

produção artística da população

diff --git a/front/src/components/Slider.tsx b/front/src/components/Slider.tsx index b063711..1cffac9 100644 --- a/front/src/components/Slider.tsx +++ b/front/src/components/Slider.tsx @@ -32,33 +32,40 @@ const Slider: React.FC = () => { }, []); return ( -
- - {data.map((item, index) => ( - - - Slider + ); }; diff --git a/front/src/services/api.ts b/front/src/services/api.ts index 596babf..3daacfa 100644 --- a/front/src/services/api.ts +++ b/front/src/services/api.ts @@ -5,8 +5,6 @@ interface SearchParams { startMonth: string; endYear: string; endMonth: string; - cityId: number; - unitId: string; } export const fetchCities = async () => { @@ -14,7 +12,7 @@ export const fetchCities = async () => { const response = await axios.get('http://localhost:5000/cities'); return response.data; } catch (error) { - console.error('Erro ao buscar cidades:', error); + console.error('Error fetching cities:', error); throw error; } }; @@ -24,21 +22,36 @@ export const fetchUnits = async () => { const response = await axios.get('http://localhost:5000/units'); return response.data; } catch (error) { - console.error('Erro ao buscar cidades:', error); + console.error('Error fetching units:', error); throw error; } }; -export const searchLicitacoes = async (params: SearchParams) => { - const { startYear, startMonth, endYear, endMonth, cityId, unitId} = params; +export const fetchYearlyTendersData = async () => { + try { + const requests = []; + for (let year = 2002; year <= 2023; year++) { + requests.push(axios.get(`https://minas-cultura-api.onrender.com/tenders/year?year=${year}`)); + } + const responses = await Promise.all(requests); + return responses.flatMap((response) => response.data); + } catch (error) { + console.error('Erro ao buscar dados anuais:', error); + return []; + } +}; + +/* pra quando a API remota estiver com a lógica certa*/ +export const fettchYearAndMonthTender = async (params: SearchParams) => { + const { startYear, startMonth, endYear, endMonth } = params; - const url = `http://localhost:5000/tenders?start=${startYear}${startMonth}&end=${endYear}${endMonth}&city=${cityId}`; + const url = `https://minas-cultura-api.onrender.com/tenders?start=${startYear}${startMonth}&end=${endYear}${endMonth}`; try { const response = await axios.get(url); return response.data; } catch (error) { - console.error('Erro ao buscar licitações:', error); + console.error('Error searching tenders:', error); throw error; } }; diff --git a/front/src/testes/Filtro.test.jsx b/front/src/testes/Filtro.test.jsx index b00965c..1810409 100644 --- a/front/src/testes/Filtro.test.jsx +++ b/front/src/testes/Filtro.test.jsx @@ -2,8 +2,7 @@ import React from 'react'; import { render, screen, fireEvent, waitFor } from '@testing-library/react'; import '@testing-library/jest-dom/extend-expect'; import Filtro from '../components/Filtro'; -import { fetchCities, fetchUnits, searchLicitacoes } from '../services/api'; -import ApexCharts from 'react-apexcharts'; +import { fettchYearAndMonthTender } from '../services/api'; // Mock das funções de API jest.mock('../services/api'); @@ -15,66 +14,43 @@ jest.mock('react-apexcharts', () => { }; }); -const mockCities = [ - { id: 1, name: 'Cidade 1' }, - { id: 2, name: 'Cidade 2' }, -]; - -const mockUnits = [ - { id: 1, name: 'Unidade 1' }, - { id: 2, name: 'Unidade 2' }, -]; - -const mockLicitacoes = [ +const mockData = [ { - administrative_unit_id: 1, - city_id: 1, committed_value: 1000, liquidated_value: 800, paid_value: 600, year: 2023, month: 1, }, - // Adicione mais dados conforme necessário ]; beforeEach(() => { - fetchCities.mockResolvedValue(mockCities); - fetchUnits.mockResolvedValue(mockUnits); - searchLicitacoes.mockResolvedValue(mockLicitacoes); + fettchYearAndMonthTender.mockResolvedValue(mockData); }); -test('renders Filtro component', async () => { +test('renders Dashboard component and interacts with date pickers', async () => { render(); // Verifica se o título está presente - expect(screen.getByText('Pesquise por cidade, período e tema')).toBeInTheDocument(); - - // Verifica se o seletor de cidades está presente - expect(screen.getByText('Selecione uma cidade')).toBeInTheDocument(); + expect(screen.getByText('Pesquise por período')).toBeInTheDocument(); - // Aguarda a carga das cidades - await waitFor(() => expect(fetchCities).toHaveBeenCalled()); - - // Simula a seleção de uma cidade - fireEvent.change(screen.getByRole('combobox'), { target: { value: '1' } }); - - // Verifica se a cidade foi selecionada - expect(screen.getByRole('combobox')).toHaveValue('1'); + // Verifica se os campos de data inicial e final estão presentes + expect(screen.getByPlaceholderText('Data Inicial')).toBeInTheDocument(); + expect(screen.getByPlaceholderText('Data Final')).toBeInTheDocument(); // Simula a seleção de datas - fireEvent.change(screen.getByPlaceholderText('Data Inicial'), { target: { value: '01 / 2023' } }); - fireEvent.change(screen.getByPlaceholderText('Data final'), { target: { value: '12 / 2023' } }); + fireEvent.change(screen.getByPlaceholderText('Data Inicial'), { target: { value: '01/2023' } }); + fireEvent.change(screen.getByPlaceholderText('Data Final'), { target: { value: '12/2023' } }); - // Aguarda a busca de licitações - await waitFor(() => expect(searchLicitacoes).toHaveBeenCalled()); + // Aguarda a busca de dados + await waitFor(() => expect(fettchYearAndMonthTender).toHaveBeenCalled()); - // Verifica se os gráficos são renderizados - expect(screen.getByText('Valor Empenhado')).toBeInTheDocument(); - expect(screen.getByText('Valor Liquidado')).toBeInTheDocument(); - expect(screen.getByText('Valor Pago')).toBeInTheDocument(); + // Verifica se os valores totais são exibidos + expect(screen.getByText('Total Empenhado')).toBeInTheDocument(); + expect(screen.getByText('Total Liquidado')).toBeInTheDocument(); + expect(screen.getByText('Total Pago')).toBeInTheDocument(); - // Verifica se há três gráficos renderizados + // Verifica se os gráficos são renderizados const charts = screen.getAllByTestId('mock-apexcharts'); - expect(charts).toHaveLength(3); + expect(charts).toHaveLength(2); // O Dashboard tem dois gráficos }); \ No newline at end of file diff --git a/front/src/testes/Informacoes.test.jsx b/front/src/testes/Informacoes.test.jsx index 58eb6f2..eaf708e 100644 --- a/front/src/testes/Informacoes.test.jsx +++ b/front/src/testes/Informacoes.test.jsx @@ -16,7 +16,7 @@ describe('Informacoes', () => { expect(title).toBeInTheDocument(); // Verifica se o parágrafo é renderizado - const paragraphText = "Este é um projeto desenvolvido como parte da disciplina de Métodos de Desenvolvimento de Software (MDS) da Universidade de Brasília (UnB). O objetivo principal deste projeto é criar uma plataforma online para análise e armazenamento de dados de licitações relacionadas aos gastos culturais apoiados pelo Governo Federal, utilizando a plataforma e a API do Querido Diário."; + const paragraphText = "Este é um projeto desenvolvido como parte da disciplina de Métodos de Desenvolvimento de Software (MDS) da Universidade de Brasília (UnB). O objetivo principal deste projeto é criar uma plataforma online para análise e armazenamento de dados de licitações relacionadas aos gastos culturais apoiados pelo Governo Federal, utilizando informações da Secretaria de Cultura do Estado de Minas Gerais."; const paragraph = screen.getByText((content, element) => { const hasText = element => element.textContent === paragraphText; const elementHasText = hasText(element); diff --git a/front/src/testes/Pilares.test.jsx b/front/src/testes/Pilares.test.jsx index d8f92a8..c3e8b14 100644 --- a/front/src/testes/Pilares.test.jsx +++ b/front/src/testes/Pilares.test.jsx @@ -13,19 +13,19 @@ describe('Pilares', () => { // Check if the first section is rendered const firstHeading = screen.getByText(/Deve preservar/i); - const firstSubheading = screen.getByText(/o patrimônio cultural do estado de Minas Gerais/i); + const firstSubheading = screen.getByText(/patrimônio cultural do estado de Minas Gerais/i); expect(firstHeading).toBeInTheDocument(); expect(firstSubheading).toBeInTheDocument(); // Check if the second section is rendered const secondHeading = screen.getByText(/Deve promover/i); - const secondSubheading = screen.getByText(/a acessibilidade e inclusão social à cultura/i); + const secondSubheading = screen.getByText(/acessibilidade e inclusão social à cultura/i); expect(secondHeading).toBeInTheDocument(); expect(secondSubheading).toBeInTheDocument(); // Check if the third section is rendered const thirdHeading = screen.getByText(/Deve fomentar/i); - const thirdSubheading = screen.getByText(/a produção artística da população/i); + const thirdSubheading = screen.getByText(/produção artística da população/i); expect(thirdHeading).toBeInTheDocument(); expect(thirdSubheading).toBeInTheDocument(); });