From 466b032c6caf5e6a9c3ab8a071bc6d11b9bede42 Mon Sep 17 00:00:00 2001 From: Tommy shu <56746466+qstommyshu@users.noreply.github.com> Date: Sun, 3 Dec 2023 23:12:27 -0500 Subject: [PATCH 01/34] 41 initial front end project set up (#42) Tooling and template set up for Front-end development including: React, TypeScript, React-testing-library, ESlint, Prettier Front end project setup requirements: 1. -[x] React 2. -[x] TypeScript 3. -[x] Unit Test Environment 4. -[x] Linter --- src/client/.eslintrc.cjs | 25 + src/client/.gitignore | 24 + src/client/.prettierrc.cjs | 6 + src/client/LICENSE | 21 + src/client/README.md | 27 + src/client/index.html | 12 + src/client/package-lock.json | 6219 +++++++++++++++++++++++++++++ src/client/package.json | 43 + src/client/src/App.test.tsx | 31 + src/client/src/App.tsx | 20 + src/client/src/index.css | 0 src/client/src/main.tsx | 10 + src/client/src/pages/Home.tsx | 5 + src/client/src/pages/NotFound.tsx | 12 + src/client/src/setupTests.ts | 5 + src/client/src/vite-env.d.ts | 1 + src/client/tsconfig.json | 25 + src/client/tsconfig.node.json | 9 + src/client/vite.config.ts | 16 + 19 files changed, 6511 insertions(+) create mode 100644 src/client/.eslintrc.cjs create mode 100644 src/client/.gitignore create mode 100644 src/client/.prettierrc.cjs create mode 100644 src/client/LICENSE create mode 100644 src/client/README.md create mode 100644 src/client/index.html create mode 100644 src/client/package-lock.json create mode 100644 src/client/package.json create mode 100644 src/client/src/App.test.tsx create mode 100644 src/client/src/App.tsx create mode 100644 src/client/src/index.css create mode 100644 src/client/src/main.tsx create mode 100644 src/client/src/pages/Home.tsx create mode 100644 src/client/src/pages/NotFound.tsx create mode 100644 src/client/src/setupTests.ts create mode 100644 src/client/src/vite-env.d.ts create mode 100644 src/client/tsconfig.json create mode 100644 src/client/tsconfig.node.json create mode 100644 src/client/vite.config.ts diff --git a/src/client/.eslintrc.cjs b/src/client/.eslintrc.cjs new file mode 100644 index 0000000..5fc5bd4 --- /dev/null +++ b/src/client/.eslintrc.cjs @@ -0,0 +1,25 @@ +module.exports = { + env: { + browser: true, + es2021: true, + }, + extends: [ + 'airbnb', + 'airbnb-typescript', + 'airbnb/hooks', + 'plugin:react/recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:prettier/recommended', + ], + overrides: [], + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + project: './tsconfig.json', + }, + plugins: ['react', '@typescript-eslint', 'prettier'], + rules: { + 'react/react-in-jsx-scope': 0, + }, +}; diff --git a/src/client/.gitignore b/src/client/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/src/client/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/src/client/.prettierrc.cjs b/src/client/.prettierrc.cjs new file mode 100644 index 0000000..95b713e --- /dev/null +++ b/src/client/.prettierrc.cjs @@ -0,0 +1,6 @@ +module.exports = { + trailingComma: "es5", + tabWidth: 2, + semi: true, + singleQuote: true, +}; \ No newline at end of file diff --git a/src/client/LICENSE b/src/client/LICENSE new file mode 100644 index 0000000..0b33014 --- /dev/null +++ b/src/client/LICENSE @@ -0,0 +1,21 @@ +MIT License Copyright (c) 2022 Coding Garden + +Permission is hereby granted, free +of charge, to any person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice +(including the next paragraph) shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO +EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/src/client/README.md b/src/client/README.md new file mode 100644 index 0000000..1ebe379 --- /dev/null +++ b/src/client/README.md @@ -0,0 +1,27 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: + +- Configure the top-level `parserOptions` property like this: + +```js + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + project: ['./tsconfig.json', './tsconfig.node.json'], + tsconfigRootDir: __dirname, + }, +``` + +- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked` +- Optionally add `plugin:@typescript-eslint/stylistic-type-checked` +- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list diff --git a/src/client/index.html b/src/client/index.html new file mode 100644 index 0000000..7e6449b --- /dev/null +++ b/src/client/index.html @@ -0,0 +1,12 @@ + + + + + + Vite + React + TS + + +
+ + + diff --git a/src/client/package-lock.json b/src/client/package-lock.json new file mode 100644 index 0000000..2e4a401 --- /dev/null +++ b/src/client/package-lock.json @@ -0,0 +1,6219 @@ +{ + "name": "react-ts-app", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "react-ts-app", + "version": "0.0.0", + "dependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "^6.13.0" + }, + "devDependencies": { + "@testing-library/jest-dom": "^5.16.5", + "@testing-library/react": "^14.0.0", + "@types/react": "^18.2.12", + "@types/react-dom": "^18.2.5", + "@typescript-eslint/eslint-plugin": "^5.59.11", + "@typescript-eslint/parser": "^5.59.11", + "@vitejs/plugin-react": "^4.0.0", + "eslint": "^8.42.0", + "eslint-config-airbnb": "^19.0.4", + "eslint-config-airbnb-typescript": "^17.0.0", + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-react": "^7.32.2", + "eslint-plugin-react-hooks": "^4.6.0", + "jsdom": "^22.1.0", + "prettier": "^2.8.8", + "typescript": "^5.2.2", + "vite": "^4.3.9", + "vitest": "^0.32.0" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.1.tgz", + "integrity": "sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg==", + "dev": true + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.21.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz", + "integrity": "sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.5.tgz", + "integrity": "sha512-9M398B/QH5DlfCOTKDZT1ozXr0x8uBEeFd+dJraGUZGiaNpGCDVGCc14hZexsMblw3XxltJ+6kSvogp9J+5a9g==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.5", + "@babel/helper-compilation-targets": "^7.21.5", + "@babel/helper-module-transforms": "^7.21.5", + "@babel/helpers": "^7.21.5", + "@babel/parser": "^7.21.5", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", + "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.3", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", + "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.21.5", + "@babel/helper-validator-option": "^7.21.0", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.21.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", + "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-module-imports": "^7.21.4", + "@babel/helper-simple-access": "^7.21.5", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", + "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", + "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", + "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.21.0.tgz", + "integrity": "sha512-f/Eq+79JEu+KUANFks9UZCcvydOOGMgF7jBrcwjHa5jTZD8JivnhCJYvmlhR/WTXBWonDExPoW0eO/CR4QJirA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz", + "integrity": "sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz", + "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.3", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.3", + "@babel/types": "^7.23.3", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", + "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.15.tgz", + "integrity": "sha512-sRSOVlLawAktpMvDyJIkdLI/c/kdRTOqo8t6ImVxg8yT7LQDUYV5Rp2FKeEosLr6ZCja9UjYAzyRSxGteSJPYg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.15.tgz", + "integrity": "sha512-0kOB6Y7Br3KDVgHeg8PRcvfLkq+AccreK///B4Z6fNZGr/tNHX0z2VywCc7PTeWp+bPvjA5WMvNXltHw5QjAIA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.15.tgz", + "integrity": "sha512-MzDqnNajQZ63YkaUWVl9uuhcWyEyh69HGpMIrf+acR4otMkfLJ4sUCxqwbCyPGicE9dVlrysI3lMcDBjGiBBcQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.15.tgz", + "integrity": "sha512-7siLjBc88Z4+6qkMDxPT2juf2e8SJxmsbNVKFY2ifWCDT72v5YJz9arlvBw5oB4W/e61H1+HDB/jnu8nNg0rLA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.15.tgz", + "integrity": "sha512-NbImBas2rXwYI52BOKTW342Tm3LTeVlaOQ4QPZ7XuWNKiO226DisFk/RyPk3T0CKZkKMuU69yOvlapJEmax7cg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.15.tgz", + "integrity": "sha512-Xk9xMDjBVG6CfgoqlVczHAdJnCs0/oeFOspFap5NkYAmRCT2qTn1vJWA2f419iMtsHSLm+O8B6SLV/HlY5cYKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.15.tgz", + "integrity": "sha512-3TWAnnEOdclvb2pnfsTWtdwthPfOz7qAfcwDLcfZyGJwm1SRZIMOeB5FODVhnM93mFSPsHB9b/PmxNNbSnd0RQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.15.tgz", + "integrity": "sha512-MLTgiXWEMAMr8nmS9Gigx43zPRmEfeBfGCwxFQEMgJ5MC53QKajaclW6XDPjwJvhbebv+RzK05TQjvH3/aM4Xw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.15.tgz", + "integrity": "sha512-T0MVnYw9KT6b83/SqyznTs/3Jg2ODWrZfNccg11XjDehIved2oQfrX/wVuev9N936BpMRaTR9I1J0tdGgUgpJA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.15.tgz", + "integrity": "sha512-wp02sHs015T23zsQtU4Cj57WiteiuASHlD7rXjKUyAGYzlOKDAjqK6bk5dMi2QEl/KVOcsjwL36kD+WW7vJt8Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.15.tgz", + "integrity": "sha512-k7FsUJjGGSxwnBmMh8d7IbObWu+sF/qbwc+xKZkBe/lTAF16RqxRCnNHA7QTd3oS2AfGBAnHlXL67shV5bBThQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.15.tgz", + "integrity": "sha512-ZLWk6czDdog+Q9kE/Jfbilu24vEe/iW/Sj2d8EVsmiixQ1rM2RKH2n36qfxK4e8tVcaXkvuV3mU5zTZviE+NVQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.15.tgz", + "integrity": "sha512-mY6dPkIRAiFHRsGfOYZC8Q9rmr8vOBZBme0/j15zFUKM99d4ILY4WpOC7i/LqoY+RE7KaMaSfvY8CqjJtuO4xg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.15.tgz", + "integrity": "sha512-EcyUtxffdDtWjjwIH8sKzpDRLcVtqANooMNASO59y+xmqqRYBBM7xVLQhqF7nksIbm2yHABptoioS9RAbVMWVA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.15.tgz", + "integrity": "sha512-BuS6Jx/ezxFuHxgsfvz7T4g4YlVrmCmg7UAwboeyNNg0OzNzKsIZXpr3Sb/ZREDXWgt48RO4UQRDBxJN3B9Rbg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.15.tgz", + "integrity": "sha512-JsdS0EgEViwuKsw5tiJQo9UdQdUJYuB+Mf6HxtJSPN35vez1hlrNb1KajvKWF5Sa35j17+rW1ECEO9iNrIXbNg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.15.tgz", + "integrity": "sha512-R6fKjtUysYGym6uXf6qyNephVUQAGtf3n2RCsOST/neIwPqRWcnc3ogcielOd6pT+J0RDR1RGcy0ZY7d3uHVLA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.15.tgz", + "integrity": "sha512-mVD4PGc26b8PI60QaPUltYKeSX0wxuy0AltC+WCTFwvKCq2+OgLP4+fFd+hZXzO2xW1HPKcytZBdjqL6FQFa7w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.15.tgz", + "integrity": "sha512-U6tYPovOkw3459t2CBwGcFYfFRjivcJJc1WC8Q3funIwX8x4fP+R6xL/QuTPNGOblbq/EUDxj9GU+dWKX0oWlQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.15.tgz", + "integrity": "sha512-W+Z5F++wgKAleDABemiyXVnzXgvRFs+GVKThSI+mGgleLWluv0D7Diz4oQpgdpNzh4i2nNDzQtWbjJiqutRp6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.15.tgz", + "integrity": "sha512-Muz/+uGgheShKGqSVS1KsHtCyEzcdOn/W/Xbh6H91Etm+wiIfwZaBn1W58MeGtfI8WA961YMHFYTthBdQs4t+w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.15.tgz", + "integrity": "sha512-DjDa9ywLUUmjhV2Y9wUTIF+1XsmuFGvZoCmOWkli1XcNAh5t25cc7fgsCx4Zi/Uurep3TTLyDiKATgGEg61pkA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", + "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.2", + "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/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.42.0.tgz", + "integrity": "sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@jest/expect-utils": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", + "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", + "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.25.16" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", + "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.4.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@remix-run/router": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.6.3.tgz", + "integrity": "sha512-EXJysQ7J3veRECd0kZFQwYYd5sJMcq2O/m60zu1W2l3oVQ9xtub8jTOtYRE0+M2iomyG/W3Ps7+vp2kna0C27Q==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.25.24", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", + "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", + "dev": true + }, + "node_modules/@testing-library/dom": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.0.0.tgz", + "integrity": "sha512-+/TLgKNFsYUshOY/zXsQOk+PlFQK+eyJ9T13IDVNJEi+M+Un7xlJK+FZKkbGSnf0+7E1G6PlDhkSYQ/GFiruBQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "^5.0.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.4.4", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@testing-library/dom/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "5.16.5", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz", + "integrity": "sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA==", + "dev": true, + "dependencies": { + "@adobe/css-tools": "^4.0.1", + "@babel/runtime": "^7.9.2", + "@types/testing-library__jest-dom": "^5.9.1", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", + "lodash": "^4.17.15", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=8", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/react": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-14.0.0.tgz", + "integrity": "sha512-S04gSNJbYE30TlIMLTzv6QCTzt9AqIF5y6s6SzVFILNcNvbV/jU96GeiTPillGQo+Ny64M/5PV7klNYYgv5Dfg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^9.0.0", + "@types/react-dom": "^18.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz", + "integrity": "sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==", + "dev": true + }, + "node_modules/@types/chai": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", + "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "dev": true + }, + "node_modules/@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "dev": true, + "dependencies": { + "@types/chai": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.4.0.tgz", + "integrity": "sha512-VaywcGQ9tPorCX/Jkkni7RWGFfI11whqzs8dvxF41P17Z+z872thvEvlIbznjPJ02kl1HMX3LmLOonsj2n7HeQ==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/jest/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@types/jest/node_modules/pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.14.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.6.tgz", + "integrity": "sha512-93+VvleD3mXwlLI/xASjw0FzKcwzl3OdTCzm1LaRfqgS21gfFtK3zDXM5Op9TeeMsJVOaJ2VRDpT9q4Y3d0AvA==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.2.12", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.12.tgz", + "integrity": "sha512-ndmBMLCgn38v3SntMeoJaIrO6tGHYKMEBohCUmw8HoLLQdRMOIGXfeYaBTLe2lsFaSB3MOK1VXscYFnmLtTSmw==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.5.tgz", + "integrity": "sha512-sRQsOS/sCLnpQhR4DSKGTtWFE3FZjpQa86KPVbhUqdYMRZ9FEFcfAytKhR/vUG2rH1oFbOOej6cuD7MFSobDRQ==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/testing-library__jest-dom": { + "version": "5.14.5", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz", + "integrity": "sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ==", + "dev": true, + "dependencies": { + "@types/jest": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.22", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.22.tgz", + "integrity": "sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.11.tgz", + "integrity": "sha512-XxuOfTkCUiOSyBWIvHlUraLw/JT/6Io1365RO6ZuI88STKMavJZPNMU0lFcUTeQXEhHiv64CbxYxBNoDVSmghg==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.59.11", + "@typescript-eslint/type-utils": "5.59.11", + "@typescript-eslint/utils": "5.59.11", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.11.tgz", + "integrity": "sha512-s9ZF3M+Nym6CAZEkJJeO2TFHHDsKAM3ecNkLuH4i4s8/RCPnF5JRip2GyviYkeEAcwGMJxkqG9h2dAsnA1nZpA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.59.11", + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/typescript-estree": "5.59.11", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.11.tgz", + "integrity": "sha512-dHFOsxoLFtrIcSj5h0QoBT/89hxQONwmn3FOQ0GOQcLOOXm+MIrS8zEAhs4tWl5MraxCY3ZJpaXQQdFMc2Tu+Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/visitor-keys": "5.59.11" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.11.tgz", + "integrity": "sha512-LZqVY8hMiVRF2a7/swmkStMYSoXMFlzL6sXV6U/2gL5cwnLWQgLEG8tjWPpaE4rMIdZ6VKWwcffPlo1jPfk43g==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.59.11", + "@typescript-eslint/utils": "5.59.11", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.11.tgz", + "integrity": "sha512-epoN6R6tkvBYSc+cllrz+c2sOFWkbisJZWkOE+y3xHtvYaOE6Wk6B8e114McRJwFRjGvYdJwLXQH5c9osME/AA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.11.tgz", + "integrity": "sha512-YupOpot5hJO0maupJXixi6l5ETdrITxeo5eBOeuV7RSKgYdU3G5cxO49/9WRnJq9EMrB7AuTSLH/bqOsXi7wPA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/visitor-keys": "5.59.11", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.11.tgz", + "integrity": "sha512-didu2rHSOMUdJThLk4aZ1Or8IcO3HzCw/ZvEjTTIfjIrcdd5cvSIwwDy2AOlE7htSNp7QIZ10fLMyRCveesMLg==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.59.11", + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/typescript-estree": "5.59.11", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.11.tgz", + "integrity": "sha512-KGYniTGG3AMTuKF9QBD7EIrvufkB6O6uX3knP73xbKLMpH+QRPcgnCxjWXSHjMRuOxFLovljqQgQpR0c7GvjoA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.11", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.0.tgz", + "integrity": "sha512-HX0XzMjL3hhOYm+0s95pb0Z7F8O81G7joUHgfDd/9J/ZZf5k4xX6QAMFkKsHFxaHlf6X7GD7+XuaZ66ULiJuhQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.21.4", + "@babel/plugin-transform-react-jsx-self": "^7.21.0", + "@babel/plugin-transform-react-jsx-source": "^7.19.6", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0" + } + }, + "node_modules/@vitest/expect": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.32.0.tgz", + "integrity": "sha512-VxVHhIxKw9Lux+O9bwLEEk2gzOUe93xuFHy9SzYWnnoYZFYg1NfBtnfnYWiJN7yooJ7KNElCK5YtA7DTZvtXtg==", + "dev": true, + "dependencies": { + "@vitest/spy": "0.32.0", + "@vitest/utils": "0.32.0", + "chai": "^4.3.7" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.32.0.tgz", + "integrity": "sha512-QpCmRxftHkr72xt5A08xTEs9I4iWEXIOCHWhQQguWOKE4QH7DXSKZSOFibuwEIMAD7G0ERvtUyQn7iPWIqSwmw==", + "dev": true, + "dependencies": { + "@vitest/utils": "0.32.0", + "concordance": "^5.0.4", + "p-limit": "^4.0.0", + "pathe": "^1.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/snapshot": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.32.0.tgz", + "integrity": "sha512-yCKorPWjEnzpUxQpGlxulujTcSPgkblwGzAUEL+z01FTUg/YuCDZ8dxr9sHA08oO2EwxzHXNLjQKWJ2zc2a19Q==", + "dev": true, + "dependencies": { + "magic-string": "^0.30.0", + "pathe": "^1.1.0", + "pretty-format": "^27.5.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.32.0.tgz", + "integrity": "sha512-MruAPlM0uyiq3d53BkwTeShXY0rYEfhNGQzVO5GHBmmX3clsxcWp79mMnkOVcV244sNTeDcHbcPFWIjOI4tZvw==", + "dev": true, + "dependencies": { + "tinyspy": "^2.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.32.0.tgz", + "integrity": "sha512-53yXunzx47MmbuvcOPpLaVljHaeSu1G2dHdmy7+9ngMnQIkBQcvwOcoclWFnxDMxFbnq8exAfh3aKSZaK71J5A==", + "dev": true, + "dependencies": { + "concordance": "^5.0.4", + "loupe": "^2.3.6", + "pretty-format": "^27.5.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", + "dev": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz", + "integrity": "sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", + "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", + "dev": true, + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/blueimp-md5": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz", + "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001481", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001481.tgz", + "integrity": "sha512-KCqHwRnaa1InZBtqXzP98LPg0ajCVujMKjqKDhZEthIpAsJl/YEIa3YvXjGXPVqzZVguccuu7ga9KOE1J9rKPQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/concordance": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/concordance/-/concordance-5.0.4.tgz", + "integrity": "sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==", + "dev": true, + "dependencies": { + "date-time": "^3.1.0", + "esutils": "^2.0.3", + "fast-diff": "^1.2.0", + "js-string-escape": "^1.0.1", + "lodash": "^4.17.15", + "md5-hex": "^3.0.1", + "semver": "^7.3.2", + "well-known-symbols": "^2.0.0" + }, + "engines": { + "node": ">=10.18.0 <11 || >=12.14.0 <13 || >=14" + } + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz", + "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==", + "dev": true, + "dependencies": { + "rrweb-cssom": "^0.6.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", + "dev": true + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true + }, + "node_modules/data-urls": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz", + "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/date-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/date-time/-/date-time-3.1.0.tgz", + "integrity": "sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==", + "dev": true, + "dependencies": { + "time-zone": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-equal": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", + "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.2", + "get-intrinsic": "^1.1.3", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true + }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "dev": true, + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.377", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.377.tgz", + "integrity": "sha512-H3BYG6DW5Z+l0xcfXaicJGxrpA4kMlCxnN71+iNX+dBLkRMOdVJqFJiAmbNZZKA1zISpRg17JR03qGifXNsJtw==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-abstract": { + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", + "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.4", + "is-array-buffer": "^3.0.1", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.15.tgz", + "integrity": "sha512-LBUV2VsUIc/iD9ME75qhT4aJj0r75abCVS0jakhFzOtR7TQsqQA5w0tZ+KTKnwl3kXE0MhskNdHDh/I5aCR1Zw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.15", + "@esbuild/android-arm64": "0.17.15", + "@esbuild/android-x64": "0.17.15", + "@esbuild/darwin-arm64": "0.17.15", + "@esbuild/darwin-x64": "0.17.15", + "@esbuild/freebsd-arm64": "0.17.15", + "@esbuild/freebsd-x64": "0.17.15", + "@esbuild/linux-arm": "0.17.15", + "@esbuild/linux-arm64": "0.17.15", + "@esbuild/linux-ia32": "0.17.15", + "@esbuild/linux-loong64": "0.17.15", + "@esbuild/linux-mips64el": "0.17.15", + "@esbuild/linux-ppc64": "0.17.15", + "@esbuild/linux-riscv64": "0.17.15", + "@esbuild/linux-s390x": "0.17.15", + "@esbuild/linux-x64": "0.17.15", + "@esbuild/netbsd-x64": "0.17.15", + "@esbuild/openbsd-x64": "0.17.15", + "@esbuild/sunos-x64": "0.17.15", + "@esbuild/win32-arm64": "0.17.15", + "@esbuild/win32-ia32": "0.17.15", + "@esbuild/win32-x64": "0.17.15" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.42.0.tgz", + "integrity": "sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.42.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "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.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", + "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", + "import-fresh": "^3.0.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.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "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-config-airbnb": { + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz", + "integrity": "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==", + "dev": true, + "dependencies": { + "eslint-config-airbnb-base": "^15.0.0", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5" + }, + "engines": { + "node": "^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.28.0", + "eslint-plugin-react-hooks": "^4.3.0" + } + }, + "node_modules/eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "dev": true, + "dependencies": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.2" + } + }, + "node_modules/eslint-config-airbnb-base/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-config-airbnb-typescript": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-17.0.0.tgz", + "integrity": "sha512-elNiuzD0kPAPTXjFWg+lE24nMdHMtuxgYoD30OyMD6yrW1AhFZPAg27VX7d3tzOErw+dgJTNWfRSDqEcXb4V0g==", + "dev": true, + "dependencies": { + "eslint-config-airbnb-base": "^15.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.13.0", + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.3" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", + "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", + "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", + "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.20.7", + "aria-query": "^5.1.3", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.6.2", + "axobject-query": "^3.1.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.3.3", + "language-tags": "=1.0.5", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.32.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", + "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.8" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "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, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.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-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "dev": true, + "dependencies": { + "acorn": "^8.8.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/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expect": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", + "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-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, + "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 + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "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==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "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 + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jest-diff": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", + "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", + "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.5.0", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-message-util": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", + "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.5.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-util": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", + "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/js-string-escape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", + "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "22.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-22.1.0.tgz", + "integrity": "sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "cssstyle": "^3.0.0", + "data-urls": "^4.0.0", + "decimal.js": "^10.4.3", + "domexception": "^4.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.4", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.6.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.1", + "ws": "^8.13.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", + "dev": true + }, + "node_modules/language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "dev": true, + "dependencies": { + "language-subtag-registry": "~0.3.2" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/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==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", + "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/md5-hex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-3.0.1.tgz", + "integrity": "sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==", + "dev": true, + "dependencies": { + "blueimp-md5": "^2.10.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mlly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.3.0.tgz", + "integrity": "sha512-HT5mcgIQKkOrZecOjOX3DJorTikWXwsBfpcr/MGBkhfWcjiqvnaL/9ppxvIUXfjT6xt4DVIAsN9fMUz1ev4bIw==", + "dev": true, + "dependencies": { + "acorn": "^8.8.2", + "pathe": "^1.1.0", + "pkg-types": "^1.0.3", + "ufo": "^1.1.2" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "dev": true + }, + "node_modules/nwsapi": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.4.tgz", + "integrity": "sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g==", + "dev": true + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "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.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", + "dev": true + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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, + "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 + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.13.0.tgz", + "integrity": "sha512-Si6KnfEnJw7gUQkNa70dlpI1bul46FuSxX5t5WwlUBxE25DAz2BjVkwaK8Y2s242bQrZPXCpmwLPtIO5pv4tXg==", + "dependencies": { + "@remix-run/router": "1.6.3" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.13.0.tgz", + "integrity": "sha512-6Nqoqd7fgwxxVGdbiMHTpDHCYPq62d7Wk1Of7B82vH7ZPwwsRaIa22zRZKPPg413R5REVNiyuQPKDG1bubcOFA==", + "dependencies": { + "@remix-run/router": "1.6.3", + "react-router": "6.13.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.21.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.21.2.tgz", + "integrity": "sha512-c4vC+JZ3bbF4Kqq2TtM7zSKtSyMybFOjqmomFax3xpfYaPZDZ4iz8NMIuBRMjnXOcKYozw7bC6vhJjiWD6JpzQ==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rrweb-cssom": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", + "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", + "dev": true + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "node_modules/std-env": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.2.tgz", + "integrity": "sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==", + "dev": true + }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.1.tgz", + "integrity": "sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==", + "dev": true, + "dependencies": { + "acorn": "^8.8.2" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/time-zone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", + "integrity": "sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tinybench": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz", + "integrity": "sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==", + "dev": true + }, + "node_modules/tinypool": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.5.0.tgz", + "integrity": "sha512-paHQtnrlS1QZYKF/GnLoOM/DN9fqaGOFbCbxzAhwniySnzl9Ebk8w73/dd34DAhe/obUbPAOldTyYXQZxnPBPQ==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.1.1.tgz", + "integrity": "sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", + "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "dev": true, + "dependencies": { + "punycode": "^2.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.1.2.tgz", + "integrity": "sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==", + "dev": true + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/vite": { + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", + "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", + "dev": true, + "dependencies": { + "esbuild": "^0.17.5", + "postcss": "^8.4.23", + "rollup": "^3.21.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.32.0.tgz", + "integrity": "sha512-220P/y8YacYAU+daOAqiGEFXx2A8AwjadDzQqos6wSukjvvTWNqleJSwoUn0ckyNdjHIKoxn93Nh1vWBqEKr3Q==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.2.0", + "pathe": "^1.1.0", + "picocolors": "^1.0.0", + "vite": "^3.0.0 || ^4.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.32.0.tgz", + "integrity": "sha512-SW83o629gCqnV3BqBnTxhB10DAwzwEx3z+rqYZESehUB+eWsJxwcBQx7CKy0otuGMJTYh7qCVuUX23HkftGl/Q==", + "dev": true, + "dependencies": { + "@types/chai": "^4.3.5", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "@vitest/expect": "0.32.0", + "@vitest/runner": "0.32.0", + "@vitest/snapshot": "0.32.0", + "@vitest/spy": "0.32.0", + "@vitest/utils": "0.32.0", + "acorn": "^8.8.2", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.7", + "concordance": "^5.0.4", + "debug": "^4.3.4", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.0", + "pathe": "^1.1.0", + "picocolors": "^1.0.0", + "std-env": "^3.3.2", + "strip-literal": "^1.0.1", + "tinybench": "^2.5.0", + "tinypool": "^0.5.0", + "vite": "^3.0.0 || ^4.0.0", + "vite-node": "0.32.0", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@vitest/browser": "*", + "@vitest/ui": "*", + "happy-dom": "*", + "jsdom": "*", + "playwright": "*", + "safaridriver": "*", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } + } + }, + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "dev": true, + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/well-known-symbols": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-2.0.0.tgz", + "integrity": "sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz", + "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==", + "dev": true, + "dependencies": { + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/src/client/package.json b/src/client/package.json new file mode 100644 index 0000000..74ff00f --- /dev/null +++ b/src/client/package.json @@ -0,0 +1,43 @@ +{ + "name": "react-ts-app", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview", + "test": "vitest", + "lint": "eslint --ext .js,.cjs,.ts,.tsx .", + "lint:fix": "eslint --ext .js,.cjs,.ts,.tsx . --fix", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "^6.13.0" + }, + "devDependencies": { + "@testing-library/jest-dom": "^5.16.5", + "@testing-library/react": "^14.0.0", + "@types/react": "^18.2.12", + "@types/react-dom": "^18.2.5", + "@typescript-eslint/eslint-plugin": "^5.59.11", + "@typescript-eslint/parser": "^5.59.11", + "@vitejs/plugin-react": "^4.0.0", + "eslint": "^8.42.0", + "eslint-config-airbnb": "^19.0.4", + "eslint-config-airbnb-typescript": "^17.0.0", + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-react": "^7.32.2", + "eslint-plugin-react-hooks": "^4.6.0", + "jsdom": "^22.1.0", + "prettier": "^2.8.8", + "typescript": "^5.2.2", + "vite": "^4.3.9", + "vitest": "^0.32.0" + } +} diff --git a/src/client/src/App.test.tsx b/src/client/src/App.test.tsx new file mode 100644 index 0000000..2211672 --- /dev/null +++ b/src/client/src/App.test.tsx @@ -0,0 +1,31 @@ +import { describe, it } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import { MemoryRouter } from 'react-router-dom'; + +import { WrappedApp, App } from './App'; + +describe('App', () => { + it('Renders hello world', () => { + // ARRANGE + render(); + // ACT + // EXPECT + expect( + screen.getByRole('heading', { + level: 1, + }) + ).toHaveTextContent('Hello World'); + }); + it('Renders not found if invalid path', () => { + render( + + + + ); + expect( + screen.getByRole('heading', { + level: 1, + }) + ).toHaveTextContent('Not Found'); + }); +}); diff --git a/src/client/src/App.tsx b/src/client/src/App.tsx new file mode 100644 index 0000000..1f03026 --- /dev/null +++ b/src/client/src/App.tsx @@ -0,0 +1,20 @@ +import { HashRouter, Route, Routes } from 'react-router-dom'; +import Home from './pages/Home'; +import NotFound from './pages/NotFound'; + +export function App() { + return ( + + } /> + } /> + + ); +} + +export function WrappedApp() { + return ( + + + + ); +} diff --git a/src/client/src/index.css b/src/client/src/index.css new file mode 100644 index 0000000..e69de29 diff --git a/src/client/src/main.tsx b/src/client/src/main.tsx new file mode 100644 index 0000000..56ee483 --- /dev/null +++ b/src/client/src/main.tsx @@ -0,0 +1,10 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import { WrappedApp } from './App'; +import './index.css'; + +ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( + + + +); diff --git a/src/client/src/pages/Home.tsx b/src/client/src/pages/Home.tsx new file mode 100644 index 0000000..a5ed13a --- /dev/null +++ b/src/client/src/pages/Home.tsx @@ -0,0 +1,5 @@ +function Home() { + return

Hello World

; +} + +export default Home; diff --git a/src/client/src/pages/NotFound.tsx b/src/client/src/pages/NotFound.tsx new file mode 100644 index 0000000..e87d69f --- /dev/null +++ b/src/client/src/pages/NotFound.tsx @@ -0,0 +1,12 @@ +import { Link } from 'react-router-dom'; + +function NotFound() { + return ( + <> +

Not Found

+ GO HOME + + ); +} + +export default NotFound; diff --git a/src/client/src/setupTests.ts b/src/client/src/setupTests.ts new file mode 100644 index 0000000..e3dddb2 --- /dev/null +++ b/src/client/src/setupTests.ts @@ -0,0 +1,5 @@ +/* eslint-disable import/no-extraneous-dependencies */ +import matchers from '@testing-library/jest-dom/matchers'; +import { expect } from 'vitest'; + +expect.extend(matchers); diff --git a/src/client/src/vite-env.d.ts b/src/client/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/src/client/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/src/client/tsconfig.json b/src/client/tsconfig.json new file mode 100644 index 0000000..512010c --- /dev/null +++ b/src/client/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "allowJs": false, + "skipLibCheck": true, + "esModuleInterop": false, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "module": "ESNext", + "moduleResolution": "Node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx" + }, + "include": [ + "vite.config.ts", + ".eslintrc.cjs", + "src" + ], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/src/client/tsconfig.node.json b/src/client/tsconfig.node.json new file mode 100644 index 0000000..9d31e2a --- /dev/null +++ b/src/client/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/src/client/vite.config.ts b/src/client/vite.config.ts new file mode 100644 index 0000000..44ef077 --- /dev/null +++ b/src/client/vite.config.ts @@ -0,0 +1,16 @@ +/* eslint-disable import/no-extraneous-dependencies */ +/// +/// + +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], + test: { + globals: true, + environment: 'jsdom', + setupFiles: ['./src/setupTests.ts'], + }, +}); From 6f5fbc226379ce9f78f8d915e8f7adb35b1b42c1 Mon Sep 17 00:00:00 2001 From: qstommyshu Date: Sun, 21 Jan 2024 11:21:16 -0500 Subject: [PATCH 02/34] Add Auth and Practitioner Page --- src/client/src/App.tsx | 10 +- src/client/src/pages/Auth.tsx | 123 +++++++++++++++++++++++ src/client/src/pages/Practitioner.tsx | 134 ++++++++++++++++++++++++++ 3 files changed, 266 insertions(+), 1 deletion(-) create mode 100644 src/client/src/pages/Auth.tsx create mode 100644 src/client/src/pages/Practitioner.tsx diff --git a/src/client/src/App.tsx b/src/client/src/App.tsx index 1f03026..144d971 100644 --- a/src/client/src/App.tsx +++ b/src/client/src/App.tsx @@ -1,12 +1,20 @@ import { HashRouter, Route, Routes } from 'react-router-dom'; import Home from './pages/Home'; import NotFound from './pages/NotFound'; +import Instructor from './pages/Instructor'; +import Practitioner from './pages/Practitioner'; +import Auth from './pages/Auth'; export function App() { return ( - } /> + } /> + } /> + } /> + } /> + } /> } /> + } /> ); } diff --git a/src/client/src/pages/Auth.tsx b/src/client/src/pages/Auth.tsx new file mode 100644 index 0000000..68f83ac --- /dev/null +++ b/src/client/src/pages/Auth.tsx @@ -0,0 +1,123 @@ +import React, { useRef, useState } from 'react'; +import { Link } from 'react-router-dom'; + +const Auth = () => { + const selfVideoRef = useRef(null); + const remoteVideoRef = useRef(null); + + const getVideo = () => { + navigator.mediaDevices + .getUserMedia({ video: true, audio: false }) + .then((stream) => { + // add stream to current video element + const video = selfVideoRef.current; + video!.srcObject = stream; + // play video from selfVideo Ref + video?.play(); + }) + .catch((err) => { + console.error('OH NO!!!', err); + }); + }; + + const closeRemote = async (pc: RTCPeerConnection) => { + pc.close(); + // const tracks = await remoteVideoRef.current!.srcObject.getTracks().map((track) => track.stop()); + remoteVideoRef.current!.srcObject = null; + }; + + const closeVideo = () => { + const video = selfVideoRef.current; + video!.srcObject = null; + }; + + const createConsumerPeerConnection = () => { + const config = { + sdpSemantics: 'unified-plan', + iceServers: [{ urls: 'stun:stun.l.google.com:19302' }], + }; + const pc = new RTCPeerConnection(config); + pc.addEventListener('track', (event) => { + if (event.track.kind === 'video') { + const remoteVideo = remoteVideoRef.current; + let rest; + [remoteVideo!.srcObject, ...rest] = event.streams; + console.log('remoteVideo'); + } + }); + pc.addTransceiver('video', { direction: 'recvonly' }); + pc.addTransceiver('audio', { direction: 'recvonly' }); + return pc; + }; + + const createPeerConnection = () => { + const config = { + sdpSemantics: 'unified-plan', + iceServers: [{ urls: 'stun:stun.l.google.com:19302' }], + }; + const pc = new RTCPeerConnection(config); + return pc; + }; + + const broadcast = async (pc: RTCPeerConnection) => { + const stream = await navigator.mediaDevices.getUserMedia({ + video: true, + audio: false, + }); + stream.getTracks().forEach((track) => { + pc.addTrack(track, stream); + }); + const offer = await pc?.createOffer(); + await pc?.setLocalDescription(offer); + const requestSdp = pc.localDescription; + const sdp = await fetch('http://127.0.0.1:8080/broadcast', { + body: JSON.stringify({ + sdp: requestSdp?.sdp, + type: requestSdp?.type, + // video transform + video_transform: 'skeleton', + }), + headers: { + 'Content-Type': 'application/json', + }, + method: 'POST', + }); + const answer = await sdp.json(); + await pc?.setRemoteDescription(answer); + remoteVideoRef.current?.play(); + }; + + const consume = async (pc: RTCPeerConnection) => { + const offer = await pc?.createOffer(); + await pc?.setLocalDescription(offer); + const requestSdp = pc.localDescription; + const sdp = await fetch('http://127.0.0.1:8080/consumer', { + body: JSON.stringify({ + sdp: requestSdp?.sdp, + type: requestSdp?.type, + }), + headers: { + 'Content-Type': 'application/json', + }, + method: 'POST', + }); + const answer = await sdp.json(); + await pc?.setRemoteDescription(answer); + remoteVideoRef.current?.play(); + }; + + let consumer: RTCPeerConnection; + + return ( +<> + + + + ); +} + +export default Auth; diff --git a/src/client/src/pages/Practitioner.tsx b/src/client/src/pages/Practitioner.tsx new file mode 100644 index 0000000..8f7c6f7 --- /dev/null +++ b/src/client/src/pages/Practitioner.tsx @@ -0,0 +1,134 @@ +import React, { useRef, useState } from 'react'; + +function Practitioner() { + const selfVideoRef = useRef(null); + const remoteVideoRef = useRef(null); + + const getVideo = () => { + navigator.mediaDevices + .getUserMedia({ video: true, audio: false }) + .then((stream) => { + // add stream to current video element + const video = selfVideoRef.current; + video!.srcObject = stream; + // play video from selfVideo Ref + video?.play(); + }) + .catch((err) => { + console.error('OH NO!!!', err); + }); + }; + + const closeRemote = async (pc: RTCPeerConnection) => { + pc.close(); + // const tracks = await remoteVideoRef.current!.srcObject.getTracks().map((track) => track.stop()); + remoteVideoRef.current!.srcObject = null; + }; + + const closeVideo = () => { + const video = selfVideoRef.current; + video!.srcObject = null; + }; + + const createConsumerPeerConnection = () => { + const config = { + sdpSemantics: 'unified-plan', + iceServers: [{ urls: 'stun:stun.l.google.com:19302' }], + }; + const pc = new RTCPeerConnection(config); + pc.addEventListener('track', (event) => { + if (event.track.kind === 'video') { + const remoteVideo = remoteVideoRef.current; + let rest; + [remoteVideo!.srcObject, ...rest] = event.streams; + console.log('remoteVideo'); + } + }); + pc.addTransceiver('video', { direction: 'recvonly' }); + pc.addTransceiver('audio', { direction: 'recvonly' }); + return pc; + }; + + const createPeerConnection = () => { + const config = { + sdpSemantics: 'unified-plan', + iceServers: [{ urls: 'stun:stun.l.google.com:19302' }], + }; + const pc = new RTCPeerConnection(config); + return pc; + }; + + const broadcast = async (pc: RTCPeerConnection) => { + const stream = await navigator.mediaDevices.getUserMedia({ + video: true, + audio: false, + }); + stream.getTracks().forEach((track) => { + pc.addTrack(track, stream); + }); + const offer = await pc?.createOffer(); + await pc?.setLocalDescription(offer); + const requestSdp = pc.localDescription; + const sdp = await fetch('http://127.0.0.1:8080/broadcast', { + body: JSON.stringify({ + sdp: requestSdp?.sdp, + type: requestSdp?.type, + // video transform + video_transform: 'skeleton', + }), + headers: { + 'Content-Type': 'application/json', + }, + method: 'POST', + }); + const answer = await sdp.json(); + await pc?.setRemoteDescription(answer); + remoteVideoRef.current?.play(); + }; + + const consume = async (pc: RTCPeerConnection) => { + const offer = await pc?.createOffer(); + await pc?.setLocalDescription(offer); + const requestSdp = pc.localDescription; + const sdp = await fetch('http://127.0.0.1:8080/consumer', { + body: JSON.stringify({ + sdp: requestSdp?.sdp, + type: requestSdp?.type, + }), + headers: { + 'Content-Type': 'application/json', + }, + method: 'POST', + }); + const answer = await sdp.json(); + await pc?.setRemoteDescription(answer); + remoteVideoRef.current?.play(); + }; + + let consumer: RTCPeerConnection; + + return ( +
+
+
+
+ +
+
+ +
+
+ ); +} + +export default Practitioner; From 2f0673bdfc97b7779cc4901c9b30969452b71751 Mon Sep 17 00:00:00 2001 From: qstommyshu Date: Sun, 21 Jan 2024 11:24:49 -0500 Subject: [PATCH 03/34] Add Instructor page with video broadcasting and consuming --- src/client/src/App.tsx | 2 +- src/client/src/pages/Instructor.tsx | 156 ++++++++++++++++++++++++++++ 2 files changed, 157 insertions(+), 1 deletion(-) create mode 100644 src/client/src/pages/Instructor.tsx diff --git a/src/client/src/App.tsx b/src/client/src/App.tsx index 144d971..13fb114 100644 --- a/src/client/src/App.tsx +++ b/src/client/src/App.tsx @@ -14,7 +14,7 @@ export function App() { } /> } /> } /> - } /> + } /> ); } diff --git a/src/client/src/pages/Instructor.tsx b/src/client/src/pages/Instructor.tsx new file mode 100644 index 0000000..3a6cd83 --- /dev/null +++ b/src/client/src/pages/Instructor.tsx @@ -0,0 +1,156 @@ +import React, { useRef, useState } from 'react'; + +function Instructor() { + const selfVideoRef = useRef(null); + const remoteVideoRef = useRef(null); + + const getVideo = () => { + navigator.mediaDevices + .getUserMedia({ video: true, audio: false }) + .then((stream) => { + // add stream to current video element + const video = selfVideoRef.current; + video!.srcObject = stream; + // play video from selfVideo Ref + video?.play(); + }) + .catch((err) => { + console.error('OH NO!!!', err); + }); + }; + + const closeRemote = async (pc: RTCPeerConnection) => { + pc.close(); + // const tracks = await remoteVideoRef.current!.srcObject.getTracks().map((track) => track.stop()); + remoteVideoRef.current!.srcObject = null; + }; + + const closeVideo = () => { + const video = selfVideoRef.current; + video!.srcObject = null; + }; + + const createConsumerPeerConnection = () => { + const config = { + sdpSemantics: 'unified-plan', + iceServers: [{ urls: 'stun:stun.l.google.com:19302' }], + }; + const pc = new RTCPeerConnection(config); + pc.addEventListener('track', (event) => { + if (event.track.kind === 'video') { + const remoteVideo = remoteVideoRef.current; + let rest; + [remoteVideo!.srcObject, ...rest] = event.streams; + console.log('remoteVideo'); + } + }); + pc.addTransceiver('video', { direction: 'recvonly' }); + pc.addTransceiver('audio', { direction: 'recvonly' }); + return pc; + }; + + const createPeerConnection = () => { + const config = { + sdpSemantics: 'unified-plan', + iceServers: [{ urls: 'stun:stun.l.google.com:19302' }], + }; + const pc = new RTCPeerConnection(config); + return pc; + }; + + const broadcast = async (pc: RTCPeerConnection) => { + const stream = await navigator.mediaDevices.getUserMedia({ + video: true, + audio: false, + }); + stream.getTracks().forEach((track) => { + pc.addTrack(track, stream); + }); + const offer = await pc?.createOffer(); + await pc?.setLocalDescription(offer); + const requestSdp = pc.localDescription; + const sdp = await fetch('http://127.0.0.1:8080/broadcast', { + body: JSON.stringify({ + sdp: requestSdp?.sdp, + type: requestSdp?.type, + // video transform + video_transform: 'skeleton', + }), + headers: { + 'Content-Type': 'application/json', + }, + method: 'POST', + }); + const answer = await sdp.json(); + await pc?.setRemoteDescription(answer); + remoteVideoRef.current?.play(); + }; + + const consume = async (pc: RTCPeerConnection) => { + const offer = await pc?.createOffer(); + await pc?.setLocalDescription(offer); + const requestSdp = pc.localDescription; + const sdp = await fetch('http://127.0.0.1:8080/consumer', { + body: JSON.stringify({ + sdp: requestSdp?.sdp, + type: requestSdp?.type, + }), + headers: { + 'Content-Type': 'application/json', + }, + method: 'POST', + }); + const answer = await sdp.json(); + await pc?.setRemoteDescription(answer); + remoteVideoRef.current?.play(); + }; + + let broadcaster: RTCPeerConnection; + let consumer: RTCPeerConnection; + + return ( +
+
+ +
+
+ + + + +
+
+ +
+ +
+ ); +} + +export default Instructor; From c5bc7cb81df8e02c9d2699e6cb04868e03f608f0 Mon Sep 17 00:00:00 2001 From: qstommyshu Date: Tue, 23 Jan 2024 20:04:40 -0500 Subject: [PATCH 04/34] Add MUI modules and dependencies --- src/client/package-lock.json | 645 ++++++++++++++++-- src/client/package.json | 3 + src/client/src/App.tsx | 10 +- src/client/src/modules/Auth.tsx | 32 + src/client/src/modules/Button.tsx | 14 + src/client/src/{pages => modules}/Home.tsx | 0 .../src/{pages => modules}/Instructor.tsx | 90 ++- .../src/{pages => modules}/NotFound.tsx | 0 .../src/{pages => modules}/Practitioner.tsx | 126 ++-- src/client/src/pages/Auth.tsx | 123 ---- 10 files changed, 774 insertions(+), 269 deletions(-) create mode 100644 src/client/src/modules/Auth.tsx create mode 100644 src/client/src/modules/Button.tsx rename src/client/src/{pages => modules}/Home.tsx (100%) rename src/client/src/{pages => modules}/Instructor.tsx (66%) rename src/client/src/{pages => modules}/NotFound.tsx (100%) rename src/client/src/{pages => modules}/Practitioner.tsx (52%) delete mode 100644 src/client/src/pages/Auth.tsx diff --git a/src/client/package-lock.json b/src/client/package-lock.json index 2e4a401..8f48288 100644 --- a/src/client/package-lock.json +++ b/src/client/package-lock.json @@ -8,6 +8,9 @@ "name": "react-ts-app", "version": "0.0.0", "dependencies": { + "@emotion/react": "^11.11.3", + "@emotion/styled": "^11.11.0", + "@mui/material": "^5.15.5", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.13.0" @@ -59,7 +62,6 @@ "version": "7.22.13", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, "dependencies": { "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" @@ -72,7 +74,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -84,7 +85,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -98,7 +98,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -106,14 +105,12 @@ "node_modules/@babel/code-frame/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, "engines": { "node": ">=0.8.0" } @@ -122,7 +119,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, "engines": { "node": ">=4" } @@ -131,7 +127,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -282,7 +277,6 @@ "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", - "dev": true, "dependencies": { "@babel/types": "^7.21.4" }, @@ -346,7 +340,6 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -355,7 +348,6 @@ "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -387,7 +379,6 @@ "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", @@ -401,7 +392,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -413,7 +403,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -427,7 +416,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -435,14 +423,12 @@ "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, "engines": { "node": ">=0.8.0" } @@ -451,7 +437,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, "engines": { "node": ">=4" } @@ -460,7 +445,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -511,12 +495,11 @@ } }, "node_modules/@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", - "dev": true, + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.8.tgz", + "integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==", "dependencies": { - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" @@ -561,7 +544,6 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", - "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.20", @@ -571,6 +553,139 @@ "node": ">=6.9.0" } }, + "node_modules/@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "dependencies": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/react": { + "version": "11.11.3", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.3.tgz", + "integrity": "sha512-Cnn0kuq4DoONOMcnoVsTOR8E+AdnKFf//6kUWc4LCdnxj31pZWn7rIULd6Y7/Js1PiPHzn7SKCM9vB/jBni8eA==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.3.tgz", + "integrity": "sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==", + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "node_modules/@emotion/styled": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", + "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.1", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, "node_modules/@esbuild/android-arm": { "version": "0.17.15", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.15.tgz", @@ -994,6 +1109,40 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@floating-ui/core": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.3.tgz", + "integrity": "sha512-O0WKDOo0yhJuugCx6trZQj5jVJ9yR0ystG2JaNAemYUWce+pmM6WUEFIibnWyEJKdrDxhm75NoSRME35FNaM/Q==", + "dependencies": { + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.4.tgz", + "integrity": "sha512-jByEsHIY+eEdCjnTVu+E3ephzTOzkQ8hgUfGwos+bg7NlH33Zc5uO+QHz1mrQUOgIKKDD1RtS201P9NvAfq3XQ==", + "dependencies": { + "@floating-ui/core": "^1.5.3", + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.6.tgz", + "integrity": "sha512-IB8aCRFxr8nFkdYZgH+Otd9EVQPJoynxeFRGTB8voPoZMRWo8XjYuCRgpI1btvuKY69XMiLnW+ym7zoBHM90Rw==", + "dependencies": { + "@floating-ui/dom": "^1.5.4" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", + "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", @@ -1131,6 +1280,236 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, + "node_modules/@mui/base": { + "version": "5.0.0-beta.32", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.32.tgz", + "integrity": "sha512-4VptvYeLUYMJhZapWBkD50GmKfOc0XT381KJcTK3ncZYIl8MdBhpR6l8jOyeP5cixUPBJhstjrnmQEAHjCLriw==", + "dependencies": { + "@babel/runtime": "^7.23.8", + "@floating-ui/react-dom": "^2.0.5", + "@mui/types": "^7.2.13", + "@mui/utils": "^5.15.5", + "@popperjs/core": "^2.11.8", + "clsx": "^2.1.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "5.15.5", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.5.tgz", + "integrity": "sha512-VhT8klyXy8GrWrARqLMoM6Nzz809Jc3Wn5wd7WOZfre2vFO1rBV1dBANAPBhBqpaQI0HCMRTWEYoSyOFgRnz4A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/material": { + "version": "5.15.5", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.5.tgz", + "integrity": "sha512-2KfA39f/UWeQl0O22UJs3x1nG3chYlyu9wnux5vTnxUTLzkgYIzQIHaH+ZOGpv5JiZBMKktAPNfhqyhSaQ49qQ==", + "dependencies": { + "@babel/runtime": "^7.23.8", + "@mui/base": "5.0.0-beta.32", + "@mui/core-downloads-tracker": "^5.15.5", + "@mui/system": "^5.15.5", + "@mui/types": "^7.2.13", + "@mui/utils": "^5.15.5", + "@types/react-transition-group": "^4.4.10", + "clsx": "^2.1.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1", + "react-is": "^18.2.0", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/@mui/private-theming": { + "version": "5.15.5", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.5.tgz", + "integrity": "sha512-HU1KCyGNcJFsUamTbOM539ZDZJNI/XU7sZFdsN29glktUf+T6hNvDuO2ISinBiLTZy7Ab3R6DSSoYXRrLc4uwQ==", + "dependencies": { + "@babel/runtime": "^7.23.8", + "@mui/utils": "^5.15.5", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "5.15.5", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.5.tgz", + "integrity": "sha512-xoMUd8h270thNL7ZsOzmlluIAMsQg/HT7SCdRjPBVle+XHgTKaiWiRy1ekDOsrrF0rhjME3T7xeeUq2G269UUw==", + "dependencies": { + "@babel/runtime": "^7.23.8", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "5.15.5", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.5.tgz", + "integrity": "sha512-DMv2vGjUKaDt/m0RlzvLjpKiS5V0LoBhiMUHf5pWdj6uoNlN4FuKUe4pFeYmQMIO5DnVZKybmpPepfkdfEH+Og==", + "dependencies": { + "@babel/runtime": "^7.23.8", + "@mui/private-theming": "^5.15.5", + "@mui/styled-engine": "^5.15.5", + "@mui/types": "^7.2.13", + "@mui/utils": "^5.15.5", + "clsx": "^2.1.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.2.13", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.13.tgz", + "integrity": "sha512-qP9OgacN62s+l8rdDhSFRe05HWtLLJ5TGclC9I1+tQngbssu0m2dmFZs+Px53AcOs9fD7TbYd4gc9AXzVqO/+g==", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.15.5", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.5.tgz", + "integrity": "sha512-jEywgaMGZWPSlVFO7ZZAyXxNeLmq5XBp5At9Ne/sGohRJdesUcdxvyi8TP3odJxwQuL5L6PJV+JQ4DyIDM849A==", + "dependencies": { + "@babel/runtime": "^7.23.8", + "@types/prop-types": "^15.7.11", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1166,6 +1545,15 @@ "node": ">= 8" } }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, "node_modules/@remix-run/router": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.6.3.tgz", @@ -1369,17 +1757,20 @@ "integrity": "sha512-93+VvleD3mXwlLI/xASjw0FzKcwzl3OdTCzm1LaRfqgS21gfFtK3zDXM5Op9TeeMsJVOaJ2VRDpT9q4Y3d0AvA==", "dev": true }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" + }, "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "dev": true + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" }, "node_modules/@types/react": { "version": "18.2.12", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.12.tgz", "integrity": "sha512-ndmBMLCgn38v3SntMeoJaIrO6tGHYKMEBohCUmw8HoLLQdRMOIGXfeYaBTLe2lsFaSB3MOK1VXscYFnmLtTSmw==", - "dev": true, "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -1395,11 +1786,18 @@ "@types/react": "*" } }, + "node_modules/@types/react-transition-group": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", + "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/scheduler": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "dev": true + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" }, "node_modules/@types/semver": { "version": "7.5.0", @@ -1970,6 +2368,20 @@ "deep-equal": "^2.0.5" } }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2058,7 +2470,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "engines": { "node": ">=6" } @@ -2138,6 +2549,14 @@ "node": ">=8" } }, + "node_modules/clsx": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", + "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "engines": { + "node": ">=6" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2202,8 +2621,22 @@ "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } }, "node_modules/cross-spawn": { "version": "7.0.3", @@ -2238,10 +2671,9 @@ } }, "node_modules/csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", - "dev": true + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "node_modules/damerau-levenshtein": { "version": "1.0.8", @@ -2408,6 +2840,15 @@ "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/domexception": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", @@ -2444,6 +2885,14 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "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==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/es-abstract": { "version": "1.21.1", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", @@ -2601,7 +3050,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, "engines": { "node": ">=10" }, @@ -3226,6 +3674,11 @@ "node": ">=8" } }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -3307,8 +3760,7 @@ "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/function.prototype.name": { "version": "1.1.5", @@ -3495,7 +3947,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -3572,6 +4023,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/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==" + }, "node_modules/html-encoding-sniffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", @@ -3636,7 +4100,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -3726,6 +4189,11 @@ "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==" + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -3770,7 +4238,6 @@ "version": "2.11.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, "dependencies": { "has": "^1.0.3" }, @@ -4322,6 +4789,11 @@ "node": ">=4" } }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -4393,6 +4865,11 @@ "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", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, "node_modules/local-pkg": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", @@ -4631,7 +5108,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -4809,7 +5285,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "dependencies": { "callsites": "^3.0.0" }, @@ -4817,6 +5292,23 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", @@ -4859,14 +5351,12 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, "engines": { "node": ">=8" } @@ -5009,7 +5499,6 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -5019,8 +5508,7 @@ "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 + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/psl": { "version": "1.9.0", @@ -5131,6 +5619,21 @@ "react-dom": ">=16.8" } }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -5145,10 +5648,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/regexp.prototype.flags": { "version": "1.4.3", @@ -5177,7 +5679,6 @@ "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, "dependencies": { "is-core-module": "^2.9.0", "path-parse": "^1.0.7", @@ -5194,7 +5695,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, "engines": { "node": ">=4" } @@ -5392,6 +5892,14 @@ "node": ">=8" } }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -5550,6 +6058,11 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -5566,7 +6079,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -5623,7 +6135,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, "engines": { "node": ">=4" } @@ -6203,6 +6714,14 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/src/client/package.json b/src/client/package.json index 74ff00f..394f921 100644 --- a/src/client/package.json +++ b/src/client/package.json @@ -13,6 +13,9 @@ "typecheck": "tsc --noEmit" }, "dependencies": { + "@emotion/react": "^11.11.3", + "@emotion/styled": "^11.11.0", + "@mui/material": "^5.15.5", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.13.0" diff --git a/src/client/src/App.tsx b/src/client/src/App.tsx index 13fb114..5ed35ed 100644 --- a/src/client/src/App.tsx +++ b/src/client/src/App.tsx @@ -1,9 +1,9 @@ import { HashRouter, Route, Routes } from 'react-router-dom'; -import Home from './pages/Home'; -import NotFound from './pages/NotFound'; -import Instructor from './pages/Instructor'; -import Practitioner from './pages/Practitioner'; -import Auth from './pages/Auth'; +import Home from './modules/Home'; +import NotFound from './modules/NotFound'; +import Instructor from './modules/Instructor'; +import Practitioner from './modules/Practitioner'; +import Auth from './modules/Auth'; export function App() { return ( diff --git a/src/client/src/modules/Auth.tsx b/src/client/src/modules/Auth.tsx new file mode 100644 index 0000000..9b887da --- /dev/null +++ b/src/client/src/modules/Auth.tsx @@ -0,0 +1,32 @@ +import React, { useRef, useState } from 'react'; +import { Link } from 'react-router-dom'; +import { Button } from '@mui/material'; + +function Auth() { + return ( + <> +

Hi there,

+

Welcome to MotionMingle!

+

Are you a Tai Chi instructor or a practitioner?

+

Hi! I'm a

+ + + + ); +} + +export default Auth; diff --git a/src/client/src/modules/Button.tsx b/src/client/src/modules/Button.tsx new file mode 100644 index 0000000..c2ec49b --- /dev/null +++ b/src/client/src/modules/Button.tsx @@ -0,0 +1,14 @@ +import React, { useRef, useState } from 'react'; +import { Link } from 'react-router-dom'; +import { Button as MUIButton } from '@mui/material'; + +function Button(props: { displayText: string; buttonColor: string }) { + const { displayText, buttonColor } = props; + return ( + + {displayText} + + ); +} + +export default Button; diff --git a/src/client/src/pages/Home.tsx b/src/client/src/modules/Home.tsx similarity index 100% rename from src/client/src/pages/Home.tsx rename to src/client/src/modules/Home.tsx diff --git a/src/client/src/pages/Instructor.tsx b/src/client/src/modules/Instructor.tsx similarity index 66% rename from src/client/src/pages/Instructor.tsx rename to src/client/src/modules/Instructor.tsx index 3a6cd83..22d7e80 100644 --- a/src/client/src/pages/Instructor.tsx +++ b/src/client/src/modules/Instructor.tsx @@ -1,10 +1,25 @@ -import React, { useRef, useState } from 'react'; +import React, { useRef, useState, useEffect } from 'react'; +import { + Select, + MenuItem, + FormControl, + InputLabel, + SelectChangeEvent, + Button, +} from '@mui/material'; function Instructor() { const selfVideoRef = useRef(null); const remoteVideoRef = useRef(null); - const getVideo = () => { + const [selectedAnnotation, setSelectedAnnotation] = useState(''); + const [isConnected, setIsConnected] = useState(false); + + const selectNewAnnotation = (event: SelectChangeEvent) => { + setSelectedAnnotation(event.target.value); + }; + + const getSelfVideo = () => { navigator.mediaDevices .getUserMedia({ video: true, audio: false }) .then((stream) => { @@ -19,10 +34,15 @@ function Instructor() { }); }; + useEffect(() => { + getSelfVideo(); + }, []); + const closeRemote = async (pc: RTCPeerConnection) => { - pc.close(); + // pc.close(); // const tracks = await remoteVideoRef.current!.srcObject.getTracks().map((track) => track.stop()); remoteVideoRef.current!.srcObject = null; + setIsConnected(false); }; const closeVideo = () => { @@ -74,7 +94,7 @@ function Instructor() { sdp: requestSdp?.sdp, type: requestSdp?.type, // video transform - video_transform: 'skeleton', + video_transform: selectedAnnotation, }), headers: { 'Content-Type': 'application/json', @@ -84,6 +104,7 @@ function Instructor() { const answer = await sdp.json(); await pc?.setRemoteDescription(answer); remoteVideoRef.current?.play(); + setIsConnected(true); }; const consume = async (pc: RTCPeerConnection) => { @@ -110,45 +131,70 @@ function Instructor() { return (
+ Instructor + + Annotation + +
- - - + ) : ( + + )} + + Check Annotated Video +
-
); } diff --git a/src/client/src/pages/NotFound.tsx b/src/client/src/modules/NotFound.tsx similarity index 100% rename from src/client/src/pages/NotFound.tsx rename to src/client/src/modules/NotFound.tsx diff --git a/src/client/src/pages/Practitioner.tsx b/src/client/src/modules/Practitioner.tsx similarity index 52% rename from src/client/src/pages/Practitioner.tsx rename to src/client/src/modules/Practitioner.tsx index 8f7c6f7..14a87bb 100644 --- a/src/client/src/pages/Practitioner.tsx +++ b/src/client/src/modules/Practitioner.tsx @@ -1,33 +1,29 @@ -import React, { useRef, useState } from 'react'; +import React, { useEffect, useRef, useState } from 'react'; +import { + Select, + MenuItem, + FormControl, + InputLabel, + SelectChangeEvent, + Button, +} from '@mui/material'; +import Test from './Button'; function Practitioner() { - const selfVideoRef = useRef(null); const remoteVideoRef = useRef(null); - const getVideo = () => { - navigator.mediaDevices - .getUserMedia({ video: true, audio: false }) - .then((stream) => { - // add stream to current video element - const video = selfVideoRef.current; - video!.srcObject = stream; - // play video from selfVideo Ref - video?.play(); - }) - .catch((err) => { - console.error('OH NO!!!', err); - }); + const [selectedAnnotation, setSelectedAnnotation] = useState(''); + const [isConnected, setIsConnected] = useState(false); + + const selectNewAnnotation = (event: SelectChangeEvent) => { + setSelectedAnnotation(event.target.value); }; const closeRemote = async (pc: RTCPeerConnection) => { - pc.close(); + // pc.close(); // const tracks = await remoteVideoRef.current!.srcObject.getTracks().map((track) => track.stop()); remoteVideoRef.current!.srcObject = null; - }; - - const closeVideo = () => { - const video = selfVideoRef.current; - video!.srcObject = null; + setIsConnected(false); }; const createConsumerPeerConnection = () => { @@ -58,34 +54,6 @@ function Practitioner() { return pc; }; - const broadcast = async (pc: RTCPeerConnection) => { - const stream = await navigator.mediaDevices.getUserMedia({ - video: true, - audio: false, - }); - stream.getTracks().forEach((track) => { - pc.addTrack(track, stream); - }); - const offer = await pc?.createOffer(); - await pc?.setLocalDescription(offer); - const requestSdp = pc.localDescription; - const sdp = await fetch('http://127.0.0.1:8080/broadcast', { - body: JSON.stringify({ - sdp: requestSdp?.sdp, - type: requestSdp?.type, - // video transform - video_transform: 'skeleton', - }), - headers: { - 'Content-Type': 'application/json', - }, - method: 'POST', - }); - const answer = await sdp.json(); - await pc?.setRemoteDescription(answer); - remoteVideoRef.current?.play(); - }; - const consume = async (pc: RTCPeerConnection) => { const offer = await pc?.createOffer(); await pc?.setLocalDescription(offer); @@ -103,30 +71,76 @@ function Practitioner() { const answer = await sdp.json(); await pc?.setRemoteDescription(answer); remoteVideoRef.current?.play(); + setIsConnected(true); }; let consumer: RTCPeerConnection; return (
-
-
+ Practitioner + + Annotation + + +
- + Connect + */}
-
+ {isConnected ? ( + + ) : ( + + )} + {/* */}
); } diff --git a/src/client/src/pages/Auth.tsx b/src/client/src/pages/Auth.tsx deleted file mode 100644 index 68f83ac..0000000 --- a/src/client/src/pages/Auth.tsx +++ /dev/null @@ -1,123 +0,0 @@ -import React, { useRef, useState } from 'react'; -import { Link } from 'react-router-dom'; - -const Auth = () => { - const selfVideoRef = useRef(null); - const remoteVideoRef = useRef(null); - - const getVideo = () => { - navigator.mediaDevices - .getUserMedia({ video: true, audio: false }) - .then((stream) => { - // add stream to current video element - const video = selfVideoRef.current; - video!.srcObject = stream; - // play video from selfVideo Ref - video?.play(); - }) - .catch((err) => { - console.error('OH NO!!!', err); - }); - }; - - const closeRemote = async (pc: RTCPeerConnection) => { - pc.close(); - // const tracks = await remoteVideoRef.current!.srcObject.getTracks().map((track) => track.stop()); - remoteVideoRef.current!.srcObject = null; - }; - - const closeVideo = () => { - const video = selfVideoRef.current; - video!.srcObject = null; - }; - - const createConsumerPeerConnection = () => { - const config = { - sdpSemantics: 'unified-plan', - iceServers: [{ urls: 'stun:stun.l.google.com:19302' }], - }; - const pc = new RTCPeerConnection(config); - pc.addEventListener('track', (event) => { - if (event.track.kind === 'video') { - const remoteVideo = remoteVideoRef.current; - let rest; - [remoteVideo!.srcObject, ...rest] = event.streams; - console.log('remoteVideo'); - } - }); - pc.addTransceiver('video', { direction: 'recvonly' }); - pc.addTransceiver('audio', { direction: 'recvonly' }); - return pc; - }; - - const createPeerConnection = () => { - const config = { - sdpSemantics: 'unified-plan', - iceServers: [{ urls: 'stun:stun.l.google.com:19302' }], - }; - const pc = new RTCPeerConnection(config); - return pc; - }; - - const broadcast = async (pc: RTCPeerConnection) => { - const stream = await navigator.mediaDevices.getUserMedia({ - video: true, - audio: false, - }); - stream.getTracks().forEach((track) => { - pc.addTrack(track, stream); - }); - const offer = await pc?.createOffer(); - await pc?.setLocalDescription(offer); - const requestSdp = pc.localDescription; - const sdp = await fetch('http://127.0.0.1:8080/broadcast', { - body: JSON.stringify({ - sdp: requestSdp?.sdp, - type: requestSdp?.type, - // video transform - video_transform: 'skeleton', - }), - headers: { - 'Content-Type': 'application/json', - }, - method: 'POST', - }); - const answer = await sdp.json(); - await pc?.setRemoteDescription(answer); - remoteVideoRef.current?.play(); - }; - - const consume = async (pc: RTCPeerConnection) => { - const offer = await pc?.createOffer(); - await pc?.setLocalDescription(offer); - const requestSdp = pc.localDescription; - const sdp = await fetch('http://127.0.0.1:8080/consumer', { - body: JSON.stringify({ - sdp: requestSdp?.sdp, - type: requestSdp?.type, - }), - headers: { - 'Content-Type': 'application/json', - }, - method: 'POST', - }); - const answer = await sdp.json(); - await pc?.setRemoteDescription(answer); - remoteVideoRef.current?.play(); - }; - - let consumer: RTCPeerConnection; - - return ( -<> - - - - ); -} - -export default Auth; From ccffc87f737e58c4b50d5775bf7849daad65be8a Mon Sep 17 00:00:00 2001 From: qstommyshu Date: Tue, 23 Jan 2024 20:43:06 -0500 Subject: [PATCH 05/34] Remove unused Home component and update UI in Auth and Instructor modules --- src/client/src/App.tsx | 2 -- src/client/src/modules/Auth.tsx | 13 +++++----- src/client/src/modules/Instructor.tsx | 34 ++++++++++++++++++++----- src/client/src/modules/MessageModal.tsx | 33 ++++++++++++++++++++++++ 4 files changed, 68 insertions(+), 14 deletions(-) create mode 100644 src/client/src/modules/MessageModal.tsx diff --git a/src/client/src/App.tsx b/src/client/src/App.tsx index 5ed35ed..741b0a5 100644 --- a/src/client/src/App.tsx +++ b/src/client/src/App.tsx @@ -1,5 +1,4 @@ import { HashRouter, Route, Routes } from 'react-router-dom'; -import Home from './modules/Home'; import NotFound from './modules/NotFound'; import Instructor from './modules/Instructor'; import Practitioner from './modules/Practitioner'; @@ -9,7 +8,6 @@ export function App() { return ( } /> - } /> } /> } /> } /> diff --git a/src/client/src/modules/Auth.tsx b/src/client/src/modules/Auth.tsx index 9b887da..78bf5b4 100644 --- a/src/client/src/modules/Auth.tsx +++ b/src/client/src/modules/Auth.tsx @@ -4,12 +4,12 @@ import { Button } from '@mui/material'; function Auth() { return ( - <> +

Hi there,

Welcome to MotionMingle!

-

Are you a Tai Chi instructor or a practitioner?

-

Hi! I'm a

- - - +
); } diff --git a/src/client/src/modules/Instructor.tsx b/src/client/src/modules/Instructor.tsx index 22d7e80..8d65eaf 100644 --- a/src/client/src/modules/Instructor.tsx +++ b/src/client/src/modules/Instructor.tsx @@ -6,7 +6,10 @@ import { InputLabel, SelectChangeEvent, Button, + Modal, + Box, } from '@mui/material'; +import MessageModal from './MessageModal'; function Instructor() { const selfVideoRef = useRef(null); @@ -14,6 +17,8 @@ function Instructor() { const [selectedAnnotation, setSelectedAnnotation] = useState(''); const [isConnected, setIsConnected] = useState(false); + const [isSelfVideoOn, setIsSelfVideoOn] = useState(true); + const [isModalOpen, setIsModalOpen] = useState(false); const selectNewAnnotation = (event: SelectChangeEvent) => { setSelectedAnnotation(event.target.value); @@ -28,6 +33,7 @@ function Instructor() { video!.srcObject = stream; // play video from selfVideo Ref video?.play(); + setIsSelfVideoOn(true); }) .catch((err) => { console.error('OH NO!!!', err); @@ -43,11 +49,13 @@ function Instructor() { // const tracks = await remoteVideoRef.current!.srcObject.getTracks().map((track) => track.stop()); remoteVideoRef.current!.srcObject = null; setIsConnected(false); + setIsModalOpen(true); }; const closeVideo = () => { const video = selfVideoRef.current; video!.srcObject = null; + setIsSelfVideoOn(false); }; const createConsumerPeerConnection = () => { @@ -152,13 +160,20 @@ function Instructor() {
-
- {/* - */} + + ) : ( + + )} +
{isConnected ? ( +
+ setIsModalOpen(false)} + />
); } diff --git a/src/client/src/modules/MessageModal.tsx b/src/client/src/modules/MessageModal.tsx new file mode 100644 index 0000000..3d450a1 --- /dev/null +++ b/src/client/src/modules/MessageModal.tsx @@ -0,0 +1,33 @@ +import React from 'react'; +import { Modal, Box, Typography } from '@mui/material'; + +const style = { + position: 'absolute' as const, + top: '50%', + left: '50%', + transform: 'translate(-50%, -50%)', + width: 400, + bgcolor: 'background.paper', + border: '2px solid #000', + boxShadow: 24, + p: 4, +}; + +export default function MessageModal(props: { + isModalOpen: boolean; + handleClose: () => void; +}) { + const { isModalOpen, handleClose } = props; + return ( + + + + Text in a modal + + + Duis mollis, est non commodo luctus, nisi erat porttitor ligula. + + + + ); +} From 793cbb0fc8402a4233e0b6b1c928761181e271e4 Mon Sep 17 00:00:00 2001 From: qstommyshu Date: Wed, 24 Jan 2024 07:45:06 -0500 Subject: [PATCH 06/34] Refactor code and add MotionMingleButton component --- src/client/src/modules/Home.tsx | 5 --- src/client/src/modules/Instructor.tsx | 40 +++++++++++-------- src/client/src/modules/MessageModal.tsx | 2 +- .../{Button.tsx => MotionMingleButton.tsx} | 9 +++-- src/client/src/modules/Practitioner.tsx | 4 +- 5 files changed, 32 insertions(+), 28 deletions(-) delete mode 100644 src/client/src/modules/Home.tsx rename src/client/src/modules/{Button.tsx => MotionMingleButton.tsx} (54%) diff --git a/src/client/src/modules/Home.tsx b/src/client/src/modules/Home.tsx deleted file mode 100644 index a5ed13a..0000000 --- a/src/client/src/modules/Home.tsx +++ /dev/null @@ -1,5 +0,0 @@ -function Home() { - return

Hello World

; -} - -export default Home; diff --git a/src/client/src/modules/Instructor.tsx b/src/client/src/modules/Instructor.tsx index 8d65eaf..24df694 100644 --- a/src/client/src/modules/Instructor.tsx +++ b/src/client/src/modules/Instructor.tsx @@ -6,8 +6,6 @@ import { InputLabel, SelectChangeEvent, Button, - Modal, - Box, } from '@mui/material'; import MessageModal from './MessageModal'; @@ -19,6 +17,7 @@ function Instructor() { const [isConnected, setIsConnected] = useState(false); const [isSelfVideoOn, setIsSelfVideoOn] = useState(true); const [isModalOpen, setIsModalOpen] = useState(false); + const [brodcastPc, setBroadcastPc] = useState(); const selectNewAnnotation = (event: SelectChangeEvent) => { setSelectedAnnotation(event.target.value); @@ -40,12 +39,24 @@ function Instructor() { }); }; + const createPeerConnection = () => { + const config = { + sdpSemantics: 'unified-plan', + iceServers: [{ urls: 'stun:stun.l.google.com:19302' }], + }; + const pc = new RTCPeerConnection(config); + return pc; + }; + useEffect(() => { getSelfVideo(); + setBroadcastPc(createPeerConnection()); }, []); const closeRemote = async (pc: RTCPeerConnection) => { - // pc.close(); + console.log(pc); + pc.close(); + setBroadcastPc(undefined); // const tracks = await remoteVideoRef.current!.srcObject.getTracks().map((track) => track.stop()); remoteVideoRef.current!.srcObject = null; setIsConnected(false); @@ -77,15 +88,6 @@ function Instructor() { return pc; }; - const createPeerConnection = () => { - const config = { - sdpSemantics: 'unified-plan', - iceServers: [{ urls: 'stun:stun.l.google.com:19302' }], - }; - const pc = new RTCPeerConnection(config); - return pc; - }; - const broadcast = async (pc: RTCPeerConnection) => { const stream = await navigator.mediaDevices.getUserMedia({ video: true, @@ -134,7 +136,6 @@ function Instructor() { remoteVideoRef.current?.play(); }; - let broadcaster: RTCPeerConnection; let consumer: RTCPeerConnection; return ( @@ -178,7 +179,7 @@ function Instructor() { @@ -187,8 +188,9 @@ function Instructor() { variant="contained" color="primary" onClick={() => { - broadcaster = createPeerConnection(); - broadcast(broadcaster); + // broadcaster = createPeerConnection(); + // setPeerConnection(broadcaster); + broadcast(brodcastPc!); }} > Broadcast @@ -204,7 +206,11 @@ function Instructor() { > Check Annotated Video - diff --git a/src/client/src/modules/MessageModal.tsx b/src/client/src/modules/MessageModal.tsx index 3d450a1..04b0e15 100644 --- a/src/client/src/modules/MessageModal.tsx +++ b/src/client/src/modules/MessageModal.tsx @@ -8,7 +8,7 @@ const style = { transform: 'translate(-50%, -50%)', width: 400, bgcolor: 'background.paper', - border: '2px solid #000', +// border: '2px solid #000', boxShadow: 24, p: 4, }; diff --git a/src/client/src/modules/Button.tsx b/src/client/src/modules/MotionMingleButton.tsx similarity index 54% rename from src/client/src/modules/Button.tsx rename to src/client/src/modules/MotionMingleButton.tsx index c2ec49b..513b6e1 100644 --- a/src/client/src/modules/Button.tsx +++ b/src/client/src/modules/MotionMingleButton.tsx @@ -1,8 +1,13 @@ import React, { useRef, useState } from 'react'; import { Link } from 'react-router-dom'; import { Button as MUIButton } from '@mui/material'; +// import { OverridableStringUnion } from '@mui/types'; +import { ButtonPropsColorOverrides } from '@mui/material/Button/Button'; -function Button(props: { displayText: string; buttonColor: string }) { +export default function MotionMingleButton(props: { + displayText: string; + buttonColor: ButtonPropsColorOverrides; +}) { const { displayText, buttonColor } = props; return ( @@ -10,5 +15,3 @@ function Button(props: { displayText: string; buttonColor: string }) { ); } - -export default Button; diff --git a/src/client/src/modules/Practitioner.tsx b/src/client/src/modules/Practitioner.tsx index 14a87bb..d2b4550 100644 --- a/src/client/src/modules/Practitioner.tsx +++ b/src/client/src/modules/Practitioner.tsx @@ -7,7 +7,7 @@ import { SelectChangeEvent, Button, } from '@mui/material'; -import Test from './Button'; +import MotionMingleButton from './MotionMingleButton'; function Practitioner() { const remoteVideoRef = useRef(null); @@ -140,7 +140,7 @@ function Practitioner() { Connect )} - {/* */} + ); } From ffc4aa2d3b90b1802f58f638133ae7df0836cb77 Mon Sep 17 00:00:00 2001 From: qstommyshu Date: Wed, 24 Jan 2024 10:24:52 -0500 Subject: [PATCH 07/34] Add RTCControl module and update video streaming functionality --- src/client/src/modules/Instructor.tsx | 67 +++++++------------ src/client/src/modules/MMButton.tsx | 15 +++++ src/client/src/modules/MessageModal.tsx | 14 ++-- src/client/src/modules/MotionMingleButton.tsx | 17 ----- src/client/src/modules/Practitioner.tsx | 27 +++----- src/client/src/modules/RTCControl.ts | 28 ++++++++ src/client/src/modules/mediaControl.tsx | 0 7 files changed, 89 insertions(+), 79 deletions(-) create mode 100644 src/client/src/modules/MMButton.tsx delete mode 100644 src/client/src/modules/MotionMingleButton.tsx create mode 100644 src/client/src/modules/RTCControl.ts create mode 100644 src/client/src/modules/mediaControl.tsx diff --git a/src/client/src/modules/Instructor.tsx b/src/client/src/modules/Instructor.tsx index 24df694..82c15cb 100644 --- a/src/client/src/modules/Instructor.tsx +++ b/src/client/src/modules/Instructor.tsx @@ -8,6 +8,7 @@ import { Button, } from '@mui/material'; import MessageModal from './MessageModal'; +import { connectAsConsumer, createPeerConnection } from './RTCControl'; function Instructor() { const selfVideoRef = useRef(null); @@ -39,13 +40,10 @@ function Instructor() { }); }; - const createPeerConnection = () => { - const config = { - sdpSemantics: 'unified-plan', - iceServers: [{ urls: 'stun:stun.l.google.com:19302' }], - }; - const pc = new RTCPeerConnection(config); - return pc; + const closeSelfVideo = () => { + const video = selfVideoRef.current; + video!.srcObject = null; + setIsSelfVideoOn(false); }; useEffect(() => { @@ -63,18 +61,8 @@ function Instructor() { setIsModalOpen(true); }; - const closeVideo = () => { - const video = selfVideoRef.current; - video!.srcObject = null; - setIsSelfVideoOn(false); - }; - const createConsumerPeerConnection = () => { - const config = { - sdpSemantics: 'unified-plan', - iceServers: [{ urls: 'stun:stun.l.google.com:19302' }], - }; - const pc = new RTCPeerConnection(config); + const pc = createPeerConnection(); pc.addEventListener('track', (event) => { if (event.track.kind === 'video') { const remoteVideo = remoteVideoRef.current; @@ -88,14 +76,7 @@ function Instructor() { return pc; }; - const broadcast = async (pc: RTCPeerConnection) => { - const stream = await navigator.mediaDevices.getUserMedia({ - video: true, - audio: false, - }); - stream.getTracks().forEach((track) => { - pc.addTrack(track, stream); - }); + const connectAsBroadcaster = async (pc: RTCPeerConnection) => { const offer = await pc?.createOffer(); await pc?.setLocalDescription(offer); const requestSdp = pc.localDescription; @@ -113,26 +94,24 @@ function Instructor() { }); const answer = await sdp.json(); await pc?.setRemoteDescription(answer); + }; + + // TODO: has to add video stream before broadcasting + const broadcast = async (pc: RTCPeerConnection) => { + const stream = await navigator.mediaDevices.getUserMedia({ + video: true, + audio: false, + }); + stream.getTracks().forEach((track) => { + pc.addTrack(track, stream); + }); + await connectAsBroadcaster(pc); remoteVideoRef.current?.play(); setIsConnected(true); }; const consume = async (pc: RTCPeerConnection) => { - const offer = await pc?.createOffer(); - await pc?.setLocalDescription(offer); - const requestSdp = pc.localDescription; - const sdp = await fetch('http://127.0.0.1:8080/consumer', { - body: JSON.stringify({ - sdp: requestSdp?.sdp, - type: requestSdp?.type, - }), - headers: { - 'Content-Type': 'application/json', - }, - method: 'POST', - }); - const answer = await sdp.json(); - await pc?.setRemoteDescription(answer); + connectAsConsumer(pc); remoteVideoRef.current?.play(); }; @@ -162,7 +141,11 @@ function Instructor() { {isSelfVideoOn ? ( - ) : ( diff --git a/src/client/src/modules/MMButton.tsx b/src/client/src/modules/MMButton.tsx new file mode 100644 index 0000000..6a7af02 --- /dev/null +++ b/src/client/src/modules/MMButton.tsx @@ -0,0 +1,15 @@ +import React, { useRef, useState } from 'react'; +import { Button as MUIButton } from '@mui/material'; + +export default function MMButton(props: { + displayText: string; + buttonColor: 'error' | 'primary'; + callBack: () => void; +}) { + const { displayText, buttonColor, callBack } = props; + return ( + + {displayText} + + ); +} diff --git a/src/client/src/modules/MessageModal.tsx b/src/client/src/modules/MessageModal.tsx index 04b0e15..008dd03 100644 --- a/src/client/src/modules/MessageModal.tsx +++ b/src/client/src/modules/MessageModal.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Modal, Box, Typography } from '@mui/material'; +import { Modal, Box, Typography, Button } from '@mui/material'; const style = { position: 'absolute' as const, @@ -8,7 +8,6 @@ const style = { transform: 'translate(-50%, -50%)', width: 400, bgcolor: 'background.paper', -// border: '2px solid #000', boxShadow: 24, p: 4, }; @@ -22,11 +21,18 @@ export default function MessageModal(props: { - Text in a modal + Warning - Duis mollis, est non commodo luctus, nisi erat porttitor ligula. + Are you sure you want to turn stop your video? Practitioner in this + room can not see your live stream after you stop the video. + + ); diff --git a/src/client/src/modules/MotionMingleButton.tsx b/src/client/src/modules/MotionMingleButton.tsx deleted file mode 100644 index 513b6e1..0000000 --- a/src/client/src/modules/MotionMingleButton.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import React, { useRef, useState } from 'react'; -import { Link } from 'react-router-dom'; -import { Button as MUIButton } from '@mui/material'; -// import { OverridableStringUnion } from '@mui/types'; -import { ButtonPropsColorOverrides } from '@mui/material/Button/Button'; - -export default function MotionMingleButton(props: { - displayText: string; - buttonColor: ButtonPropsColorOverrides; -}) { - const { displayText, buttonColor } = props; - return ( - - {displayText} - - ); -} diff --git a/src/client/src/modules/Practitioner.tsx b/src/client/src/modules/Practitioner.tsx index d2b4550..f6d846d 100644 --- a/src/client/src/modules/Practitioner.tsx +++ b/src/client/src/modules/Practitioner.tsx @@ -7,7 +7,8 @@ import { SelectChangeEvent, Button, } from '@mui/material'; -import MotionMingleButton from './MotionMingleButton'; +import MMButton from './MMButton'; +import { createPeerConnection } from './RTCControl'; function Practitioner() { const remoteVideoRef = useRef(null); @@ -27,11 +28,7 @@ function Practitioner() { }; const createConsumerPeerConnection = () => { - const config = { - sdpSemantics: 'unified-plan', - iceServers: [{ urls: 'stun:stun.l.google.com:19302' }], - }; - const pc = new RTCPeerConnection(config); + const pc = createPeerConnection(); pc.addEventListener('track', (event) => { if (event.track.kind === 'video') { const remoteVideo = remoteVideoRef.current; @@ -45,15 +42,6 @@ function Practitioner() { return pc; }; - const createPeerConnection = () => { - const config = { - sdpSemantics: 'unified-plan', - iceServers: [{ urls: 'stun:stun.l.google.com:19302' }], - }; - const pc = new RTCPeerConnection(config); - return pc; - }; - const consume = async (pc: RTCPeerConnection) => { const offer = await pc?.createOffer(); await pc?.setLocalDescription(offer); @@ -140,7 +128,14 @@ function Practitioner() { Connect )} - + {/* { + consumer = createConsumerPeerConnection(); + consume(consumer); + }} + /> */} ); } diff --git a/src/client/src/modules/RTCControl.ts b/src/client/src/modules/RTCControl.ts new file mode 100644 index 0000000..64f5283 --- /dev/null +++ b/src/client/src/modules/RTCControl.ts @@ -0,0 +1,28 @@ +export const createPeerConnection = () => { + const config = { + sdpSemantics: 'unified-plan', + iceServers: [{ urls: 'stun:stun.l.google.com:19302' }], + }; + const pc = new RTCPeerConnection(config); + return pc; +}; + +// TODO: Need to update after we have consumer side annotation selection to server +// and need to update with data channel after we have dynamic annotation selection +export const connectAsConsumer = async (pc: RTCPeerConnection) => { + const offer = await pc?.createOffer(); + await pc?.setLocalDescription(offer); + const requestSdp = pc.localDescription; + const sdp = await fetch('http://127.0.0.1:8080/consumer', { + body: JSON.stringify({ + sdp: requestSdp?.sdp, + type: requestSdp?.type, + }), + headers: { + 'Content-Type': 'application/json', + }, + method: 'POST', + }); + const answer = await sdp.json(); + await pc?.setRemoteDescription(answer); +}; diff --git a/src/client/src/modules/mediaControl.tsx b/src/client/src/modules/mediaControl.tsx new file mode 100644 index 0000000..e69de29 From 16451ab0d0ecda115b5c28cef8fe4ef21198dd2f Mon Sep 17 00:00:00 2001 From: Xunzhou Ye Date: Wed, 24 Jan 2024 10:37:03 -0500 Subject: [PATCH 08/34] handle video_transform option in /consume --- src/back/server.py | 65 +++++++++++++++++++++++++++++----------------- 1 file changed, 41 insertions(+), 24 deletions(-) diff --git a/src/back/server.py b/src/back/server.py index 0ea0352..35633ab 100644 --- a/src/back/server.py +++ b/src/back/server.py @@ -8,7 +8,12 @@ import cv2 from aiohttp import web -from aiortc import MediaStreamTrack, RTCPeerConnection, RTCSessionDescription, VideoStreamTrack +from aiortc import ( + MediaStreamTrack, + RTCPeerConnection, + RTCSessionDescription, + VideoStreamTrack, +) from aiortc.contrib.media import MediaRelay from av import VideoFrame @@ -21,15 +26,18 @@ pcs = set() relay = MediaRelay() consumer_track = VideoStreamTrack() -annotation = None mp_pose = mp.solutions.pose -pose = mp_pose.Pose(static_image_mode=False, model_complexity=1, enable_segmentation=False, smooth_landmarks=True) +pose = mp_pose.Pose( + static_image_mode=False, + model_complexity=1, + enable_segmentation=False, + smooth_landmarks=True, +) # Drawing utility mp_drawing = mp.solutions.drawing_utils - class VideoTransformTrack(MediaStreamTrack): """ A video stream track that transforms frames from an another track. @@ -111,18 +119,22 @@ async def recv(self): else: return frame + async def consumer(request): if request.method == "OPTIONS": return web.Response( content_type="application/json", - headers={"Access-Control-Allow-Origin": "*", - "Access-Control-Allow-Credentials": "true", - "Access-Control-Allow-Methods": "POST, GET, OPTIONS", - "Access-Control-Allow-Headers": "Content-Type"}, + headers={ + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Credentials": "true", + "Access-Control-Allow-Methods": "POST, GET, OPTIONS", + "Access-Control-Allow-Headers": "Content-Type", + }, ) params = await request.json() description = RTCSessionDescription(sdp=params["sdp"], type=params["type"]) + annotation = params["video_transform"] pc = RTCPeerConnection() pc_id = "PeerConnection(%s)" % uuid.uuid4() @@ -146,10 +158,12 @@ def log_info(msg, *args): text=json.dumps( {"sdp": pc.localDescription.sdp, "type": pc.localDescription.type} ), - headers={"Access-Control-Allow-Origin": "*", - "Access-Control-Allow-Credentials": "true", - "Access-Control-Allow-Methods": "POST, GET, OPTIONS", - "Access-Control-Allow-Headers": "Content-Type"}, + headers={ + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Credentials": "true", + "Access-Control-Allow-Methods": "POST, GET, OPTIONS", + "Access-Control-Allow-Headers": "Content-Type", + }, ) @@ -157,16 +171,16 @@ async def broadcast(request): if request.method == "OPTIONS": return web.Response( content_type="application/json", - headers={"Access-Control-Allow-Origin": "*", - "Access-Control-Allow-Credentials": "true", - "Access-Control-Allow-Methods": "POST, GET, OPTIONS", - "Access-Control-Allow-Headers": "Content-Type"}, + headers={ + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Credentials": "true", + "Access-Control-Allow-Methods": "POST, GET, OPTIONS", + "Access-Control-Allow-Headers": "Content-Type", + }, ) params = await request.json() offer = RTCSessionDescription(sdp=params["sdp"], type=params["type"]) - global annotation - annotation=params["video_transform"] pc = RTCPeerConnection() pc_id = "PeerConnection(%s)" % uuid.uuid4() @@ -215,10 +229,12 @@ async def on_ended(): text=json.dumps( {"sdp": pc.localDescription.sdp, "type": pc.localDescription.type} ), - headers={"Access-Control-Allow-Origin": "*", - "Access-Control-Allow-Credentials": "true", - "Access-Control-Allow-Methods": "POST, GET, OPTIONS", - "Access-Control-Allow-Headers": "Content-Type"}, + headers={ + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Credentials": "true", + "Access-Control-Allow-Methods": "POST, GET, OPTIONS", + "Access-Control-Allow-Headers": "Content-Type", + }, ) @@ -239,12 +255,13 @@ async def process_frame_for_skeleton(frame): # Draw the pose annotations on the frame annotated_frame = frame.copy() if results.pose_landmarks: - mp_drawing.draw_landmarks(annotated_frame, results.pose_landmarks, mp_pose.POSE_CONNECTIONS) + mp_drawing.draw_landmarks( + annotated_frame, results.pose_landmarks, mp_pose.POSE_CONNECTIONS + ) return annotated_frame - if __name__ == "__main__": parser = argparse.ArgumentParser( description="WebRTC audio / video / data-channels demo" From f0dae2e1d37ac832871a671989f9920954cb1aab Mon Sep 17 00:00:00 2001 From: qstommyshu Date: Wed, 24 Jan 2024 10:37:23 -0500 Subject: [PATCH 09/34] Change stop video to MessageModal and increase button sizes --- src/client/src/modules/Instructor.tsx | 12 +++++++++--- src/client/src/modules/MessageModal.tsx | 7 ++++--- src/client/src/modules/Practitioner.tsx | 20 ++++---------------- 3 files changed, 17 insertions(+), 22 deletions(-) diff --git a/src/client/src/modules/Instructor.tsx b/src/client/src/modules/Instructor.tsx index 82c15cb..02cefc2 100644 --- a/src/client/src/modules/Instructor.tsx +++ b/src/client/src/modules/Instructor.tsx @@ -58,7 +58,6 @@ function Instructor() { // const tracks = await remoteVideoRef.current!.srcObject.getTracks().map((track) => track.stop()); remoteVideoRef.current!.srcObject = null; setIsConnected(false); - setIsModalOpen(true); }; const createConsumerPeerConnection = () => { @@ -111,7 +110,7 @@ function Instructor() { }; const consume = async (pc: RTCPeerConnection) => { - connectAsConsumer(pc); + await connectAsConsumer(pc); remoteVideoRef.current?.play(); }; @@ -144,6 +143,7 @@ function Instructor() { @@ -170,6 +172,7 @@ function Instructor() { - diff --git a/src/client/src/modules/Practitioner.tsx b/src/client/src/modules/Practitioner.tsx index f6d846d..fe3f72f 100644 --- a/src/client/src/modules/Practitioner.tsx +++ b/src/client/src/modules/Practitioner.tsx @@ -8,7 +8,7 @@ import { Button, } from '@mui/material'; import MMButton from './MMButton'; -import { createPeerConnection } from './RTCControl'; +import { connectAsConsumer, createPeerConnection } from './RTCControl'; function Practitioner() { const remoteVideoRef = useRef(null); @@ -43,21 +43,7 @@ function Practitioner() { }; const consume = async (pc: RTCPeerConnection) => { - const offer = await pc?.createOffer(); - await pc?.setLocalDescription(offer); - const requestSdp = pc.localDescription; - const sdp = await fetch('http://127.0.0.1:8080/consumer', { - body: JSON.stringify({ - sdp: requestSdp?.sdp, - type: requestSdp?.type, - }), - headers: { - 'Content-Type': 'application/json', - }, - method: 'POST', - }); - const answer = await sdp.json(); - await pc?.setRemoteDescription(answer); + await connectAsConsumer(pc); remoteVideoRef.current?.play(); setIsConnected(true); }; @@ -110,6 +96,7 @@ function Practitioner() { - or - - + + + Motion Mingle + + + Harmony in Motion, Unity in Practice + + + + Instructor + + + or + + + Practitioner + + + + + ); } -export default Auth; +export default Auth; \ No newline at end of file diff --git a/src/client/src/modules/logo.jpg b/src/client/src/modules/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..580065ff00088acdbc5ed337626d4a906f8e1064 GIT binary patch literal 89348 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

UP4{DEgP+Sk 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

rK8CId>eQGbq5 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 literal 0 HcmV?d00001 From 90c521d64fa8edf75a9a198e06d97fb83e680160 Mon Sep 17 00:00:00 2001 From: qstommyshu Date: Sat, 10 Feb 2024 21:45:46 -0500 Subject: [PATCH 14/34] refactor consumer connection function --- src/client/src/modules/Practitioner.tsx | 19 +------------------ src/client/src/modules/RTCControl.ts | 5 ++--- 2 files changed, 3 insertions(+), 21 deletions(-) diff --git a/src/client/src/modules/Practitioner.tsx b/src/client/src/modules/Practitioner.tsx index c1727a4..67cc0a3 100644 --- a/src/client/src/modules/Practitioner.tsx +++ b/src/client/src/modules/Practitioner.tsx @@ -7,7 +7,6 @@ import { SelectChangeEvent, Button, } from '@mui/material'; -import MMButton from './MMButton'; import { connectAsConsumer, createPeerConnection } from './RTCControl'; function Practitioner() { @@ -43,23 +42,7 @@ function Practitioner() { }; const consume = async (pc: RTCPeerConnection) => { - // await connectAsConsumer(pc); - const offer = await pc?.createOffer(); - await pc?.setLocalDescription(offer); - const requestSdp = pc.localDescription; - const sdp = await fetch('http://127.0.0.1:8080/consumer', { - body: JSON.stringify({ - sdp: requestSdp?.sdp, - type: requestSdp?.type, - video_transform: selectedAnnotation, - }), - headers: { - 'Content-Type': 'application/json', - }, - method: 'POST', - }); - const answer = await sdp.json(); - await pc?.setRemoteDescription(answer); + await connectAsConsumer(pc, selectedAnnotation); remoteVideoRef.current?.play(); setIsConnected(true); }; diff --git a/src/client/src/modules/RTCControl.ts b/src/client/src/modules/RTCControl.ts index 64f5283..d36933c 100644 --- a/src/client/src/modules/RTCControl.ts +++ b/src/client/src/modules/RTCControl.ts @@ -7,9 +7,7 @@ export const createPeerConnection = () => { return pc; }; -// TODO: Need to update after we have consumer side annotation selection to server -// and need to update with data channel after we have dynamic annotation selection -export const connectAsConsumer = async (pc: RTCPeerConnection) => { +export const connectAsConsumer = async (pc: RTCPeerConnection, selectedAnnotation: string) => { const offer = await pc?.createOffer(); await pc?.setLocalDescription(offer); const requestSdp = pc.localDescription; @@ -17,6 +15,7 @@ export const connectAsConsumer = async (pc: RTCPeerConnection) => { body: JSON.stringify({ sdp: requestSdp?.sdp, type: requestSdp?.type, + video_transform: selectedAnnotation, }), headers: { 'Content-Type': 'application/json', From 477845ed1af8fcb062abd82ae143777fb5eac120 Mon Sep 17 00:00:00 2001 From: qstommyshu Date: Sat, 10 Feb 2024 21:47:45 -0500 Subject: [PATCH 15/34] fix instructor check annotated video capability --- src/client/src/modules/Instructor.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/client/src/modules/Instructor.tsx b/src/client/src/modules/Instructor.tsx index fd6977a..d372031 100644 --- a/src/client/src/modules/Instructor.tsx +++ b/src/client/src/modules/Instructor.tsx @@ -95,7 +95,6 @@ function Instructor() { await pc?.setRemoteDescription(answer); }; - // TODO: has to add video stream before broadcasting const broadcast = async (pc: RTCPeerConnection) => { const stream = await navigator.mediaDevices.getUserMedia({ video: true, @@ -110,7 +109,7 @@ function Instructor() { }; const consume = async (pc: RTCPeerConnection) => { - await connectAsConsumer(pc); + await connectAsConsumer(pc, selectedAnnotation); remoteVideoRef.current?.play(); }; From cef48f1ac522c8c215bf80ef6b9da8d75f2c439c Mon Sep 17 00:00:00 2001 From: qstommyshu Date: Sat, 10 Feb 2024 21:49:42 -0500 Subject: [PATCH 16/34] clean up comments --- src/client/src/modules/Instructor.tsx | 2 -- src/client/src/modules/Practitioner.tsx | 18 ------------------ 2 files changed, 20 deletions(-) diff --git a/src/client/src/modules/Instructor.tsx b/src/client/src/modules/Instructor.tsx index d372031..886900b 100644 --- a/src/client/src/modules/Instructor.tsx +++ b/src/client/src/modules/Instructor.tsx @@ -173,8 +173,6 @@ function Instructor() { color="primary" size="large" onClick={() => { - // broadcaster = createPeerConnection(); - // setPeerConnection(broadcaster); broadcast(brodcastPc!); }} > diff --git a/src/client/src/modules/Practitioner.tsx b/src/client/src/modules/Practitioner.tsx index 67cc0a3..6f6157b 100644 --- a/src/client/src/modules/Practitioner.tsx +++ b/src/client/src/modules/Practitioner.tsx @@ -69,16 +69,6 @@ function Practitioner() {
- {/* */}
); } From 987eb1f5de7932feaa2ae700130e8c9c12e9682c Mon Sep 17 00:00:00 2001 From: qstommyshu Date: Sat, 10 Feb 2024 22:02:09 -0500 Subject: [PATCH 17/34] Add connectAsBroadcaster function to RTCControl --- src/client/src/modules/Instructor.tsx | 22 +--------------------- src/client/src/modules/RTCControl.ts | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 21 deletions(-) diff --git a/src/client/src/modules/Instructor.tsx b/src/client/src/modules/Instructor.tsx index 886900b..03853da 100644 --- a/src/client/src/modules/Instructor.tsx +++ b/src/client/src/modules/Instructor.tsx @@ -8,7 +8,7 @@ import { Button, } from '@mui/material'; import MessageModal from './MessageModal'; -import { connectAsConsumer, createPeerConnection } from './RTCControl'; +import { connectAsConsumer, createPeerConnection, connectAsBroadcaster } from './RTCControl'; function Instructor() { const selfVideoRef = useRef(null); @@ -75,26 +75,6 @@ function Instructor() { return pc; }; - const connectAsBroadcaster = async (pc: RTCPeerConnection) => { - const offer = await pc?.createOffer(); - await pc?.setLocalDescription(offer); - const requestSdp = pc.localDescription; - const sdp = await fetch('http://127.0.0.1:8080/broadcast', { - body: JSON.stringify({ - sdp: requestSdp?.sdp, - type: requestSdp?.type, - // video transform - video_transform: selectedAnnotation, - }), - headers: { - 'Content-Type': 'application/json', - }, - method: 'POST', - }); - const answer = await sdp.json(); - await pc?.setRemoteDescription(answer); - }; - const broadcast = async (pc: RTCPeerConnection) => { const stream = await navigator.mediaDevices.getUserMedia({ video: true, diff --git a/src/client/src/modules/RTCControl.ts b/src/client/src/modules/RTCControl.ts index d36933c..ae2ccd7 100644 --- a/src/client/src/modules/RTCControl.ts +++ b/src/client/src/modules/RTCControl.ts @@ -25,3 +25,21 @@ export const connectAsConsumer = async (pc: RTCPeerConnection, selectedAnnotatio const answer = await sdp.json(); await pc?.setRemoteDescription(answer); }; + +export const connectAsBroadcaster = async (pc: RTCPeerConnection) => { + const offer = await pc?.createOffer(); + await pc?.setLocalDescription(offer); + const requestSdp = pc.localDescription; + const sdp = await fetch('http://127.0.0.1:8080/broadcast', { + body: JSON.stringify({ + sdp: requestSdp?.sdp, + type: requestSdp?.type, + }), + headers: { + 'Content-Type': 'application/json', + }, + method: 'POST', + }); + const answer = await sdp.json(); + await pc?.setRemoteDescription(answer); +}; From ccc11717b67f7c07512626bc88faff21c599a4ef Mon Sep 17 00:00:00 2001 From: qstommyshu Date: Sat, 10 Feb 2024 22:17:24 -0500 Subject: [PATCH 18/34] Add SelectAnnotation component --- src/client/src/modules/Instructor.tsx | 21 ++---------- src/client/src/modules/Practitioner.tsx | 23 ++----------- src/client/src/modules/SelectAnnotation.tsx | 36 +++++++++++++++++++++ 3 files changed, 41 insertions(+), 39 deletions(-) create mode 100644 src/client/src/modules/SelectAnnotation.tsx diff --git a/src/client/src/modules/Instructor.tsx b/src/client/src/modules/Instructor.tsx index 03853da..66a42ea 100644 --- a/src/client/src/modules/Instructor.tsx +++ b/src/client/src/modules/Instructor.tsx @@ -1,13 +1,10 @@ import React, { useRef, useState, useEffect } from 'react'; import { - Select, - MenuItem, - FormControl, - InputLabel, SelectChangeEvent, Button, } from '@mui/material'; import MessageModal from './MessageModal'; +import SelectAnnotation from './SelectAnnotation'; import { connectAsConsumer, createPeerConnection, connectAsBroadcaster } from './RTCControl'; function Instructor() { @@ -98,21 +95,7 @@ function Instructor() { return (
Instructor - - Annotation - - +