commit 75a1aacc91c507d0ecdac2e6f8c0df1c7f429153 Author: AzizbekFayziyev Date: Mon Jun 2 11:40:07 2025 +0500 finish diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..4b9fccf --- /dev/null +++ b/.env.example @@ -0,0 +1 @@ +API_URL="http://localhost:3000" \ No newline at end of file diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..5efe132 --- /dev/null +++ b/.eslintignore @@ -0,0 +1 @@ +submodules/ \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..ca32e3a --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,61 @@ +{ + "env": { + "es2021": true, + "node": true + }, + "extends": [ + "airbnb-base", + "plugin:@typescript-eslint/recommended", + "next/core-web-vitals", + "prettier" + ], + "parser": "@typescript-eslint/parser", + "plugins": ["@typescript-eslint", "import"], + "parserOptions": { + "ecmaVersion": "latest", + "sourceType": "module", + "project": "./tsconfig.json" + }, + "rules": { + "no-console": "off", + "no-void": "off", + "import/extensions": "off", + "no-unused-vars": [ + "warn", + { + "argsIgnorePattern": "^_" + } + ], + "func-names": "off", + "consistent-return": "off", + "no-restricted-syntax": "off", + "indent": ["error", "tab"], + "class-methods-use-this": "off", + "@typescript-eslint/no-unused-vars": [ + "warn", + { + "argsIgnorePattern": "^_" + } + ], + "@typescript-eslint/explicit-member-accessibility": "off", + "@typescript-eslint/no-explicit-any": "error", + "lines-between-class-members": "off", + "camelcase": "off", + "no-underscore-dangle": "off", + "no-shadow": "off", + "no-await-in-loop": "off", + "radix": "off", + "no-plusplus": "off", + "no-promise-executor-return": "off", + "import/no-duplicates": "off", + "import/prefer-default-export": "off", + "import/no-cycle": "off" + }, + "settings": { + "import/resolver": { + "node": { + "extensions": [".js", ".ts"] + } + } + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..56f72c6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# local env files +.env*.local +.env + +# vercel +.vercel diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..210877e --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,3 @@ +#!/bin/sh + +npx lint-staged \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..c5bfd5b --- /dev/null +++ b/.prettierignore @@ -0,0 +1,8 @@ +node_modules +build +dist +coverage +.next +.env +*.lock +submodules/ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..ca8a3a2 --- /dev/null +++ b/README.md @@ -0,0 +1,38 @@ +This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `pages/index.js`. The page auto-updates as you edit the file. + +[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.js`. + +The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages. + +This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..b05513b --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + } + } +} diff --git a/migrations/20240711121254-add-assets-info.cjs b/migrations/20240711121254-add-assets-info.cjs new file mode 100644 index 0000000..9c9de27 --- /dev/null +++ b/migrations/20240711121254-add-assets-info.cjs @@ -0,0 +1,15 @@ +'use strict'; + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + queryInterface.addColumn('Currencies', 'asset_info', { + type: Sequelize.JSONB, + allowNull: true, + }); + }, + + async down(queryInterface, Sequelize) { + queryInterface.removeColumn('Currencies', 'asset_info'); + }, +}; diff --git a/migrations/20240824145239-update-order-money-types.cjs b/migrations/20240824145239-update-order-money-types.cjs new file mode 100644 index 0000000..8ce949f --- /dev/null +++ b/migrations/20240824145239-update-order-money-types.cjs @@ -0,0 +1,73 @@ +'use strict'; + +async function updateColumnType(queryInterface, table, column, type, transaction) { + await queryInterface.changeColumn( + table, + column, + { + type: `${type} USING CAST("${column}" as ${type})`, + }, + { transaction }, + ); +} + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + await queryInterface.sequelize.transaction(async (transaction) => { + await updateColumnType(queryInterface, 'Orders', 'price', 'VARCHAR', transaction); + await updateColumnType(queryInterface, 'Orders', 'amount', 'VARCHAR', transaction); + await updateColumnType(queryInterface, 'Orders', 'total', 'VARCHAR', transaction); + await updateColumnType(queryInterface, 'Orders', 'left', 'VARCHAR', transaction); + + await updateColumnType( + queryInterface, + 'Transactions', + 'amount', + 'VARCHAR', + transaction, + ); + }); + }, + + async down(queryInterface, Sequelize) { + queryInterface.sequelize.transaction(async (transaction) => { + await updateColumnType( + queryInterface, + 'Orders', + 'price', + 'DOUBLE PRECISION', + transaction, + ); + await updateColumnType( + queryInterface, + 'Orders', + 'amount', + 'DOUBLE PRECISION', + transaction, + ); + await updateColumnType( + queryInterface, + 'Orders', + 'total', + 'DOUBLE PRECISION', + transaction, + ); + await updateColumnType( + queryInterface, + 'Orders', + 'left', + 'DOUBLE PRECISION', + transaction, + ); + + await updateColumnType( + queryInterface, + 'Transactions', + 'amount', + 'DOUBLE PRECISION', + transaction, + ); + }); + }, +}; diff --git a/migrations/20240826043651-add-exchange-notifications-amount.cjs b/migrations/20240826043651-add-exchange-notifications-amount.cjs new file mode 100644 index 0000000..a3b6dde --- /dev/null +++ b/migrations/20240826043651-add-exchange-notifications-amount.cjs @@ -0,0 +1,16 @@ +'use strict'; + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + queryInterface.addColumn('Users', 'exchange_notifications_amount', { + type: Sequelize.INTEGER, + allowNull: false, + defaultValue: 0, + }); + }, + + async down(queryInterface) { + queryInterface.removeColumn('Users', 'exchange_notifications_amount'); + }, +}; diff --git a/migrations/20240902095707-add-asset-whitelisted-field.cjs b/migrations/20240902095707-add-asset-whitelisted-field.cjs new file mode 100644 index 0000000..68458c7 --- /dev/null +++ b/migrations/20240902095707-add-asset-whitelisted-field.cjs @@ -0,0 +1,16 @@ +'use strict'; + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + queryInterface.addColumn('Currencies', 'whitelisted', { + type: Sequelize.BOOLEAN, + defaultValue: false, + allowNull: false, + }); + }, + + async down(queryInterface, Sequelize) { + queryInterface.removeColumn('Currencies', 'whitelisted'); + }, +}; diff --git a/migrations/20240920112346-update_notifications.cjs b/migrations/20240920112346-update_notifications.cjs new file mode 100644 index 0000000..dab345a --- /dev/null +++ b/migrations/20240920112346-update_notifications.cjs @@ -0,0 +1,16 @@ +'use strict'; + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + queryInterface.addColumn('Orders', 'hasNotification', { + type: Sequelize.BOOLEAN, + defaultValue: false, + allowNull: false, + }); + }, + + async down(queryInterface, Sequelize) { + queryInterface.removeColumn('Users', 'exchange_notifications_amount'); + }, +}; diff --git a/migrations/20250125120630-add-isAdmin-to-user.cjs b/migrations/20250125120630-add-isAdmin-to-user.cjs new file mode 100644 index 0000000..ba20ffb --- /dev/null +++ b/migrations/20250125120630-add-isAdmin-to-user.cjs @@ -0,0 +1,16 @@ +'use strict'; + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + await queryInterface.addColumn('Users', 'isAdmin', { + type: Sequelize.BOOLEAN, + allowNull: false, + defaultValue: false, + }); + }, + + async down(queryInterface, Sequelize) { + await queryInterface.removeColumn('Users', 'isAdmin'); + }, +}; diff --git a/migrations/20250125125455-add-featured-pairs.cjs b/migrations/20250125125455-add-featured-pairs.cjs new file mode 100644 index 0000000..d271112 --- /dev/null +++ b/migrations/20250125125455-add-featured-pairs.cjs @@ -0,0 +1,16 @@ +'use strict'; + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + up: async (queryInterface, Sequelize) => { + await queryInterface.addColumn('Pairs', 'featured', { + type: Sequelize.BOOLEAN, + defaultValue: false, + allowNull: false, + }); + }, + + down: async (queryInterface, Sequelize) => { + await queryInterface.removeColumn('Pairs', 'featured'); + }, +}; diff --git a/next-env.d.ts b/next-env.d.ts new file mode 100644 index 0000000..4f11a03 --- /dev/null +++ b/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/next.config.js b/next.config.js new file mode 100644 index 0000000..4ad1365 --- /dev/null +++ b/next.config.js @@ -0,0 +1,37 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + reactStrictMode: true, + async redirects() { + return [ + { + source: '/', + destination: '/dex', + permanent: false, + }, + // { + // source: '/((?!maintenance).*)', // Match everything except "/maintenance" + // destination: '/maintenance', + // permanent: false, + // }, + ]; + }, + webpack: (config) => { + config.module.rules.push({ + test: /\.svg$/, + use: ['@svgr/webpack', 'url-loader'], + }); + + return config; + }, + async rewrites() { + return [ + { + source: '/api/:path*', + destination: `${process.env.API_URL}/api/:path*` + } + ] + }, + +}; + +export default nextConfig; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..a28addf --- /dev/null +++ b/package-lock.json @@ -0,0 +1,14062 @@ +{ + "name": "zano-p2p", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "zano-p2p", + "version": "0.1.0", + "dependencies": { + "@react-hook/window-size": "^3.1.1", + "@tanstack/react-table": "^8.21.3", + "@types/jsonwebtoken": "^9.0.2", + "antd": "^5.23.2", + "apexcharts": "^3.41.0", + "axios": "^1.4.0", + "big.js": "^6.2.1", + "crypto-js": "^4.1.1", + "decimal.js": "^10.4.3", + "echarts": "^5.5.1", + "echarts-for-react": "^3.0.2", + "eslint-config-next": "13.2.4", + "express": "^4.18.2", + "jimp": "^0.22.8", + "jsonwebtoken": "^9.0.0", + "nanoid": "^4.0.1", + "next": "^13.2.4", + "next-themes": "^0.2.1", + "node-fetch": "^3.3.1", + "react": "18.2.0", + "react-apexcharts": "^1.4.0", + "react-dom": "18.2.0", + "react-intersection-observer": "^9.10.3", + "sequelize": "^6.37.3", + "sha256": "^0.2.0", + "socket.io": "^4.6.1", + "socket.io-client": "^4.6.1", + "ts-node": "^10.9.1", + "tsc": "^2.0.4", + "tsx": "^4.15.7", + "uuidv4": "^6.2.13" + }, + "devDependencies": { + "@svgr/webpack": "^8.0.1", + "@types/big.js": "^6.2.0", + "@types/crypto-js": "^4.1.1", + "@types/express": "^4.17.17", + "@types/pg": "^8.10.2", + "@types/react": "18.2.16", + "@types/react-dom": "^18.2.7", + "@types/sha256": "^0.2.0", + "@typescript-eslint/eslint-plugin": "^5.55.0", + "cross-env": "^7.0.3", + "eslint": "^8.57.1", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-prettier": "^10.1.5", + "eslint-plugin-import": "^2.31.0", + "husky": "^9.1.7", + "lint-staged": "^15.5.2", + "prettier": "3.5.3", + "sass": "^1.59.2", + "url-loader": "^4.1.1" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@ant-design/colors": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.2.1.tgz", + "integrity": "sha512-lCHDcEzieu4GA3n8ELeZ5VQ8pKQAWcGGLRTQ50aQM2iqPpq2evTxER84jfdPvsPAtEcZ7m44NI45edFMo8oOYQ==", + "license": "MIT", + "dependencies": { + "@ant-design/fast-color": "^2.0.6" + } + }, + "node_modules/@ant-design/cssinjs": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.23.0.tgz", + "integrity": "sha512-7GAg9bD/iC9ikWatU9ym+P9ugJhi/WbsTWzcKN6T4gU0aehsprtke1UAaaSxxkjjmkJb3llet/rbUSLPgwlY4w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "@emotion/hash": "^0.8.0", + "@emotion/unitless": "^0.7.5", + "classnames": "^2.3.1", + "csstype": "^3.1.3", + "rc-util": "^5.35.0", + "stylis": "^4.3.4" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/cssinjs-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs-utils/-/cssinjs-utils-1.1.3.tgz", + "integrity": "sha512-nOoQMLW1l+xR1Co8NFVYiP8pZp3VjIIzqV6D6ShYF2ljtdwWJn5WSsH+7kvCktXL/yhEtWURKOfH5Xz/gzlwsg==", + "license": "MIT", + "dependencies": { + "@ant-design/cssinjs": "^1.21.0", + "@babel/runtime": "^7.23.2", + "rc-util": "^5.38.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@ant-design/fast-color": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@ant-design/fast-color/-/fast-color-2.0.6.tgz", + "integrity": "sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@ant-design/icons": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.6.1.tgz", + "integrity": "sha512-0/xS39c91WjPAZOWsvi1//zjx6kAp4kxWwctR6kuU6p133w8RU0D2dSCvZC19uQyharg/sAvYxGYWl01BbZZfg==", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^7.0.0", + "@ant-design/icons-svg": "^4.4.0", + "@babel/runtime": "^7.24.8", + "classnames": "^2.2.6", + "rc-util": "^5.31.1" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/icons-svg": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", + "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==", + "license": "MIT" + }, + "node_modules/@ant-design/react-slick": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-1.1.2.tgz", + "integrity": "sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.4", + "classnames": "^2.2.5", + "json2mq": "^0.2.0", + "resize-observer-polyfill": "^1.5.1", + "throttle-debounce": "^5.0.0" + }, + "peerDependencies": { + "react": ">=16.9.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.3.tgz", + "integrity": "sha512-V42wFfx1ymFte+ecf6iXghnnP8kWTO+ZLXIyZq+1LAXHHvTZdVxicn4yiVYdYMGaCO3tmqub11AorKkv+iodqw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz", + "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.4", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.27.4", + "@babel/types": "^7.27.3", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.3.tgz", + "integrity": "sha512-xnlJYj5zepml8NXtjkG0WquFUv8RskFqyFcVgTBp5k+NaA/8uw/K+OSVf8AMGw5e9HKP2ETd5xpK5MLZQD6b4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.27.3", + "@babel/types": "^7.27.3", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", + "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.27.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", + "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz", + "integrity": "sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz", + "integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.1", + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.4.tgz", + "integrity": "sha512-Y+bO6U+I7ZKaM5G5rDUZiYfUvQPUibYmAFe7EnKdnKBbVXDZxvp+MWOH5gYciY0EPk4EScsuFMQBbEfpdRKSCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.4.tgz", + "integrity": "sha512-BRmLHGwpUqLFR2jzx9orBuX/ABDkj2jLKOXrHDTN2aOKL+jFDDKaRNo9nyYsIl9h/UE/7lMKdDjKQQyxKKDZ7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", + "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz", + "integrity": "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.27.1.tgz", + "integrity": "sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.3.tgz", + "integrity": "sha512-+F8CnfhuLhwUACIJMLWnjz6zvzYM2r0yeIHKlbgfw7ml8rOMJsXNXV/hyRcb3nb493gRs4WvYpQAndWj/qQmkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz", + "integrity": "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz", + "integrity": "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.27.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.3.tgz", + "integrity": "sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", + "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", + "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", + "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.3.tgz", + "integrity": "sha512-7ZZtznF9g4l2JCImCo5LNKFHB5eXnN39lLtLY5Tg+VkR0jwOt7TBciMckuiQIOIW7L5tkQOCh3bVGYeXgMx52Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.27.3", + "@babel/plugin-transform-parameters": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", + "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.1.tgz", + "integrity": "sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz", + "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.27.1.tgz", + "integrity": "sha512-p9+Vl3yuHPmkirRrg021XiP+EETmPMQTLr6Ayjj85RLNEbb3Eya/4VI0vAdzQG9SEAl2Lnt7fy5lZyMzjYoZQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", + "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.4.tgz", + "integrity": "sha512-Glp/0n8xuj+E1588otw5rjJkTXfzW7FjH3IIUrfqiZOPQCd2vbg8e+DQE8jK9g4V5/zrxFW+D9WM9gboRPELpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.1.tgz", + "integrity": "sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.2.tgz", + "integrity": "sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.27.1", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.27.1", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.27.1", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.27.1", + "@babel/plugin-transform-classes": "^7.27.1", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.27.1", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.27.2", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.1", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.27.1", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.40.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.27.1.tgz", + "integrity": "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.27.1", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", + "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.4.tgz", + "integrity": "sha512-t3yaEOuGu9NlIZ+hIeGbBjFtZT7j2cb2tg0fuaJKeGotchRjjLfrBA9Kwf8quhpP1EUuxModQg04q/mBwyg8uA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", + "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.3", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.3.tgz", + "integrity": "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@emnapi/core": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.3.tgz", + "integrity": "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.0.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/core/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, + "node_modules/@emnapi/runtime": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", + "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.2.tgz", + "integrity": "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, + "node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", + "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", + "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", + "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", + "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", + "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", + "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", + "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", + "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", + "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", + "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", + "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", + "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", + "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", + "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", + "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", + "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", + "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", + "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", + "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", + "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", + "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", + "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", + "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", + "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", + "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.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==", + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "license": "BSD-3-Clause" + }, + "node_modules/@jimp/bmp": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.22.12.tgz", + "integrity": "sha512-aeI64HD0npropd+AR76MCcvvRaa+Qck6loCOS03CkkxGHN5/r336qTM5HPUdHKMDOGzqknuVPA8+kK1t03z12g==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12", + "bmp-js": "^0.1.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/core": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.22.12.tgz", + "integrity": "sha512-l0RR0dOPyzMKfjUW1uebzueFEDtCOj9fN6pyTYWWOM/VS4BciXQ1VVrJs8pO3kycGYZxncRKhCoygbNr8eEZQA==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12", + "any-base": "^1.1.0", + "buffer": "^5.2.0", + "exif-parser": "^0.1.12", + "file-type": "^16.5.4", + "isomorphic-fetch": "^3.0.0", + "pixelmatch": "^4.0.2", + "tinycolor2": "^1.6.0" + } + }, + "node_modules/@jimp/custom": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.22.12.tgz", + "integrity": "sha512-xcmww1O/JFP2MrlGUMd3Q78S3Qu6W3mYTXYuIqFq33EorgYHV/HqymHfXy9GjiCJ7OI+7lWx6nYFOzU7M4rd1Q==", + "license": "MIT", + "dependencies": { + "@jimp/core": "^0.22.12" + } + }, + "node_modules/@jimp/gif": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.22.12.tgz", + "integrity": "sha512-y6BFTJgch9mbor2H234VSjd9iwAhaNf/t3US5qpYIs0TSbAvM02Fbc28IaDETj9+4YB4676sz4RcN/zwhfu1pg==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12", + "gifwrap": "^0.10.1", + "omggif": "^1.0.9" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/jpeg": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.22.12.tgz", + "integrity": "sha512-Rq26XC/uQWaQKyb/5lksCTCxXhtY01NJeBN+dQv5yNYedN0i7iYu+fXEoRsfaJ8xZzjoANH8sns7rVP4GE7d/Q==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12", + "jpeg-js": "^0.4.4" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-blit": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.22.12.tgz", + "integrity": "sha512-xslz2ZoFZOPLY8EZ4dC29m168BtDx95D6K80TzgUi8gqT7LY6CsajWO0FAxDwHz6h0eomHMfyGX0stspBrTKnQ==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-blur": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.22.12.tgz", + "integrity": "sha512-S0vJADTuh1Q9F+cXAwFPlrKWzDj2F9t/9JAbUvaaDuivpyWuImEKXVz5PUZw2NbpuSHjwssbTpOZ8F13iJX4uw==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-circle": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.22.12.tgz", + "integrity": "sha512-SWVXx1yiuj5jZtMijqUfvVOJBwOifFn0918ou4ftoHgegc5aHWW5dZbYPjvC9fLpvz7oSlptNl2Sxr1zwofjTg==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-color": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.22.12.tgz", + "integrity": "sha512-xImhTE5BpS8xa+mAN6j4sMRWaUgUDLoaGHhJhpC+r7SKKErYDR0WQV4yCE4gP+N0gozD0F3Ka1LUSaMXrn7ZIA==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12", + "tinycolor2": "^1.6.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-contain": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.22.12.tgz", + "integrity": "sha512-Eo3DmfixJw3N79lWk8q/0SDYbqmKt1xSTJ69yy8XLYQj9svoBbyRpSnHR+n9hOw5pKXytHwUW6nU4u1wegHNoQ==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blit": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5", + "@jimp/plugin-scale": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-cover": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.22.12.tgz", + "integrity": "sha512-z0w/1xH/v/knZkpTNx+E8a7fnasQ2wHG5ze6y5oL2dhH1UufNua8gLQXlv8/W56+4nJ1brhSd233HBJCo01BXA==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-crop": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5", + "@jimp/plugin-scale": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-crop": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.22.12.tgz", + "integrity": "sha512-FNuUN0OVzRCozx8XSgP9MyLGMxNHHJMFt+LJuFjn1mu3k0VQxrzqbN06yIl46TVejhyAhcq5gLzqmSCHvlcBVw==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-displace": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.22.12.tgz", + "integrity": "sha512-qpRM8JRicxfK6aPPqKZA6+GzBwUIitiHaZw0QrJ64Ygd3+AsTc7BXr+37k2x7QcyCvmKXY4haUrSIsBug4S3CA==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-dither": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.22.12.tgz", + "integrity": "sha512-jYgGdSdSKl1UUEanX8A85v4+QUm+PE8vHFwlamaKk89s+PXQe7eVE3eNeSZX4inCq63EHL7cX580dMqkoC3ZLw==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-fisheye": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.22.12.tgz", + "integrity": "sha512-LGuUTsFg+fOp6KBKrmLkX4LfyCy8IIsROwoUvsUPKzutSqMJnsm3JGDW2eOmWIS/jJpPaeaishjlxvczjgII+Q==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-flip": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.22.12.tgz", + "integrity": "sha512-m251Rop7GN8W0Yo/rF9LWk6kNclngyjIJs/VXHToGQ6EGveOSTSQaX2Isi9f9lCDLxt+inBIb7nlaLLxnvHX8Q==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-rotate": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-gaussian": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.22.12.tgz", + "integrity": "sha512-sBfbzoOmJ6FczfG2PquiK84NtVGeScw97JsCC3rpQv1PHVWyW+uqWFF53+n3c8Y0P2HWlUjflEla2h/vWShvhg==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-invert": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.22.12.tgz", + "integrity": "sha512-N+6rwxdB+7OCR6PYijaA/iizXXodpxOGvT/smd/lxeXsZ/empHmFFFJ/FaXcYh19Tm04dGDaXcNF/dN5nm6+xQ==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-mask": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.22.12.tgz", + "integrity": "sha512-4AWZg+DomtpUA099jRV8IEZUfn1wLv6+nem4NRJC7L/82vxzLCgXKTxvNvBcNmJjT9yS1LAAmiJGdWKXG63/NA==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-normalize": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.22.12.tgz", + "integrity": "sha512-0So0rexQivnWgnhacX4cfkM2223YdExnJTTy6d06WbkfZk5alHUx8MM3yEzwoCN0ErO7oyqEWRnEkGC+As1FtA==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-print": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.22.12.tgz", + "integrity": "sha512-c7TnhHlxm87DJeSnwr/XOLjJU/whoiKYY7r21SbuJ5nuH+7a78EW1teOaj5gEr2wYEd7QtkFqGlmyGXY/YclyQ==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12", + "load-bmfont": "^1.4.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blit": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-resize": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.22.12.tgz", + "integrity": "sha512-3NyTPlPbTnGKDIbaBgQ3HbE6wXbAlFfxHVERmrbqAi8R3r6fQPxpCauA8UVDnieg5eo04D0T8nnnNIX//i/sXg==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-rotate": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.22.12.tgz", + "integrity": "sha512-9YNEt7BPAFfTls2FGfKBVgwwLUuKqy+E8bDGGEsOqHtbuhbshVGxN2WMZaD4gh5IDWvR+emmmPPWGgaYNYt1gA==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blit": ">=0.3.5", + "@jimp/plugin-crop": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-scale": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.22.12.tgz", + "integrity": "sha512-dghs92qM6MhHj0HrV2qAwKPMklQtjNpoYgAB94ysYpsXslhRTiPisueSIELRwZGEr0J0VUxpUY7HgJwlSIgGZw==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-shadow": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.22.12.tgz", + "integrity": "sha512-FX8mTJuCt7/3zXVoeD/qHlm4YH2bVqBuWQHXSuBK054e7wFRnRnbSLPUqAwSeYP3lWqpuQzJtgiiBxV3+WWwTg==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blur": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-threshold": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.22.12.tgz", + "integrity": "sha512-4x5GrQr1a/9L0paBC/MZZJjjgjxLYrqSmWd+e+QfAEPvmRxdRoQ5uKEuNgXnm9/weHQBTnQBQsOY2iFja+XGAw==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-color": ">=0.8.0", + "@jimp/plugin-resize": ">=0.8.0" + } + }, + "node_modules/@jimp/plugins": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.22.12.tgz", + "integrity": "sha512-yBJ8vQrDkBbTgQZLty9k4+KtUQdRjsIDJSPjuI21YdVeqZxYywifHl4/XWILoTZsjTUASQcGoH0TuC0N7xm3ww==", + "license": "MIT", + "dependencies": { + "@jimp/plugin-blit": "^0.22.12", + "@jimp/plugin-blur": "^0.22.12", + "@jimp/plugin-circle": "^0.22.12", + "@jimp/plugin-color": "^0.22.12", + "@jimp/plugin-contain": "^0.22.12", + "@jimp/plugin-cover": "^0.22.12", + "@jimp/plugin-crop": "^0.22.12", + "@jimp/plugin-displace": "^0.22.12", + "@jimp/plugin-dither": "^0.22.12", + "@jimp/plugin-fisheye": "^0.22.12", + "@jimp/plugin-flip": "^0.22.12", + "@jimp/plugin-gaussian": "^0.22.12", + "@jimp/plugin-invert": "^0.22.12", + "@jimp/plugin-mask": "^0.22.12", + "@jimp/plugin-normalize": "^0.22.12", + "@jimp/plugin-print": "^0.22.12", + "@jimp/plugin-resize": "^0.22.12", + "@jimp/plugin-rotate": "^0.22.12", + "@jimp/plugin-scale": "^0.22.12", + "@jimp/plugin-shadow": "^0.22.12", + "@jimp/plugin-threshold": "^0.22.12", + "timm": "^1.6.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/png": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.22.12.tgz", + "integrity": "sha512-Mrp6dr3UTn+aLK8ty/dSKELz+Otdz1v4aAXzV5q53UDD2rbB5joKVJ/ChY310B+eRzNxIovbUF1KVrUsYdE8Hg==", + "license": "MIT", + "dependencies": { + "@jimp/utils": "^0.22.12", + "pngjs": "^6.0.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/tiff": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.22.12.tgz", + "integrity": "sha512-E1LtMh4RyJsoCAfAkBRVSYyZDTtLq9p9LUiiYP0vPtXyxX4BiYBUYihTLSBlCQg5nF2e4OpQg7SPrLdJ66u7jg==", + "license": "MIT", + "dependencies": { + "utif2": "^4.0.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/types": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.22.12.tgz", + "integrity": "sha512-wwKYzRdElE1MBXFREvCto5s699izFHNVvALUv79GXNbsOVqlwlOxlWJ8DuyOGIXoLP4JW/m30YyuTtfUJgMRMA==", + "license": "MIT", + "dependencies": { + "@jimp/bmp": "^0.22.12", + "@jimp/gif": "^0.22.12", + "@jimp/jpeg": "^0.22.12", + "@jimp/png": "^0.22.12", + "@jimp/tiff": "^0.22.12", + "timm": "^1.6.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/utils": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.22.12.tgz", + "integrity": "sha512-yJ5cWUknGnilBq97ZXOyOS0HhsHOyAyjHwYfHxGbSyMTohgQI6sVyE8KPgDwH8HHW/nMKXk8TrSwAE71zt716Q==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.13.3" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.10.tgz", + "integrity": "sha512-bCsCyeZEwVErsGmyPNSzwfwFn4OdxBj0mmv6hOFucB/k81Ojdu68RbZdxYsRQUPc9l6SU5F/cG+bXgWs3oUgsQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.9.0" + } + }, + "node_modules/@next/env": { + "version": "13.5.11", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.5.11.tgz", + "integrity": "sha512-fbb2C7HChgM7CemdCY+y3N1n8pcTKdqtQLbC7/EQtPdLvlMUT9JX/dBYl8MMZAtYG4uVMyPFHXckb68q/NRwqg==", + "license": "MIT" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.2.4.tgz", + "integrity": "sha512-ck1lI+7r1mMJpqLNa3LJ5pxCfOB1lfJncKmRJeJxcJqcngaFwylreLP7da6Rrjr6u2gVRTfmnkSkjc80IiQCwQ==", + "license": "MIT", + "dependencies": { + "glob": "7.1.7" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "13.5.9", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.9.tgz", + "integrity": "sha512-pVyd8/1y1l5atQRvOaLOvfbmRwefxLhqQOzYo/M7FQ5eaRwA1+wuCn7t39VwEgDd7Aw1+AIWwd+MURXUeXhwDw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "13.5.9", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.9.tgz", + "integrity": "sha512-DwdeJqP7v8wmoyTWPbPVodTwCybBZa02xjSJ6YQFIFZFZ7dFgrieKW4Eo0GoIcOJq5+JxkQyejmI+8zwDp3pwA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "13.5.9", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.9.tgz", + "integrity": "sha512-wdQsKsIsGSNdFojvjW3Ozrh8Q00+GqL3wTaMjDkQxVtRbAqfFBtrLPO0IuWChVUP2UeuQcHpVeUvu0YgOP00+g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "13.5.9", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.9.tgz", + "integrity": "sha512-6VpS+bodQqzOeCwGxoimlRoosiWlSc0C224I7SQWJZoyJuT1ChNCo+45QQH+/GtbR/s7nhaUqmiHdzZC9TXnXA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "13.5.9", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.9.tgz", + "integrity": "sha512-XxG3yj61WDd28NA8gFASIR+2viQaYZEFQagEodhI/R49gXWnYhiflTeeEmCn7Vgnxa/OfK81h1gvhUZ66lozpw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "13.5.9", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.9.tgz", + "integrity": "sha512-/dnscWqfO3+U8asd+Fc6dwL2l9AZDl7eKtPNKW8mKLh4Y4wOpjJiamhe8Dx+D+Oq0GYVjuW0WwjIxYWVozt2bA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "13.5.9", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.9.tgz", + "integrity": "sha512-T/iPnyurOK5a4HRUcxAlss8uzoEf5h9tkd+W2dSWAfzxv8WLKlUgbfk+DH43JY3Gc2xK5URLuXrxDZ2mGfk/jw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "13.5.9", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.9.tgz", + "integrity": "sha512-BLiPKJomaPrTAb7ykjA0LPcuuNMLDVK177Z1xe0nAem33+9FIayU4k/OWrtSn9SAJW/U60+1hoey5z+KCHdRLQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "13.5.9", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.5.9.tgz", + "integrity": "sha512-/72/dZfjXXNY/u+n8gqZDjI6rxKMpYsgBBYNZKWOQw0BpBF7WCnPflRy3ZtvQ2+IYI3ZH2bPyj7K+6a6wNk90Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@rc-component/async-validator": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-5.0.4.tgz", + "integrity": "sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.4" + }, + "engines": { + "node": ">=14.x" + } + }, + "node_modules/@rc-component/color-picker": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-2.0.1.tgz", + "integrity": "sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==", + "license": "MIT", + "dependencies": { + "@ant-design/fast-color": "^2.0.6", + "@babel/runtime": "^7.23.6", + "classnames": "^2.2.6", + "rc-util": "^5.38.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/context": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-1.4.0.tgz", + "integrity": "sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/mini-decimal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz", + "integrity": "sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@rc-component/mutate-observer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz", + "integrity": "sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/portal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.2.tgz", + "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/qrcode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-1.0.0.tgz", + "integrity": "sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7", + "classnames": "^2.3.2", + "rc-util": "^5.38.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/tour": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-1.15.1.tgz", + "integrity": "sha512-Tr2t7J1DKZUpfJuDZWHxyxWpfmj8EZrqSgyMZ+BCdvKZ6r1UDsfU46M/iWAAFBy961Ssfom2kv5f3UcjIL2CmQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "@rc-component/portal": "^1.0.0-9", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/trigger": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-2.2.6.tgz", + "integrity": "sha512-/9zuTnWwhQ3S3WT1T8BubuFTT46kvnXgaERR9f4BTKyn61/wpf/BvbImzYBubzJibU707FxwbKszLlHjcLiv1Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@rc-component/portal": "^1.1.0", + "classnames": "^2.3.2", + "rc-motion": "^2.0.0", + "rc-resize-observer": "^1.3.1", + "rc-util": "^5.44.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@react-hook/debounce": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@react-hook/debounce/-/debounce-3.0.0.tgz", + "integrity": "sha512-ir/kPrSfAzY12Gre0sOHkZ2rkEmM4fS5M5zFxCi4BnCeXh2nvx9Ujd+U4IGpKCuPA+EQD0pg1eK2NGLvfWejag==", + "license": "MIT", + "dependencies": { + "@react-hook/latest": "^1.0.2" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/@react-hook/event": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@react-hook/event/-/event-1.2.6.tgz", + "integrity": "sha512-JUL5IluaOdn5w5Afpe/puPa1rj8X6udMlQ9dt4hvMuKmTrBS1Ya6sb4sVgvfe2eU4yDuOfAhik8xhbcCekbg9Q==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/@react-hook/latest": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@react-hook/latest/-/latest-1.0.3.tgz", + "integrity": "sha512-dy6duzl+JnAZcDbNTfmaP3xHiKtbXYOaz3G51MGVljh548Y8MWzTr+PHLOfvpypEVW9zwvl+VyKjbWKEVbV1Rg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/@react-hook/throttle": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@react-hook/throttle/-/throttle-2.2.0.tgz", + "integrity": "sha512-LJ5eg+yMV8lXtqK3lR+OtOZ2WH/EfWvuiEEu0M3bhR7dZRfTyEJKxH1oK9uyBxiXPtWXiQggWbZirMCXam51tg==", + "license": "MIT", + "dependencies": { + "@react-hook/latest": "^1.0.2" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/@react-hook/window-size": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@react-hook/window-size/-/window-size-3.1.1.tgz", + "integrity": "sha512-yWnVS5LKnOUIrEsI44oz3bIIUYqflamPL27n+k/PC//PsX/YeWBky09oPeAoc9As6jSH16Wgo8plI+ECZaHk3g==", + "license": "MIT", + "dependencies": { + "@react-hook/debounce": "^3.0.0", + "@react-hook/event": "^1.2.1", + "@react-hook/throttle": "^2.2.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "license": "MIT" + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.11.0.tgz", + "integrity": "sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ==", + "license": "MIT" + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "license": "MIT" + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", + "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/webpack": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", + "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", + "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@swc/helpers/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/@tanstack/react-table": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.21.3.tgz", + "integrity": "sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==", + "license": "MIT", + "dependencies": { + "@tanstack/table-core": "8.21.3" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/@tanstack/table-core": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.21.3.tgz", + "integrity": "sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "license": "MIT" + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", + "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tybys/wasm-util/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, + "node_modules/@types/big.js": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@types/big.js/-/big.js-6.2.2.tgz", + "integrity": "sha512-e2cOW9YlVzFY2iScnGBBkplKsrn2CsObHQ2Hiw4V1sSyiGbgWL8IyqE3zFi1Pt5o1pdAtYkDAIsF3KKUPjdzaA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cors": { + "version": "2.8.18", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.18.tgz", + "integrity": "sha512-nX3d0sxJW41CqQvfOzVG1NCTXfFDrDWIghCZncpHeWlVFd81zxB/DLhg7avFg6eHLCRX7ckBmoIIcqa++upvJA==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/crypto-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.2.2.tgz", + "integrity": "sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/express": { + "version": "4.17.22", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.22.tgz", + "integrity": "sha512-eZUmSnhRX9YRSkplpz0N+k6NljUUn5l3EWZIKZvYzhvMphEuNiyyy1viH/ejgt66JWgALwC/gtSUAeQKtSwW/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "license": "MIT" + }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.9.tgz", + "integrity": "sha512-uoe+GxEuHbvy12OUQct2X9JenKM3qAscquYymuQN4fMWG9DBQtykrQEFcAbVACF7qaLw9BePSodUL0kquqBJpQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*", + "@types/node": "*" + } + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.15.29", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.29.tgz", + "integrity": "sha512-LNdjOkUDlU1RZb8e1kOIUpN1qQUlzGkEtbVNo53vbrwDg5om6oduhm4SiUaPW5ASTXhAiP0jInWG8Qx9fVlOeQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/pg": { + "version": "8.15.4", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.4.tgz", + "integrity": "sha512-I6UNVBAoYbvuWkkU3oosC8yxqH21f4/Jc4DK71JLG3dT2mdlGe1z+ep/LQGXaKaOgcvUrsQoPRqfgtMcvZiJhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.14", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", + "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.2.16", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.16.tgz", + "integrity": "sha512-LLFWr12ZhBJ4YVw7neWLe6Pk7Ey5R9OCydfuMsz1L8bZxzaawJj2p06Q8/EFEHDeTBQNFLF62X+CG7B2zIyu0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@types/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-WFHp9YUJQ6CKshqoC37iOlHnQSmxNc795UhB26CyBBttrN9svdIrUjl/NjnNmfcwtncN0h/0PPAFWv9ovP8mLA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/semver": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz", + "integrity": "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/sha256": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@types/sha256/-/sha256-0.2.2.tgz", + "integrity": "sha512-uKMaDzyzfcDYGEwTgLh+hmgDMxXWyIVodY8T+qt7A+NYvikW0lmGLMGbQ7BipCB8dzXHa55C9g+Ii/3Lgt1KmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", + "license": "MIT" + }, + "node_modules/@types/validator": { + "version": "13.15.1", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.1.tgz", + "integrity": "sha512-9gG6ogYcoI2mCMLdcO0NYI0AYrbxIjv0MDmy/5Ywo6CpWWrqYayc+mmgxRsCgtcGJm9BSbXkMsmxGah1iGHAAQ==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "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/eslint-plugin/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "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.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "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.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "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.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "license": "MIT", + "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.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "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/typescript-estree/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "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/utils/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "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/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.7.8.tgz", + "integrity": "sha512-rsRK8T7yxraNRDmpFLZCWqpea6OlXPNRRCjWMx24O1V86KFol7u2gj9zJCv6zB1oJjtnzWceuqdnCgOipFcJPA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.7.8.tgz", + "integrity": "sha512-16yEMWa+Olqkk8Kl6Bu0ltT5OgEedkSAsxcz1B3yEctrDYp3EMBu/5PPAGhWVGnwhtf3hNe3y15gfYBAjOv5tQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.7.8.tgz", + "integrity": "sha512-ST4uqF6FmdZQgv+Q73FU1uHzppeT4mhX3IIEmHlLObrv5Ep50olWRz0iQ4PWovadjHMTAmpuJAGaAuCZYb7UAQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.7.8.tgz", + "integrity": "sha512-Z/A/4Rm2VWku2g25C3tVb986fY6unx5jaaCFpx1pbAj0OKkyuJ5wcQLHvNbIcJ9qhiYwXfrkB7JNlxrAbg7YFg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.7.8.tgz", + "integrity": "sha512-HN0p7o38qKmDo3bZUiQa6gP7Qhf0sKgJZtRfSHi6JL2Gi4NaUVF0EO1sQ1RHbeQ4VvfjUGMh3QE5dxEh06BgQQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.7.8.tgz", + "integrity": "sha512-HsoVqDBt9G69AN0KWeDNJW+7i8KFlwxrbbnJffgTGpiZd6Jw+Q95sqkXp8y458KhKduKLmXfVZGnKBTNxAgPjw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.7.8.tgz", + "integrity": "sha512-VfR2yTDUbUvn+e/Aw22CC9fQg9zdShHAfwWctNBdOk7w9CHWl2OtYlcMvjzMAns8QxoHQoqn3/CEnZ4Ts7hfrA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.7.8.tgz", + "integrity": "sha512-xUauVQNz4uDgs4UJJiUAwMe3N0PA0wvtImh7V0IFu++UKZJhssXbKHBRR4ecUJpUHCX2bc4Wc8sGsB6P+7BANg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.7.8.tgz", + "integrity": "sha512-GqyIB+CuSHGhhc8ph5RrurtNetYJjb6SctSHafqmdGcRuGi6uyTMR8l18hMEhZFsXdFMc/MpInPLvmNV22xn+A==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.7.8.tgz", + "integrity": "sha512-eEU3rWIFRv60xaAbtsgwHNWRZGD7cqkpCvNtio/f1TjEE3HfKLzPNB24fA9X/8ZXQrGldE65b7UKK3PmO4eWIQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.7.8.tgz", + "integrity": "sha512-GVLI0f4I4TlLqEUoOFvTWedLsJEdvsD0+sxhdvQ5s+N+m2DSynTs8h9jxR0qQbKlpHWpc2Ortz3z48NHRT4l+w==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.7.8.tgz", + "integrity": "sha512-GX1pZ/4ncUreB0Rlp1l7bhKAZ8ZmvDIgXdeb5V2iK0eRRF332+6gRfR/r5LK88xfbtOpsmRHU6mQ4N8ZnwvGEA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.7.8.tgz", + "integrity": "sha512-n1N84MnsvDupzVuYqJGj+2pb9s8BI1A5RgXHvtVFHedGZVBCFjDpQVRlmsFMt6xZiKwDPaqsM16O/1isCUGt7w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.7.8.tgz", + "integrity": "sha512-x94WnaU5g+pCPDVedfnXzoG6lCOF2xFGebNwhtbJCWfceE94Zj8aysSxdxotlrZrxnz5D3ijtyFUYtpz04n39Q==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.10" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.7.8.tgz", + "integrity": "sha512-vst2u8EJZ5L6jhJ6iLis3w9rg16aYqRxQuBAMYQRVrPMI43693hLP7DuqyOBRKgsQXy9/jgh204k0ViHkqQgdg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.7.8.tgz", + "integrity": "sha512-yb3LZOLMFqnA+/ShlE1E5bpYPGDsA590VHHJPB+efnyowT776GJXBoh82em6O9WmYBUq57YblGTcMYAFBm72HA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.7.8.tgz", + "integrity": "sha512-hHKFx+opG5BA3/owMXon8ypwSotBGTdblG6oda/iOu9+OEYnk0cxD2uIcGyGT8jCK578kV+xMrNxqbn8Zjlpgw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/antd": { + "version": "5.25.4", + "resolved": "https://registry.npmjs.org/antd/-/antd-5.25.4.tgz", + "integrity": "sha512-yXdWqq1NJSZnD1HoPZWnWuQJGVYYnB3h0Ufsz4sbt3T0N9SdJ4G9GPpLMk8Gn9zWtwBekfR4THPVZ9uzAyhBHQ==", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^7.2.1", + "@ant-design/cssinjs": "^1.23.0", + "@ant-design/cssinjs-utils": "^1.1.3", + "@ant-design/fast-color": "^2.0.6", + "@ant-design/icons": "^5.6.1", + "@ant-design/react-slick": "~1.1.2", + "@babel/runtime": "^7.26.0", + "@rc-component/color-picker": "~2.0.1", + "@rc-component/mutate-observer": "^1.1.0", + "@rc-component/qrcode": "~1.0.0", + "@rc-component/tour": "~1.15.1", + "@rc-component/trigger": "^2.2.6", + "classnames": "^2.5.1", + "copy-to-clipboard": "^3.3.3", + "dayjs": "^1.11.11", + "rc-cascader": "~3.34.0", + "rc-checkbox": "~3.5.0", + "rc-collapse": "~3.9.0", + "rc-dialog": "~9.6.0", + "rc-drawer": "~7.3.0", + "rc-dropdown": "~4.2.1", + "rc-field-form": "~2.7.0", + "rc-image": "~7.12.0", + "rc-input": "~1.8.0", + "rc-input-number": "~9.5.0", + "rc-mentions": "~2.20.0", + "rc-menu": "~9.16.1", + "rc-motion": "^2.9.5", + "rc-notification": "~5.6.4", + "rc-pagination": "~5.1.0", + "rc-picker": "~4.11.3", + "rc-progress": "~4.0.0", + "rc-rate": "~2.13.1", + "rc-resize-observer": "^1.4.3", + "rc-segmented": "~2.7.0", + "rc-select": "~14.16.8", + "rc-slider": "~11.1.8", + "rc-steps": "~6.0.1", + "rc-switch": "~4.1.0", + "rc-table": "~7.50.5", + "rc-tabs": "~15.6.1", + "rc-textarea": "~1.10.0", + "rc-tooltip": "~6.4.0", + "rc-tree": "~5.13.1", + "rc-tree-select": "~5.27.0", + "rc-upload": "~4.9.2", + "rc-util": "^5.44.4", + "scroll-into-view-if-needed": "^3.1.0", + "throttle-debounce": "^5.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/any-base": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", + "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==", + "license": "MIT" + }, + "node_modules/apexcharts": { + "version": "3.41.0", + "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-3.41.0.tgz", + "integrity": "sha512-FJXA7NVjxs1q+ptR3b1I+pN8K/gWuXn+qLZjFz8EHvJOokdgcuwa/HSe5aC465HW/LWnrjWLSTsOQejQbQ42hQ==", + "license": "MIT", + "dependencies": { + "svg.draggable.js": "^2.2.2", + "svg.easing.js": "^2.0.0", + "svg.filter.js": "^2.0.2", + "svg.pathmorphing.js": "^0.1.3", + "svg.resize.js": "^1.4.3", + "svg.select.js": "^3.0.1" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.10.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz", + "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==", + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", + "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz", + "integrity": "sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.4", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz", + "integrity": "sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.4" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "license": "MIT", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/big.js": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.2.tgz", + "integrity": "sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/bigjs" + } + }, + "node_modules/bmp-js": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", + "integrity": "sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "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==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", + "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001718", + "electron-to-chromium": "^1.5.160", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-equal": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", + "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001720", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001720.tgz", + "integrity": "sha512-Ec/2yV2nNPwb4DnTANEV99ZWwm3ZWfdlfkQbWSDDt+PsXEVYwlhPH8tdMaPunYTKKmz7AnHi2oNEi1GcmKCD8g==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/centra": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/centra/-/centra-2.7.0.tgz", + "integrity": "sha512-PbFMgMSrmgx6uxCdm57RUos9Tc3fclMvhLSATYN39XsDV29B89zZ3KA89jmY0vwSGazyU+uerqwa6t+KaodPcg==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "license": "MIT" + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/compute-scroll-into-view": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz", + "integrity": "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/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, + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-hex": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/convert-hex/-/convert-hex-0.1.0.tgz", + "integrity": "sha512-w20BOb1PiR/sEJdS6wNrUjF5CSfscZFUp7R9NSlXH8h2wynzXVEPFPJECAnkNylZ+cvf3p7TyRUHggDmrwXT9A==" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-string": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/convert-string/-/convert-string-0.1.0.tgz", + "integrity": "sha512-1KX9ESmtl8xpT2LN2tFnKSbV4NiarbVi8DVb39ZriijvtTklyrT+4dT1wsGMHKD3CJUjXgvJzstm9qL9ICojGA==" + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "license": "MIT", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, + "node_modules/core-js-compat": { + "version": "3.42.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.42.0.tgz", + "integrity": "sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "license": "MIT" + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "license": "MIT" + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "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==", + "license": "BSD-2-Clause" + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", + "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", + "license": "MIT" + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dottie": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz", + "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==", + "license": "MIT" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/echarts": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.6.0.tgz", + "integrity": "sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "2.3.0", + "zrender": "5.6.1" + } + }, + "node_modules/echarts-for-react": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/echarts-for-react/-/echarts-for-react-3.0.2.tgz", + "integrity": "sha512-DRwIiTzx8JfwPOVgGttDytBqdp5VzCSyMRIxubgU/g2n9y3VLUmF2FK7Icmg/sNVkv4+rktmrLN9w22U2yy3fA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "size-sensor": "^1.0.1" + }, + "peerDependencies": { + "echarts": "^3.0.0 || ^4.0.0 || ^5.0.0", + "react": "^15.0.0 || >=16.0.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.161", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.161.tgz", + "integrity": "sha512-hwtetwfKNZo/UlwHIVBlKZVdy7o8bIZxxKs0Mv/ROPiQQQmDgdm5a+KvKtBsxM8ZjFzTaCeLoodZ8jiBE3o9rA==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/engine.io": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz", + "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==", + "license": "MIT", + "dependencies": { + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.7.2", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-client": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.3.tgz", + "integrity": "sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1", + "xmlhttprequest-ssl": "~2.1.1" + } + }, + "node_modules/engine.io-client/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", + "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.5", + "@esbuild/android-arm": "0.25.5", + "@esbuild/android-arm64": "0.25.5", + "@esbuild/android-x64": "0.25.5", + "@esbuild/darwin-arm64": "0.25.5", + "@esbuild/darwin-x64": "0.25.5", + "@esbuild/freebsd-arm64": "0.25.5", + "@esbuild/freebsd-x64": "0.25.5", + "@esbuild/linux-arm": "0.25.5", + "@esbuild/linux-arm64": "0.25.5", + "@esbuild/linux-ia32": "0.25.5", + "@esbuild/linux-loong64": "0.25.5", + "@esbuild/linux-mips64el": "0.25.5", + "@esbuild/linux-ppc64": "0.25.5", + "@esbuild/linux-riscv64": "0.25.5", + "@esbuild/linux-s390x": "0.25.5", + "@esbuild/linux-x64": "0.25.5", + "@esbuild/netbsd-arm64": "0.25.5", + "@esbuild/netbsd-x64": "0.25.5", + "@esbuild/openbsd-arm64": "0.25.5", + "@esbuild/openbsd-x64": "0.25.5", + "@esbuild/sunos-x64": "0.25.5", + "@esbuild/win32-arm64": "0.25.5", + "@esbuild/win32-ia32": "0.25.5", + "@esbuild/win32-x64": "0.25.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-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, + "license": "MIT", + "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-next": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.2.4.tgz", + "integrity": "sha512-lunIBhsoeqw6/Lfkd6zPt25w1bn0znLA/JCL+au1HoEpSb4/PpsOYsYtgV/q+YPsoKIOzFyU5xnb04iZnXjUvg==", + "license": "MIT", + "dependencies": { + "@next/eslint-plugin-next": "13.2.4", + "@rushstack/eslint-patch": "^1.1.3", + "@typescript-eslint/parser": "^5.42.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.31.7", + "eslint-plugin-react-hooks": "^4.5.0" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.5.tgz", + "integrity": "sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "license": "MIT", + "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==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/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, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exif-parser": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", + "integrity": "sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==" + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/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==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.4.5", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.5.tgz", + "integrity": "sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==", + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-type": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", + "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", + "license": "MIT", + "dependencies": { + "readable-web-to-node-stream": "^3.0.0", + "strtok3": "^6.2.4", + "token-types": "^4.1.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "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==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", + "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/gifwrap": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/gifwrap/-/gifwrap-0.10.1.tgz", + "integrity": "sha512-2760b1vpJHNmLzZ/ubTtNnEx5WApN/PYWJvXvgS+tL1egTTthayFYIQQNi136FLEDcN/IyEY2EcGpIITD6eYUw==", + "license": "MIT", + "dependencies": { + "image-q": "^4.0.0", + "omggif": "^1.0.10" + } + }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "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==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" + }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "license": "MIT", + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", + "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.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/husky": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", + "dev": true, + "license": "MIT", + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-q": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/image-q/-/image-q-4.0.0.tgz", + "integrity": "sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw==", + "license": "MIT", + "dependencies": { + "@types/node": "16.9.1" + } + }, + "node_modules/image-q/node_modules/@types/node": { + "version": "16.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz", + "integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==", + "license": "MIT" + }, + "node_modules/immutable": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.2.tgz", + "integrity": "sha512-qHKXW1q6liAk1Oys6umoaZbDRqjcjgSrbnrifHsfsttza7zcvRAsL7mMV6xWcyhwQy7Xj5v4hhbr6b+iDYwlmQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflection": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz", + "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==", + "engines": [ + "node >= 0.4.0" + ], + "license": "MIT" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-bun-module/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==", + "license": "MIT" + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "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==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/isomorphic-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", + "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.6.1", + "whatwg-fetch": "^3.4.1" + } + }, + "node_modules/isomorphic-fetch/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jimp": { + "version": "0.22.12", + "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.22.12.tgz", + "integrity": "sha512-R5jZaYDnfkxKJy1dwLpj/7cvyjxiclxU3F4TrI/J4j2rS0niq6YDUMoPn5hs8GDpO+OZGo7Ky057CRtWesyhfg==", + "license": "MIT", + "dependencies": { + "@jimp/custom": "^0.22.12", + "@jimp/plugins": "^0.22.12", + "@jimp/types": "^0.22.12", + "regenerator-runtime": "^0.13.3" + } + }, + "node_modules/jpeg-js": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", + "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==", + "license": "BSD-3-Clause" + }, + "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==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "license": "MIT" + }, + "node_modules/json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "license": "MIT", + "dependencies": { + "string-convert": "^0.2.0" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "license": "MIT", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/jwa": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", + "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "license": "MIT", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lint-staged": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.5.2.tgz", + "integrity": "sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.4.1", + "commander": "^13.1.0", + "debug": "^4.4.0", + "execa": "^8.0.1", + "lilconfig": "^3.1.3", + "listr2": "^8.2.5", + "micromatch": "^4.0.8", + "pidtree": "^0.6.0", + "string-argv": "^0.3.2", + "yaml": "^2.7.0" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/listr2": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.3.3.tgz", + "integrity": "sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/load-bmfont": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.2.tgz", + "integrity": "sha512-qElWkmjW9Oq1F9EI5Gt7aD9zcdHb9spJCW1L/dmPf7KzCCEJxq8nhHz5eCgI9aMf7vrG/wyaCqdsI+Iy9ZTlog==", + "license": "MIT", + "dependencies": { + "buffer-equal": "0.0.1", + "mime": "^1.3.4", + "parse-bmfont-ascii": "^1.0.3", + "parse-bmfont-binary": "^1.0.5", + "parse-bmfont-xml": "^1.1.4", + "phin": "^3.7.1", + "xhr": "^2.0.1", + "xtend": "^4.0.0" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/loader-utils/node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "license": "ISC" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "dependencies": { + "dom-walk": "^0.1.0" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.48", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.48.tgz", + "integrity": "sha512-f22b8LV1gbTO2ms2j2z13MuPogNoh5UzxL3nzNAYKGraILnbGc9NEE6dyiiiLv46DGRb8A4kg8UKWLjPthxBHw==", + "license": "MIT", + "dependencies": { + "moment": "^2.29.4" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", + "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^14 || ^16 || >=18" + } + }, + "node_modules/napi-postinstall": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.2.4.tgz", + "integrity": "sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg==", + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/next": { + "version": "13.5.11", + "resolved": "https://registry.npmjs.org/next/-/next-13.5.11.tgz", + "integrity": "sha512-WUPJ6WbAX9tdC86kGTu92qkrRdgRqVrY++nwM+shmWQwmyxt4zhZfR59moXSI4N8GDYCBY3lIAqhzjDd4rTC8Q==", + "license": "MIT", + "dependencies": { + "@next/env": "13.5.11", + "@swc/helpers": "0.5.2", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001406", + "postcss": "8.4.31", + "styled-jsx": "5.1.1", + "watchpack": "2.4.0" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=16.14.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "13.5.9", + "@next/swc-darwin-x64": "13.5.9", + "@next/swc-linux-arm64-gnu": "13.5.9", + "@next/swc-linux-arm64-musl": "13.5.9", + "@next/swc-linux-x64-gnu": "13.5.9", + "@next/swc-linux-x64-musl": "13.5.9", + "@next/swc-win32-arm64-msvc": "13.5.9", + "@next/swc-win32-ia32-msvc": "13.5.9", + "@next/swc-win32-x64-msvc": "13.5.9" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next-themes": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.2.1.tgz", + "integrity": "sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==", + "license": "MIT", + "peerDependencies": { + "next": "*", + "react": "*", + "react-dom": "*" + } + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/omggif": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", + "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==", + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, + "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==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-bmfont-ascii": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", + "integrity": "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA==", + "license": "MIT" + }, + "node_modules/parse-bmfont-binary": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", + "integrity": "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA==", + "license": "MIT" + }, + "node_modules/parse-bmfont-xml": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.6.tgz", + "integrity": "sha512-0cEliVMZEhrFDwMh4SxIyVJpqYoOWDJ9P895tFuS+XuNzI5UBmBk5U5O4KuJdTnZpSBI4LFA2+ZiJaiwfSwlMA==", + "license": "MIT", + "dependencies": { + "xml-parse-from-string": "^1.0.0", + "xml2js": "^0.5.0" + } + }, + "node_modules/parse-headers": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.6.tgz", + "integrity": "sha512-Tz11t3uKztEW5FEVZnj1ox8GKblWn+PvHY9TmJV5Mll2uHEwRdR/5Li1OlXoECjLYkApdhWy44ocONwXLiKO5A==", + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/peek-readable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", + "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/pg-connection-string": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.9.0.tgz", + "integrity": "sha512-P2DEBKuvh5RClafLngkAuGe9OUlFV7ebu8w1kmaaOgPcpJd1RIFh7otETfI6hAR8YupOLFTY7nuvvIn7PLciUQ==", + "license": "MIT" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.0.tgz", + "integrity": "sha512-IpdytjudNuLv8nhlHs/UrVBhU0e78J0oIS/0AVdTbWxSOkFUVdsHC/NrorO6nXsQNDTT1kzDSOMJubBQviX18Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/phin": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/phin/-/phin-3.7.1.tgz", + "integrity": "sha512-GEazpTWwTZaEQ9RhL7Nyz0WwqilbqgLahDM3D0hxWwmVDI52nXEybHqiN6/elwpkJBhcuj+WbBu+QfT0uhPGfQ==", + "license": "MIT", + "dependencies": { + "centra": "^2.7.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pixelmatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", + "integrity": "sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA==", + "license": "ISC", + "dependencies": { + "pngjs": "^3.0.0" + }, + "bin": { + "pixelmatch": "bin/pixelmatch" + } + }, + "node_modules/pixelmatch/node_modules/pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pngjs": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz", + "integrity": "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==", + "license": "MIT", + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss/node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", + "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc-cascader": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.34.0.tgz", + "integrity": "sha512-KpXypcvju9ptjW9FaN2NFcA2QH9E9LHKq169Y0eWtH4e/wHQ5Wh5qZakAgvb8EKZ736WZ3B0zLLOBsrsja5Dag==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.7", + "classnames": "^2.3.1", + "rc-select": "~14.16.2", + "rc-tree": "~5.13.0", + "rc-util": "^5.43.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-checkbox": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-3.5.0.tgz", + "integrity": "sha512-aOAQc3E98HteIIsSqm6Xk2FPKIER6+5vyEFMZfo73TqM+VVAIqOkHoPjgKLqSNtVLWScoaM7vY2ZrGEheI79yg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.3.2", + "rc-util": "^5.25.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-collapse": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.9.0.tgz", + "integrity": "sha512-swDdz4QZ4dFTo4RAUMLL50qP0EY62N2kvmk2We5xYdRwcRn8WcYtuetCJpwpaCbUfUt5+huLpVxhvmnK+PHrkA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.3.4", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dialog": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.6.0.tgz", + "integrity": "sha512-ApoVi9Z8PaCQg6FsUzS8yvBEQy0ZL2PkuvAgrmohPkN3okps5WZ5WQWPc1RNuiOKaAYv8B97ACdsFU5LizzCqg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.0.0-8", + "classnames": "^2.2.6", + "rc-motion": "^2.3.0", + "rc-util": "^5.21.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-drawer": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-7.3.0.tgz", + "integrity": "sha512-DX6CIgiBWNpJIMGFO8BAISFkxiuKitoizooj4BDyee8/SnBn0zwO2FHrNDpqqepj0E/TFTDpmEBCyFuTgC7MOg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@rc-component/portal": "^1.1.1", + "classnames": "^2.2.6", + "rc-motion": "^2.6.1", + "rc-util": "^5.38.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dropdown": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.2.1.tgz", + "integrity": "sha512-YDAlXsPv3I1n42dv1JpdM7wJ+gSUBfeyPK59ZpBD9jQhK9jVuxpjj3NmWQHOBceA1zEPVX84T2wbdb2SD0UjmA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.6", + "rc-util": "^5.44.1" + }, + "peerDependencies": { + "react": ">=16.11.0", + "react-dom": ">=16.11.0" + } + }, + "node_modules/rc-field-form": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-2.7.0.tgz", + "integrity": "sha512-hgKsCay2taxzVnBPZl+1n4ZondsV78G++XVsMIJCAoioMjlMQR9YwAp7JZDIECzIu2Z66R+f4SFIRrO2DjDNAA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "@rc-component/async-validator": "^5.0.3", + "rc-util": "^5.32.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-image": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-7.12.0.tgz", + "integrity": "sha512-cZ3HTyyckPnNnUb9/DRqduqzLfrQRyi+CdHjdqgsyDpI3Ln5UX1kXnAhPBSJj9pVRzwRFgqkN7p9b6HBDjmu/Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/portal": "^1.0.2", + "classnames": "^2.2.6", + "rc-dialog": "~9.6.0", + "rc-motion": "^2.6.2", + "rc-util": "^5.34.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-input": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.8.0.tgz", + "integrity": "sha512-KXvaTbX+7ha8a/k+eg6SYRVERK0NddX8QX7a7AnRvUa/rEH0CNMlpcBzBkhI0wp2C8C4HlMoYl8TImSN+fuHKA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.18.1" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-input-number": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-9.5.0.tgz", + "integrity": "sha512-bKaEvB5tHebUURAEXw35LDcnRZLq3x1k7GxfAqBMzmpHkDGzjAtnUL8y4y5N15rIFIg5IJgwr211jInl3cipag==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/mini-decimal": "^1.0.1", + "classnames": "^2.2.5", + "rc-input": "~1.8.0", + "rc-util": "^5.40.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-mentions": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.20.0.tgz", + "integrity": "sha512-w8HCMZEh3f0nR8ZEd466ATqmXFCMGMN5UFCzEUL0bM/nGw/wOS2GgRzKBcm19K++jDyuWCOJOdgcKGXU3fXfbQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.22.5", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.6", + "rc-input": "~1.8.0", + "rc-menu": "~9.16.0", + "rc-textarea": "~1.10.0", + "rc-util": "^5.34.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-menu": { + "version": "9.16.1", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.16.1.tgz", + "integrity": "sha512-ghHx6/6Dvp+fw8CJhDUHFHDJ84hJE3BXNCzSgLdmNiFErWSOaZNsihDAsKq9ByTALo/xkNIwtDFGIl6r+RPXBg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^2.0.0", + "classnames": "2.x", + "rc-motion": "^2.4.3", + "rc-overflow": "^1.3.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-motion": { + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.5.tgz", + "integrity": "sha512-w+XTUrfh7ArbYEd2582uDrEhmBHwK1ZENJiSJVb7uRxdE7qJSYjbO2eksRXmndqyKqKoYPc9ClpPh5242mV1vA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.44.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-notification": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-5.6.4.tgz", + "integrity": "sha512-KcS4O6B4qzM3KH7lkwOB7ooLPZ4b6J+VMmQgT51VZCeEcmghdeR4IrMcFq0LG+RPdnbe/ArT086tGM8Snimgiw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.9.0", + "rc-util": "^5.20.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-overflow": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.4.1.tgz", + "integrity": "sha512-3MoPQQPV1uKyOMVNd6SZfONi+f3st0r8PksexIdBTeIYbMX0Jr+k7pHEDvsXtR4BpCv90/Pv2MovVNhktKrwvw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.37.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-pagination": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-5.1.0.tgz", + "integrity": "sha512-8416Yip/+eclTFdHXLKTxZvn70duYVGTvUUWbckCCZoIl3jagqke3GLsFrMs0bsQBikiYpZLD9206Ej4SOdOXQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.3.2", + "rc-util": "^5.38.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-picker": { + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.11.3.tgz", + "integrity": "sha512-MJ5teb7FlNE0NFHTncxXQ62Y5lytq6sh5nUw0iH8OkHL/TjARSEvSHpr940pWgjGANpjCwyMdvsEV55l5tYNSg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.1", + "rc-overflow": "^1.3.2", + "rc-resize-observer": "^1.4.0", + "rc-util": "^5.43.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "date-fns": ">= 2.x", + "dayjs": ">= 1.x", + "luxon": ">= 3.x", + "moment": ">= 2.x", + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + }, + "peerDependenciesMeta": { + "date-fns": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + } + } + }, + "node_modules/rc-progress": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-4.0.0.tgz", + "integrity": "sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-util": "^5.16.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-rate": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.13.1.tgz", + "integrity": "sha512-QUhQ9ivQ8Gy7mtMZPAjLbxBt5y9GRp65VcUyGUMF3N3fhiftivPHdpuDIaWIMOTEprAjZPC08bls1dQB+I1F2Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.0.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-resize-observer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.4.3.tgz", + "integrity": "sha512-YZLjUbyIWox8E9i9C3Tm7ia+W7euPItNWSPX5sCcQTYbnwDb5uNpnLHQCG1f22oZWUhLw4Mv2tFmeWe68CDQRQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.7", + "classnames": "^2.2.1", + "rc-util": "^5.44.1", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-segmented": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.7.0.tgz", + "integrity": "sha512-liijAjXz+KnTRVnxxXG2sYDGd6iLL7VpGGdR8gwoxAXy2KglviKCxLWZdjKYJzYzGSUwKDSTdYk8brj54Bn5BA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-motion": "^2.4.4", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-select": { + "version": "14.16.8", + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.16.8.tgz", + "integrity": "sha512-NOV5BZa1wZrsdkKaiK7LHRuo5ZjZYMDxPP6/1+09+FB4KoNi8jcG1ZqLE3AVCxEsYMBe65OBx71wFoHRTP3LRg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^2.1.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-overflow": "^1.3.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-slider": { + "version": "11.1.8", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-11.1.8.tgz", + "integrity": "sha512-2gg/72YFSpKP+Ja5AjC5DPL1YnV8DEITDQrcc1eASrUYjl0esptaBVJBh5nLTXCCp15eD8EuGjwezVGSHhs9tQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.36.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-steps": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-6.0.1.tgz", + "integrity": "sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.16.7", + "classnames": "^2.2.3", + "rc-util": "^5.16.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-switch": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-4.1.0.tgz", + "integrity": "sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.21.0", + "classnames": "^2.2.1", + "rc-util": "^5.30.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-table": { + "version": "7.50.5", + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.50.5.tgz", + "integrity": "sha512-FDZu8aolhSYd3v9KOc3lZOVAU77wmRRu44R0Wfb8Oj1dXRUsloFaXMSl6f7yuWZUxArJTli7k8TEOX2mvhDl4A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/context": "^1.4.0", + "classnames": "^2.2.5", + "rc-resize-observer": "^1.1.0", + "rc-util": "^5.44.3", + "rc-virtual-list": "^3.14.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tabs": { + "version": "15.6.1", + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-15.6.1.tgz", + "integrity": "sha512-/HzDV1VqOsUWyuC0c6AkxVYFjvx9+rFPKZ32ejxX0Uc7QCzcEjTA9/xMgv4HemPKwzBNX8KhGVbbumDjnj92aA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.2", + "classnames": "2.x", + "rc-dropdown": "~4.2.0", + "rc-menu": "~9.16.0", + "rc-motion": "^2.6.2", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.34.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-textarea": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.10.0.tgz", + "integrity": "sha512-ai9IkanNuyBS4x6sOL8qu/Ld40e6cEs6pgk93R+XLYg0mDSjNBGey6/ZpDs5+gNLD7urQ14po3V6Ck2dJLt9SA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-input": "~1.8.0", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tooltip": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.4.0.tgz", + "integrity": "sha512-kqyivim5cp8I5RkHmpsp1Nn/Wk+1oeloMv9c7LXNgDxUpGm+RbXJGL+OPvDlcRnx9DBeOe4wyOIl4OKUERyH1g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.3.1", + "rc-util": "^5.44.3" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tree": { + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.13.1.tgz", + "integrity": "sha512-FNhIefhftobCdUJshO7M8uZTA9F4OPGVXqGfZkkD/5soDeOhwO06T/aKTrg0WD8gRg/pyfq+ql3aMymLHCTC4A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.1" + }, + "engines": { + "node": ">=10.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-tree-select": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.27.0.tgz", + "integrity": "sha512-2qTBTzwIT7LRI1o7zLyrCzmo5tQanmyGbSaGTIf7sYimCklAToVVfpMC6OAldSKolcnjorBYPNSKQqJmN3TCww==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.7", + "classnames": "2.x", + "rc-select": "~14.16.2", + "rc-tree": "~5.13.0", + "rc-util": "^5.43.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-upload": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.9.2.tgz", + "integrity": "sha512-nHx+9rbd1FKMiMRYsqQ3NkXUv7COHPBo3X1Obwq9SWS6/diF/A0aJ5OHubvwUAIDs+4RMleljV0pcrNUc823GQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.5", + "rc-util": "^5.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util": { + "version": "5.44.4", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.44.4.tgz", + "integrity": "sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "react-is": "^18.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/rc-virtual-list": { + "version": "3.18.6", + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.18.6.tgz", + "integrity": "sha512-TQ5SsutL3McvWmmxqQtMIbfeoE3dGjJrRSfKekgby7WQMpPIFvv4ghytp5Z0s3D8Nik9i9YNOCqHBfk86AwgAA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.0", + "classnames": "^2.2.6", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.36.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-apexcharts": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/react-apexcharts/-/react-apexcharts-1.4.0.tgz", + "integrity": "sha512-DrcMV4aAMrUG+n6412yzyATWEyCDWlpPBBhVbpzBC4PDeuYU6iF84SmExbck+jx5MUm4U5PM3/T307Mc3kzc9Q==", + "license": "MIT", + "dependencies": { + "prop-types": "^15.5.7" + }, + "peerDependencies": { + "apexcharts": "^3.18.0", + "react": ">=0.13" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-intersection-observer": { + "version": "9.16.0", + "resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.16.0.tgz", + "integrity": "sha512-w9nJSEp+DrW9KmQmeWHQyfaP6b03v+TdXynaoA964Wxt7mdR3An11z4NNCQgL4gKSK7y1ver2Fq+JKH6CWEzUA==", + "license": "MIT", + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "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==", + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/readable-stream/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/readable-web-to-node-stream": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.4.tgz", + "integrity": "sha512-9nX56alTf5bwXQ3ZDipHJhusu9NTQJ/CVPtb/XHAJCXihZeitfJvIRS4GqQ/mfIoOE3IelHMrpayVrosdHBuLw==", + "license": "MIT", + "dependencies": { + "readable-stream": "^4.7.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.1.1.tgz", + "integrity": "sha512-hMD7odLOt3LkTjcif8aRZqi/hybjpLNgSk5oF5FCowfCjok6LukpN2bDX7R5wDmbgBQFn7YoBxSagmtXHaJYJw==", + "license": "MIT" + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sass": { + "version": "1.89.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.89.1.tgz", + "integrity": "sha512-eMLLkl+qz7tx/0cJ9wI+w09GQ2zodTkcE/aVfywwdlRcI3EO19xGnbmJwg/JMIm+5MxVJ6outddLZ4Von4E++Q==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "license": "ISC" + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/scroll-into-view-if-needed": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", + "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==", + "license": "MIT", + "dependencies": { + "compute-scroll-into-view": "^3.0.2" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/sequelize": { + "version": "6.37.7", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.7.tgz", + "integrity": "sha512-mCnh83zuz7kQxxJirtFD7q6Huy6liPanI67BSlbzSYgVNl5eXVdE2CN1FuAeZwG1SNpGsNRCV+bJAVVnykZAFA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/sequelize" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.1.8", + "@types/validator": "^13.7.17", + "debug": "^4.3.4", + "dottie": "^2.0.6", + "inflection": "^1.13.4", + "lodash": "^4.17.21", + "moment": "^2.29.4", + "moment-timezone": "^0.5.43", + "pg-connection-string": "^2.6.1", + "retry-as-promised": "^7.0.4", + "semver": "^7.5.4", + "sequelize-pool": "^7.1.0", + "toposort-class": "^1.0.1", + "uuid": "^8.3.2", + "validator": "^13.9.0", + "wkx": "^0.5.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependenciesMeta": { + "ibm_db": { + "optional": true + }, + "mariadb": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "oracledb": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-hstore": { + "optional": true + }, + "snowflake-sdk": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "tedious": { + "optional": true + } + } + }, + "node_modules/sequelize-pool": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz", + "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/sequelize/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/sha256": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/sha256/-/sha256-0.2.0.tgz", + "integrity": "sha512-kTWMJUaez5iiT9CcMv8jSq6kMhw3ST0uRdcIWl3D77s6AsLXNXRp3heeqqfu5+Dyfu4hwpQnMzhqHh8iNQxw0w==", + "dependencies": { + "convert-hex": "~0.1.0", + "convert-string": "~0.1.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/size-sensor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/size-sensor/-/size-sensor-1.0.2.tgz", + "integrity": "sha512-2NCmWxY7A9pYKGXNBfteo4hy14gWu47rg5692peVMst6lQLPKrVjhY+UTEsPI5ceFRJSl3gVgMYaUi/hKuaiKw==", + "license": "ISC" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/socket.io": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", + "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.6.0", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", + "license": "MIT", + "dependencies": { + "debug": "~4.3.4", + "ws": "~8.17.1" + } + }, + "node_modules/socket.io-adapter/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-client": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz", + "integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.6.1", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-client/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==", + "license": "MIT" + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strtok3": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", + "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", + "license": "MIT", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^4.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/stylis": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/svg.draggable.js": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/svg.draggable.js/-/svg.draggable.js-2.2.2.tgz", + "integrity": "sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw==", + "license": "MIT", + "dependencies": { + "svg.js": "^2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.easing.js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/svg.easing.js/-/svg.easing.js-2.0.0.tgz", + "integrity": "sha512-//ctPdJMGy22YoYGV+3HEfHbm6/69LJUTAqI2/5qBvaNHZ9uUFVC82B0Pl299HzgH13rKrBgi4+XyXXyVWWthA==", + "license": "MIT", + "dependencies": { + "svg.js": ">=2.3.x" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.filter.js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/svg.filter.js/-/svg.filter.js-2.0.2.tgz", + "integrity": "sha512-xkGBwU+dKBzqg5PtilaTb0EYPqPfJ9Q6saVldX+5vCRy31P6TlRCP3U9NxH3HEufkKkpNgdTLBJnmhDHeTqAkw==", + "license": "MIT", + "dependencies": { + "svg.js": "^2.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.js": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/svg.js/-/svg.js-2.7.1.tgz", + "integrity": "sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA==", + "license": "MIT" + }, + "node_modules/svg.pathmorphing.js": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/svg.pathmorphing.js/-/svg.pathmorphing.js-0.1.3.tgz", + "integrity": "sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww==", + "license": "MIT", + "dependencies": { + "svg.js": "^2.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.resize.js": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/svg.resize.js/-/svg.resize.js-1.4.3.tgz", + "integrity": "sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw==", + "license": "MIT", + "dependencies": { + "svg.js": "^2.6.5", + "svg.select.js": "^2.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.resize.js/node_modules/svg.select.js": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-2.1.2.tgz", + "integrity": "sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ==", + "license": "MIT", + "dependencies": { + "svg.js": "^2.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.select.js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-3.0.1.tgz", + "integrity": "sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw==", + "license": "MIT", + "dependencies": { + "svg.js": "^2.6.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svgo": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/tapable": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", + "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.40.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.40.0.tgz", + "integrity": "sha512-cfeKl/jjwSR5ar7d0FGmave9hFGJT8obyo0z+CrQOylLDbk7X81nPU6vq9VORa5jU30SkDnT2FXjLbR8HLP+xA==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.14.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT", + "peer": 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==", + "license": "MIT" + }, + "node_modules/throttle-debounce": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz", + "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", + "license": "MIT", + "engines": { + "node": ">=12.22" + } + }, + "node_modules/timm": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/timm/-/timm-1.7.1.tgz", + "integrity": "sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==", + "license": "MIT" + }, + "node_modules/tinycolor2": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", + "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==", + "license": "MIT" + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/token-types": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", + "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", + "license": "MIT", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/toposort-class": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", + "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==", + "license": "MIT" + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tsc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/tsc/-/tsc-2.0.4.tgz", + "integrity": "sha512-fzoSieZI5KKJVBYGvwbVZs/J5za84f2lSTLPYf6AGiIf43tZ3GNrI1QzTLcjtyDDP4aLxd46RTZq1nQxe7+k5Q==", + "license": "MIT", + "bin": { + "tsc": "bin/tsc" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "license": "MIT", + "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/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.19.4", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.4.tgz", + "integrity": "sha512-gK5GVzDkJK1SI1zwHf32Mqxf2tSJkNx+eYcNly5+nHvWqXUJYUkWBQtKauoESz3ymezAI++ZwT855x5p5eop+Q==", + "license": "MIT", + "dependencies": { + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unrs-resolver": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.7.8.tgz", + "integrity": "sha512-2zsXwyOXmCX9nGz4vhtZRYhe30V78heAv+KDc21A/KMdovGHbZcixeD5JHEF0DrFXzdytwuzYclcPbvp8A3Jlw==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.2.2" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-darwin-arm64": "1.7.8", + "@unrs/resolver-binding-darwin-x64": "1.7.8", + "@unrs/resolver-binding-freebsd-x64": "1.7.8", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.7.8", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.7.8", + "@unrs/resolver-binding-linux-arm64-gnu": "1.7.8", + "@unrs/resolver-binding-linux-arm64-musl": "1.7.8", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.7.8", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.7.8", + "@unrs/resolver-binding-linux-riscv64-musl": "1.7.8", + "@unrs/resolver-binding-linux-s390x-gnu": "1.7.8", + "@unrs/resolver-binding-linux-x64-gnu": "1.7.8", + "@unrs/resolver-binding-linux-x64-musl": "1.7.8", + "@unrs/resolver-binding-wasm32-wasi": "1.7.8", + "@unrs/resolver-binding-win32-arm64-msvc": "1.7.8", + "@unrs/resolver-binding-win32-ia32-msvc": "1.7.8", + "@unrs/resolver-binding-win32-x64-msvc": "1.7.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/utif2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/utif2/-/utif2-4.1.0.tgz", + "integrity": "sha512-+oknB9FHrJ7oW7A2WZYajOcv4FcDR4CfoGB0dPNfxbi4GO05RRnFmt5oa23+9w32EanrYcSJWspUiJkLMs+37w==", + "license": "MIT", + "dependencies": { + "pako": "^1.0.11" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/uuidv4": { + "version": "6.2.13", + "resolved": "https://registry.npmjs.org/uuidv4/-/uuidv4-6.2.13.tgz", + "integrity": "sha512-AXyzMjazYB3ovL3q051VLH06Ixj//Knx7QnUSi1T//Ie3io6CpsPu9nVMOx5MoLWh6xV0B9J0hIaxungxXUbPQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "license": "MIT", + "dependencies": { + "@types/uuid": "8.3.4", + "uuid": "8.3.2" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "license": "MIT" + }, + "node_modules/validator": { + "version": "13.15.15", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.15.tgz", + "integrity": "sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/webpack": { + "version": "5.99.9", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.9.tgz", + "integrity": "sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-sources": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.0.tgz", + "integrity": "sha512-77R0RDmJfj9dyv5p3bM5pOHa+X8/ZkO9c7kpDstigkC4nIDobadsfSGCwB4bKhMVxqAok8tajaoR8rirM7+VFQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack/node_modules/watchpack": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", + "license": "MIT" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wkx": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", + "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", + "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/xhr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", + "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", + "license": "MIT", + "dependencies": { + "global": "~4.4.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/xml-parse-from-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", + "integrity": "sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==", + "license": "MIT" + }, + "node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz", + "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", + "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zrender": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.6.1.tgz", + "integrity": "sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==", + "license": "BSD-3-Clause", + "dependencies": { + "tslib": "2.3.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..709ccc2 --- /dev/null +++ b/package.json @@ -0,0 +1,75 @@ +{ + "name": "zano-p2p", + "version": "0.1.0", + "private": true, + "type": "module", + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start -p 30289", + "lint": "next lint", + "format": "prettier --write .", + "format:check": "prettier --check .", + "prepare": "husky" + }, + "lint-staged": { + "*.{js,jsx,ts,tsx}": [ + "prettier --write", + "eslint --fix" + ] + }, + "dependencies": { + "@react-hook/window-size": "^3.1.1", + "@tanstack/react-table": "^8.21.3", + "@types/jsonwebtoken": "^9.0.2", + "antd": "^5.23.2", + "apexcharts": "^3.41.0", + "axios": "^1.4.0", + "big.js": "^6.2.1", + "crypto-js": "^4.1.1", + "decimal.js": "^10.4.3", + "echarts": "^5.5.1", + "echarts-for-react": "^3.0.2", + "eslint-config-next": "13.2.4", + "express": "^4.18.2", + "jimp": "^0.22.8", + "jsonwebtoken": "^9.0.0", + "nanoid": "^4.0.1", + "next": "^13.2.4", + "next-themes": "^0.2.1", + "node-fetch": "^3.3.1", + "react": "18.2.0", + "react-apexcharts": "^1.4.0", + "react-dom": "18.2.0", + "react-intersection-observer": "^9.10.3", + "sequelize": "^6.37.3", + "sha256": "^0.2.0", + "socket.io": "^4.6.1", + "socket.io-client": "^4.6.1", + "ts-node": "^10.9.1", + "tsc": "^2.0.4", + "tsx": "^4.15.7", + "uuidv4": "^6.2.13" + }, + "devDependencies": { + "@svgr/webpack": "^8.0.1", + "@types/big.js": "^6.2.0", + "@types/crypto-js": "^4.1.1", + "@types/express": "^4.17.17", + "@types/pg": "^8.10.2", + "@types/react": "18.2.16", + "@types/react-dom": "^18.2.7", + "@types/sha256": "^0.2.0", + "@typescript-eslint/eslint-plugin": "^5.55.0", + "cross-env": "^7.0.3", + "eslint": "^8.57.1", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-prettier": "^10.1.5", + "eslint-plugin-import": "^2.31.0", + "husky": "^9.1.7", + "lint-staged": "^15.5.2", + "prettier": "3.5.3", + "sass": "^1.59.2", + "url-loader": "^4.1.1" + } +} diff --git a/prettier.config.cjs b/prettier.config.cjs new file mode 100644 index 0000000..bc5d4b9 --- /dev/null +++ b/prettier.config.cjs @@ -0,0 +1,12 @@ +/** @type {import("prettier").Config} */ +module.exports = { + semi: true, + singleQuote: true, + trailingComma: 'all', + printWidth: 100, + tabWidth: 4, + useTabs: true, + bracketSpacing: true, + arrowParens: 'always', + endOfLine: 'lf', +}; diff --git a/public/currencies/all.svg b/public/currencies/all.svg new file mode 100644 index 0000000..c13720e --- /dev/null +++ b/public/currencies/all.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/currencies/btc.svg b/public/currencies/btc.svg new file mode 100644 index 0000000..b845627 --- /dev/null +++ b/public/currencies/btc.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/currencies/cad.svg b/public/currencies/cad.svg new file mode 100644 index 0000000..8c32e68 --- /dev/null +++ b/public/currencies/cad.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/currencies/ct.svg b/public/currencies/ct.svg new file mode 100644 index 0000000..2175fef --- /dev/null +++ b/public/currencies/ct.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/currencies/eur.svg b/public/currencies/eur.svg new file mode 100644 index 0000000..d92b0c5 --- /dev/null +++ b/public/currencies/eur.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/currencies/firo.svg b/public/currencies/firo.svg new file mode 100644 index 0000000..fcd6e62 --- /dev/null +++ b/public/currencies/firo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/currencies/jpy.svg b/public/currencies/jpy.svg new file mode 100644 index 0000000..98e67b3 --- /dev/null +++ b/public/currencies/jpy.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/currencies/trade_tsds.svg b/public/currencies/trade_tsds.svg new file mode 100644 index 0000000..f3fbf75 --- /dev/null +++ b/public/currencies/trade_tsds.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/currencies/trade_wbtc.svg b/public/currencies/trade_wbtc.svg new file mode 100644 index 0000000..d3f67aa --- /dev/null +++ b/public/currencies/trade_wbtc.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/currencies/trade_weth.svg b/public/currencies/trade_weth.svg new file mode 100644 index 0000000..18e2f20 --- /dev/null +++ b/public/currencies/trade_weth.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/public/currencies/trade_zano.svg b/public/currencies/trade_zano.svg new file mode 100644 index 0000000..162dbf6 --- /dev/null +++ b/public/currencies/trade_zano.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/currencies/tsds.svg b/public/currencies/tsds.svg new file mode 100644 index 0000000..2175fef --- /dev/null +++ b/public/currencies/tsds.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/currencies/usd.svg b/public/currencies/usd.svg new file mode 100644 index 0000000..8c32e68 --- /dev/null +++ b/public/currencies/usd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/currencies/wbtc.svg b/public/currencies/wbtc.svg new file mode 100644 index 0000000..bd5bf8a --- /dev/null +++ b/public/currencies/wbtc.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/currencies/weth.svg b/public/currencies/weth.svg new file mode 100644 index 0000000..c40e78e --- /dev/null +++ b/public/currencies/weth.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/currencies/xmr.svg b/public/currencies/xmr.svg new file mode 100644 index 0000000..4a578b1 --- /dev/null +++ b/public/currencies/xmr.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/currencies/zano.svg b/public/currencies/zano.svg new file mode 100644 index 0000000..bdeb771 --- /dev/null +++ b/public/currencies/zano.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..4ce2fbd Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/social-banner.png b/public/social-banner.png new file mode 100644 index 0000000..5b95047 Binary files /dev/null and b/public/social-banner.png differ diff --git a/public/ui/featured.svg b/public/ui/featured.svg new file mode 100644 index 0000000..ee0cd4e --- /dev/null +++ b/public/ui/featured.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/ui/whitelisted.svg b/public/ui/whitelisted.svg new file mode 100644 index 0000000..9a6e589 --- /dev/null +++ b/public/ui/whitelisted.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/shared/utils.ts b/shared/utils.ts new file mode 100644 index 0000000..d6f74c6 --- /dev/null +++ b/shared/utils.ts @@ -0,0 +1,91 @@ +import Decimal from 'decimal.js'; + +export function validateTokensInput(input: string | number, decimal_point = 12) { + let inputVal = input; + + if (typeof inputVal === 'number') { + inputVal = inputVal.toString(); + } + + if (inputVal === '') { + return { + valid: false, + error: 'Invalid input', + }; + } + + inputVal = inputVal.replace(/[^0-9.,]/g, ''); + + const MAX_NUMBER = new Decimal(2).pow(64).minus(1); + + if (decimal_point < 0 || decimal_point > 18) { + return { + valid: false, + error: 'Invalid decimal point', + }; + } + + const dotInput = inputVal.replace(/,/g, ''); + + const decimalDevider = new Decimal(10).pow(decimal_point); + + const maxAllowedNumber = MAX_NUMBER.div(decimalDevider); + + const minAllowedNumber = new Decimal(1).div(decimalDevider); + + const rounded = (() => { + if (dotInput.replace('.', '').length > 20) { + const decimalParts = dotInput.split('.'); + + if (decimalParts.length === 2 && decimalParts[1].length > 1) { + const beforeDotLength = decimalParts[0].length; + const roundedInput = new Decimal(dotInput).toFixed( + Math.max(20 - beforeDotLength, 0), + ); + + if (roundedInput.replace(/./g, '').length <= 20) { + return roundedInput; + } + } + + return false; + } + return dotInput; + })(); + + const decimalsAmount = dotInput.split('.')[1]?.length || 0; + + if (decimalsAmount > decimal_point) { + return { + valid: false, + error: 'Invalid amount - too many decimal points', + }; + } + + if (rounded === false) { + return { + valid: false, + error: 'Invalid amount - number is too big or has too many decimal points', + }; + } + + const dotInputDecimal = new Decimal(rounded); + + if (dotInputDecimal.gt(maxAllowedNumber)) { + return { + valid: false, + error: 'Invalid amount - number is too big', + }; + } + + if (dotInputDecimal.lt(minAllowedNumber)) { + return { + valid: false, + error: 'Invalid amount - number is too small', + }; + } + + return { + valid: true, + }; +} diff --git a/src/assets/images/UI/arrow-outlined-right.svg b/src/assets/images/UI/arrow-outlined-right.svg new file mode 100644 index 0000000..a08849a --- /dev/null +++ b/src/assets/images/UI/arrow-outlined-right.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/images/UI/arrow.svg b/src/assets/images/UI/arrow.svg new file mode 100644 index 0000000..c39ba4e --- /dev/null +++ b/src/assets/images/UI/arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/UI/arrow_blue_right.svg b/src/assets/images/UI/arrow_blue_right.svg new file mode 100644 index 0000000..cd315dc --- /dev/null +++ b/src/assets/images/UI/arrow_blue_right.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/UI/arrow_right.svg b/src/assets/images/UI/arrow_right.svg new file mode 100644 index 0000000..32b0632 --- /dev/null +++ b/src/assets/images/UI/arrow_right.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/UI/arrow_white.svg b/src/assets/images/UI/arrow_white.svg new file mode 100644 index 0000000..20ae35f --- /dev/null +++ b/src/assets/images/UI/arrow_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/UI/burger_cross.svg b/src/assets/images/UI/burger_cross.svg new file mode 100644 index 0000000..e4abc28 --- /dev/null +++ b/src/assets/images/UI/burger_cross.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/images/UI/calendar_arrow.svg b/src/assets/images/UI/calendar_arrow.svg new file mode 100644 index 0000000..09686e3 --- /dev/null +++ b/src/assets/images/UI/calendar_arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/UI/callendar.svg b/src/assets/images/UI/callendar.svg new file mode 100644 index 0000000..03ffac6 --- /dev/null +++ b/src/assets/images/UI/callendar.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/images/UI/change_icon.svg b/src/assets/images/UI/change_icon.svg new file mode 100644 index 0000000..7968df4 --- /dev/null +++ b/src/assets/images/UI/change_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/UI/chart.svg b/src/assets/images/UI/chart.svg new file mode 100644 index 0000000..00afc5a --- /dev/null +++ b/src/assets/images/UI/chart.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/UI/clock_icon.svg b/src/assets/images/UI/clock_icon.svg new file mode 100644 index 0000000..bb34d27 --- /dev/null +++ b/src/assets/images/UI/clock_icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/images/UI/connection.svg b/src/assets/images/UI/connection.svg new file mode 100644 index 0000000..54066a9 --- /dev/null +++ b/src/assets/images/UI/connection.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/images/UI/cross_icon.svg b/src/assets/images/UI/cross_icon.svg new file mode 100644 index 0000000..47d30d0 --- /dev/null +++ b/src/assets/images/UI/cross_icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/images/UI/cross_icon_small.svg b/src/assets/images/UI/cross_icon_small.svg new file mode 100644 index 0000000..9b366dd --- /dev/null +++ b/src/assets/images/UI/cross_icon_small.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/images/UI/delete.svg b/src/assets/images/UI/delete.svg new file mode 100644 index 0000000..bf9ebdc --- /dev/null +++ b/src/assets/images/UI/delete.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/images/UI/deposit_sent.svg b/src/assets/images/UI/deposit_sent.svg new file mode 100644 index 0000000..da92597 --- /dev/null +++ b/src/assets/images/UI/deposit_sent.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/UI/dex_cross_icon.svg b/src/assets/images/UI/dex_cross_icon.svg new file mode 100644 index 0000000..a4cec44 --- /dev/null +++ b/src/assets/images/UI/dex_cross_icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/images/UI/down_icon.svg b/src/assets/images/UI/down_icon.svg new file mode 100644 index 0000000..ae0fbc6 --- /dev/null +++ b/src/assets/images/UI/down_icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/images/UI/dropdown_arrow.svg b/src/assets/images/UI/dropdown_arrow.svg new file mode 100644 index 0000000..9fe557e --- /dev/null +++ b/src/assets/images/UI/dropdown_arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/UI/dropdown_arrow_small.svg b/src/assets/images/UI/dropdown_arrow_small.svg new file mode 100644 index 0000000..066213e --- /dev/null +++ b/src/assets/images/UI/dropdown_arrow_small.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/UI/edit.svg b/src/assets/images/UI/edit.svg new file mode 100644 index 0000000..3c23b80 --- /dev/null +++ b/src/assets/images/UI/edit.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/images/UI/error.svg b/src/assets/images/UI/error.svg new file mode 100644 index 0000000..4ab91b5 --- /dev/null +++ b/src/assets/images/UI/error.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/images/UI/eye.svg b/src/assets/images/UI/eye.svg new file mode 100644 index 0000000..77b3f00 --- /dev/null +++ b/src/assets/images/UI/eye.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/images/UI/eye_close.svg b/src/assets/images/UI/eye_close.svg new file mode 100644 index 0000000..66d76d9 --- /dev/null +++ b/src/assets/images/UI/eye_close.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/images/UI/filter_icon.svg b/src/assets/images/UI/filter_icon.svg new file mode 100644 index 0000000..44c3964 --- /dev/null +++ b/src/assets/images/UI/filter_icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/images/UI/funds_confirmed.svg b/src/assets/images/UI/funds_confirmed.svg new file mode 100644 index 0000000..9e3d2ee --- /dev/null +++ b/src/assets/images/UI/funds_confirmed.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/UI/hamburger_icon.svg b/src/assets/images/UI/hamburger_icon.svg new file mode 100644 index 0000000..b5763e9 --- /dev/null +++ b/src/assets/images/UI/hamburger_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/images/UI/history_icon.svg b/src/assets/images/UI/history_icon.svg new file mode 100644 index 0000000..eef26d4 --- /dev/null +++ b/src/assets/images/UI/history_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/images/UI/info.svg b/src/assets/images/UI/info.svg new file mode 100644 index 0000000..987768f --- /dev/null +++ b/src/assets/images/UI/info.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/UI/info_alert_icon.svg b/src/assets/images/UI/info_alert_icon.svg new file mode 100644 index 0000000..4af2865 --- /dev/null +++ b/src/assets/images/UI/info_alert_icon.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/UI/info_blue.svg b/src/assets/images/UI/info_blue.svg new file mode 100644 index 0000000..dc7c1fc --- /dev/null +++ b/src/assets/images/UI/info_blue.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/UI/info_outlined.svg b/src/assets/images/UI/info_outlined.svg new file mode 100644 index 0000000..2e6ffb4 --- /dev/null +++ b/src/assets/images/UI/info_outlined.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/assets/images/UI/info_small.svg b/src/assets/images/UI/info_small.svg new file mode 100644 index 0000000..17c7b4c --- /dev/null +++ b/src/assets/images/UI/info_small.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/images/UI/lightning.png b/src/assets/images/UI/lightning.png new file mode 100644 index 0000000..a9d6b14 Binary files /dev/null and b/src/assets/images/UI/lightning.png differ diff --git a/src/assets/images/UI/lock.svg b/src/assets/images/UI/lock.svg new file mode 100644 index 0000000..7c8e856 --- /dev/null +++ b/src/assets/images/UI/lock.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/UI/logo_block.svg b/src/assets/images/UI/logo_block.svg new file mode 100644 index 0000000..45b5a1e --- /dev/null +++ b/src/assets/images/UI/logo_block.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/UI/logo_block_dark.svg b/src/assets/images/UI/logo_block_dark.svg new file mode 100644 index 0000000..5f129e8 --- /dev/null +++ b/src/assets/images/UI/logo_block_dark.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/UI/logout.svg b/src/assets/images/UI/logout.svg new file mode 100644 index 0000000..b9bb6b0 --- /dev/null +++ b/src/assets/images/UI/logout.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/images/UI/message.svg b/src/assets/images/UI/message.svg new file mode 100644 index 0000000..8f12231 --- /dev/null +++ b/src/assets/images/UI/message.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/UI/moon_icon.svg b/src/assets/images/UI/moon_icon.svg new file mode 100644 index 0000000..aada30f --- /dev/null +++ b/src/assets/images/UI/moon_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/images/UI/no_chats.svg b/src/assets/images/UI/no_chats.svg new file mode 100644 index 0000000..8b29bea --- /dev/null +++ b/src/assets/images/UI/no_chats.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/images/UI/no_offers.svg b/src/assets/images/UI/no_offers.svg new file mode 100644 index 0000000..c069b26 --- /dev/null +++ b/src/assets/images/UI/no_offers.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/UI/offer_canceled.svg b/src/assets/images/UI/offer_canceled.svg new file mode 100644 index 0000000..092719e --- /dev/null +++ b/src/assets/images/UI/offer_canceled.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/images/UI/offers.svg b/src/assets/images/UI/offers.svg new file mode 100644 index 0000000..11d3fad --- /dev/null +++ b/src/assets/images/UI/offers.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/UI/pagination_arrow.svg b/src/assets/images/UI/pagination_arrow.svg new file mode 100644 index 0000000..f7aa0b6 --- /dev/null +++ b/src/assets/images/UI/pagination_arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/UI/persons_icon.svg b/src/assets/images/UI/persons_icon.svg new file mode 100644 index 0000000..8aba82e --- /dev/null +++ b/src/assets/images/UI/persons_icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/images/UI/persons_selected_icon.svg b/src/assets/images/UI/persons_selected_icon.svg new file mode 100644 index 0000000..504b35b --- /dev/null +++ b/src/assets/images/UI/persons_selected_icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/images/UI/plus.svg b/src/assets/images/UI/plus.svg new file mode 100644 index 0000000..51e590b --- /dev/null +++ b/src/assets/images/UI/plus.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/UI/refrash_small_icon.svg b/src/assets/images/UI/refrash_small_icon.svg new file mode 100644 index 0000000..dca5293 --- /dev/null +++ b/src/assets/images/UI/refrash_small_icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/images/UI/refresh_icon.svg b/src/assets/images/UI/refresh_icon.svg new file mode 100644 index 0000000..90fcf00 --- /dev/null +++ b/src/assets/images/UI/refresh_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/UI/rocket.png b/src/assets/images/UI/rocket.png new file mode 100644 index 0000000..846997b Binary files /dev/null and b/src/assets/images/UI/rocket.png differ diff --git a/src/assets/images/UI/search_icon.svg b/src/assets/images/UI/search_icon.svg new file mode 100644 index 0000000..1fc8da0 --- /dev/null +++ b/src/assets/images/UI/search_icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/images/UI/search_large.svg b/src/assets/images/UI/search_large.svg new file mode 100644 index 0000000..449fd07 --- /dev/null +++ b/src/assets/images/UI/search_large.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/images/UI/send.svg b/src/assets/images/UI/send.svg new file mode 100644 index 0000000..3eaf0bb --- /dev/null +++ b/src/assets/images/UI/send.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/UI/social/discord.svg b/src/assets/images/UI/social/discord.svg new file mode 100644 index 0000000..1997859 --- /dev/null +++ b/src/assets/images/UI/social/discord.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/UI/social/telegram.svg b/src/assets/images/UI/social/telegram.svg new file mode 100644 index 0000000..72435ef --- /dev/null +++ b/src/assets/images/UI/social/telegram.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/UI/social/twitter.svg b/src/assets/images/UI/social/twitter.svg new file mode 100644 index 0000000..961dad3 --- /dev/null +++ b/src/assets/images/UI/social/twitter.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/UI/star_icon.svg b/src/assets/images/UI/star_icon.svg new file mode 100644 index 0000000..8d81ecb --- /dev/null +++ b/src/assets/images/UI/star_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/UI/star_selected_icon.svg b/src/assets/images/UI/star_selected_icon.svg new file mode 100644 index 0000000..05ae213 --- /dev/null +++ b/src/assets/images/UI/star_selected_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/UI/success.svg b/src/assets/images/UI/success.svg new file mode 100644 index 0000000..f3d7ca0 --- /dev/null +++ b/src/assets/images/UI/success.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/UI/sun_icon.svg b/src/assets/images/UI/sun_icon.svg new file mode 100644 index 0000000..0beb52c --- /dev/null +++ b/src/assets/images/UI/sun_icon.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/UI/sun_small.svg b/src/assets/images/UI/sun_small.svg new file mode 100644 index 0000000..633228f --- /dev/null +++ b/src/assets/images/UI/sun_small.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/UI/swap_icon.svg b/src/assets/images/UI/swap_icon.svg new file mode 100644 index 0000000..3e09ae6 --- /dev/null +++ b/src/assets/images/UI/swap_icon.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/images/UI/swap_selected_icon.svg b/src/assets/images/UI/swap_selected_icon.svg new file mode 100644 index 0000000..fdb4d08 --- /dev/null +++ b/src/assets/images/UI/swap_selected_icon.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/images/UI/tick_icon.svg b/src/assets/images/UI/tick_icon.svg new file mode 100644 index 0000000..8a5d542 --- /dev/null +++ b/src/assets/images/UI/tick_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/UI/time_icon.svg b/src/assets/images/UI/time_icon.svg new file mode 100644 index 0000000..89b5188 --- /dev/null +++ b/src/assets/images/UI/time_icon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/assets/images/UI/trade_arrow.svg b/src/assets/images/UI/trade_arrow.svg new file mode 100644 index 0000000..a5777a3 --- /dev/null +++ b/src/assets/images/UI/trade_arrow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/images/UI/trade_icon.svg b/src/assets/images/UI/trade_icon.svg new file mode 100644 index 0000000..b7d26b8 --- /dev/null +++ b/src/assets/images/UI/trade_icon.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/assets/images/UI/trade_selected_icon.svg b/src/assets/images/UI/trade_selected_icon.svg new file mode 100644 index 0000000..be48811 --- /dev/null +++ b/src/assets/images/UI/trade_selected_icon.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/assets/images/UI/tsds.svg b/src/assets/images/UI/tsds.svg new file mode 100644 index 0000000..2175fef --- /dev/null +++ b/src/assets/images/UI/tsds.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/assets/images/UI/up_icon.svg b/src/assets/images/UI/up_icon.svg new file mode 100644 index 0000000..a5fc371 --- /dev/null +++ b/src/assets/images/UI/up_icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/images/UI/volume_icon.svg b/src/assets/images/UI/volume_icon.svg new file mode 100644 index 0000000..a199626 --- /dev/null +++ b/src/assets/images/UI/volume_icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/images/UI/walletsettings_icon.svg b/src/assets/images/UI/walletsettings_icon.svg new file mode 100644 index 0000000..250c30a --- /dev/null +++ b/src/assets/images/UI/walletsettings_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/images/UI/wbtc.svg b/src/assets/images/UI/wbtc.svg new file mode 100644 index 0000000..bd5bf8a --- /dev/null +++ b/src/assets/images/UI/wbtc.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/images/UI/weth.svg b/src/assets/images/UI/weth.svg new file mode 100644 index 0000000..c40e78e --- /dev/null +++ b/src/assets/images/UI/weth.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/assets/images/UI/zano.svg b/src/assets/images/UI/zano.svg new file mode 100644 index 0000000..bdeb771 --- /dev/null +++ b/src/assets/images/UI/zano.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/UI/zano_trade_logo_block.svg b/src/assets/images/UI/zano_trade_logo_block.svg new file mode 100644 index 0000000..9e94d1c --- /dev/null +++ b/src/assets/images/UI/zano_trade_logo_block.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/UI/zano_trade_logo_block_dark.svg b/src/assets/images/UI/zano_trade_logo_block_dark.svg new file mode 100644 index 0000000..247d723 --- /dev/null +++ b/src/assets/images/UI/zano_trade_logo_block_dark.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/UI/zano_white.svg b/src/assets/images/UI/zano_white.svg new file mode 100644 index 0000000..3f4ef3a --- /dev/null +++ b/src/assets/images/UI/zano_white.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/images/temp/chart.svg b/src/assets/images/temp/chart.svg new file mode 100644 index 0000000..fb0f4bf --- /dev/null +++ b/src/assets/images/temp/chart.svg @@ -0,0 +1,279 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/temp/logo_block.svg b/src/assets/images/temp/logo_block.svg new file mode 100644 index 0000000..5d9392a --- /dev/null +++ b/src/assets/images/temp/logo_block.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/components/UI/Alert/Alert.module.scss b/src/components/UI/Alert/Alert.module.scss new file mode 100644 index 0000000..b709a3f --- /dev/null +++ b/src/components/UI/Alert/Alert.module.scss @@ -0,0 +1,73 @@ +.ui__alert { + width: 420px; + background: var(--alert-bg); + border-radius: 10px; + padding: 20px; + position: fixed; + top: 40px; + left: 50%; + transform: translate(-50%); + pointer-events: all; + display: flex; + justify-content: flex-start; + gap: 20px; + + .ui__alert__close { + cursor: pointer; + position: absolute; + right: 22px; + top: 22px; + display: flex; + + img { + width: 14px; + height: 14px; + opacity: 0.5; + } + } + + .ui__alert__data { + p { + color: var(--font-dimmed-color); + line-height: 150%; + } + } + + .ui__alert__success, + .ui__alert__error { + width: 64px; + min-width: 64px; + height: 64px; + background: #16d1d6; + border-radius: 10px; + display: flex; + justify-content: center; + align-items: center; + } + + .ui__alert__error { + background: #ff6767; + } + + .ui__alert__loader { + img { + height: 64px; + width: 64px; + } + } + + @media screen and (max-width: 500px) { + width: calc(100% - 40px); + gap: 15px; + + .ui__alert__data { + h3 { + font-size: 24px; + } + + p { + font-size: 18px; + } + } + } +} diff --git a/src/components/UI/Alert/Alert.tsx b/src/components/UI/Alert/Alert.tsx new file mode 100644 index 0000000..8a68c3a --- /dev/null +++ b/src/components/UI/Alert/Alert.tsx @@ -0,0 +1,89 @@ +import Popup from '@/components/UI/Popup/Popup'; +import successIcon from '@/assets/images/UI/success.svg'; +import smallCrossIcon from '@/assets/images/UI/cross_icon_small.svg'; +import errorIcon from '@/assets/images/UI/error.svg'; +import AlertProps from '@/interfaces/props/components/UI/Alert/AlertProps'; +import Preloader from '../Preloader/Preloader'; +import styles from './Alert.module.scss'; + +function Alert(props: AlertProps) { + const types = { + success: { + title: props.title || 'Success!', + subtitle: props.subtitle || 'Lorem ipsum dolor sit amet', + icon: ( +
+ success +
+ ), + }, + error: { + title: props.title || 'Fail!', + subtitle: props.subtitle || 'Lorem ipsum dolor sit amet', + icon: ( +
+ error +
+ ), + }, + loading: { + title: props.title || 'Loading...', + subtitle: props.subtitle || 'Lorem ipsum dolor sit amet', + icon: ( +
+ +
+ ), + }, + custom: { + title: props.title || '', + subtitle: props.subtitle || '', + icon: props.customIcon || null, + content: props.customContent || null, + }, + none: null, + }; + + const currentType = types[props.type || 'none']; + + if (!currentType) return null; + + function PopupContent() { + if (props.type === 'custom' && props.customContent) { + return ( +
+ {props.close && ( +
+ close +
+ )} + {props.customContent} +
+ ); + } + + if (currentType) { + return ( +
+ {props.close && ( +
+ close +
+ )} + {currentType.icon} +
+

{currentType.title}

+ {currentType.subtitle &&

{currentType.subtitle}

} + {props.type === 'custom' && props.children} +
+
+ ); + } + + return <>; + } + + return ; +} + +export default Alert; diff --git a/src/components/UI/Button/Button.module.scss b/src/components/UI/Button/Button.module.scss new file mode 100644 index 0000000..8f77b28 --- /dev/null +++ b/src/components/UI/Button/Button.module.scss @@ -0,0 +1,33 @@ +.button { + padding: 16px 40px; + color: #ffffff; + font-weight: 500; + font-size: 18px; + border-radius: 10px; + cursor: pointer; + + display: flex; + align-items: center; + justify-content: center; + + &:disabled { + opacity: 0.5; + cursor: default !important; + pointer-events: none; + } +} + +.transparent { + background-color: #ffffff00 !important; + border: 2px solid #1f8feb; + border-radius: 10px; + color: var(--font-main-color); + + &:hover { + background-color: var(--button-bordered-hover) !important; + } +} + +.btn__no_border { + border: 0; +} diff --git a/src/components/UI/Button/Button.tsx b/src/components/UI/Button/Button.tsx new file mode 100644 index 0000000..095d5ff --- /dev/null +++ b/src/components/UI/Button/Button.tsx @@ -0,0 +1,19 @@ +import ButtonProps from '@/interfaces/props/components/UI/Button/ButtonProps'; +import styles from './Button.module.scss'; + +function Button(props: ButtonProps) { + return ( + + ); +} + +export default Button; diff --git a/src/components/UI/ConnectButton/ConnectButton.tsx b/src/components/UI/ConnectButton/ConnectButton.tsx new file mode 100644 index 0000000..706bcc7 --- /dev/null +++ b/src/components/UI/ConnectButton/ConnectButton.tsx @@ -0,0 +1,144 @@ +import { useContext, useState } from 'react'; +import { Store } from '@/store/store-reducer'; +import { updateWalletState } from '@/store/actions'; +import Alert from '@/components/UI/Alert/Alert'; +import useUpdateUser from '@/hook/useUpdateUser'; +import AlertType from '@/interfaces/common/AlertType'; +import ConnectButtonProps from '@/interfaces/props/components/UI/ConnectButton/ConnectButtonProps'; +import ZanoWindow from '@/interfaces/common/ZanoWindow'; +import { getSavedWalletCredentials, setWalletCredentials } from '@/utils/utils'; +import { uuid } from 'uuidv4'; +import Button from '../Button/Button'; + +function ConnectButton(props: ConnectButtonProps) { + const [alertState, setAlertState] = useState(null); + const [alertErrMessage, setAlertErrMessage] = useState(); + const { state, dispatch } = useContext(Store); + const logged = !!state.wallet?.connected; + + const fetchUser = useUpdateUser(); + + async function connect() { + if (alertState) return; + + try { + setAlertState('loading'); + await new Promise((resolve) => setTimeout(resolve, 1000)); + const walletData = ( + await (window as unknown as ZanoWindow).zano.request('GET_WALLET_DATA') + ).data; + + if (!walletData?.address) { + throw new Error('Companion is offline'); + } + + if (!walletData?.alias) { + throw new Error('Alias not found'); + } + + let nonce = ''; + let signature = ''; + let publicKey = ''; + + const existingWallet = getSavedWalletCredentials(); + + if (existingWallet) { + nonce = existingWallet.nonce; + signature = existingWallet.signature; + publicKey = existingWallet.publicKey; + } else { + const generatedNonce = uuid(); + const signResult = await (window as unknown as ZanoWindow).zano.request( + 'REQUEST_MESSAGE_SIGN', + { message: generatedNonce }, + null, + ); + + if (!signResult?.data?.result) { + throw new Error('Sign denied'); + } + + nonce = generatedNonce; + signature = signResult.data.result.sig; + publicKey = signResult.data.result.pkey; + } + + const result = await fetch('/api/auth', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + data: { + alias: walletData.alias, + address: walletData.address, + signature, + publicKey, + message: nonce, + }, + }), + }).then((res) => res.json()); + + if (!result?.success) { + throw new Error('Server auth error'); + } + + if (!existingWallet) { + setWalletCredentials({ + publicKey, + signature, + nonce, + }); + } + + sessionStorage.setItem('token', result?.data); + + updateWalletState(dispatch, { ...walletData, connected: true }); + + await fetchUser(); + + await Notification.requestPermission(); + + setAlertState('success'); + setTimeout(() => setAlertState(null), 3000); + } catch (error) { + setAlertState('error'); + setAlertErrMessage((error as { message: string }).message); + setTimeout(() => setAlertState(null), 3000); + setWalletCredentials(undefined); + } + } + + let alertSubtitle: string; + + if (alertState === 'loading') { + alertSubtitle = 'Loading wallet data...'; + } else if (alertState === 'success') { + alertSubtitle = 'Wallet connected'; + } else { + alertSubtitle = alertErrMessage || 'Connection error'; + } + + return ( + <> + {!logged && ( + + )} + {alertState && ( + setAlertState(null)} + /> + )} + + ); +} + +export default ConnectButton; diff --git a/src/components/UI/ContentPreloader/ContentPreloader.module.scss b/src/components/UI/ContentPreloader/ContentPreloader.module.scss new file mode 100644 index 0000000..453ed49 --- /dev/null +++ b/src/components/UI/ContentPreloader/ContentPreloader.module.scss @@ -0,0 +1,17 @@ +.content__preloader__wrapper { + width: 100%; + display: flex; + justify-content: center; + align-items: center; + + > div { + display: flex; + flex-direction: column; + align-items: center; + gap: 20px; + } + + p { + color: var(--font-dimmed-color); + } +} diff --git a/src/components/UI/ContentPreloader/ContentPreloader.tsx b/src/components/UI/ContentPreloader/ContentPreloader.tsx new file mode 100644 index 0000000..95d129e --- /dev/null +++ b/src/components/UI/ContentPreloader/ContentPreloader.tsx @@ -0,0 +1,15 @@ +import Preloader from '@/components/UI/Preloader/Preloader'; +import styles from './ContentPreloader.module.scss'; + +function ContentPreloader(props: { className?: string }) { + return ( +
+
+ +

Loading...

+
+
+ ); +} + +export default ContentPreloader; diff --git a/src/components/UI/CurrencyDropdown/CurrencyDropdown.tsx b/src/components/UI/CurrencyDropdown/CurrencyDropdown.tsx new file mode 100644 index 0000000..f257675 --- /dev/null +++ b/src/components/UI/CurrencyDropdown/CurrencyDropdown.tsx @@ -0,0 +1,114 @@ +import { ReactComponent as DropdownArrowIcon } from '@/assets/images/UI/dropdown_arrow.svg'; +import { useContext, useEffect, useRef, useState } from 'react'; +import Image from 'next/image'; +import { nanoid } from 'nanoid'; +import { Store } from '@/store/store-reducer'; +import { separateArray } from '@/utils/utils'; +import useUpdateUser from '@/hook/useUpdateUser'; +import CurrencyDropdownProps from '@/interfaces/props/components/UI/CurrencyDropdown/CurrencyDropdownProps'; +import CurrencyRow from '@/interfaces/common/CurrencyRow'; +import Dropdown from '../Dropdown/Dropdown'; +import styles from './currencyDropdown.module.scss'; + +function CurrencyDropdown(props: CurrencyDropdownProps) { + const [dropdownOpened, setDropdownState] = useState(false); + const updateUser = useUpdateUser(); + + const { state } = useContext(Store); + const { value } = props; + const { setValue } = props; + + const popupRef = useRef(null); + + useEffect(() => { + if (!dropdownOpened) { + updateUser(); + } + }, [dropdownOpened]); + + useEffect(() => { + function handleClick(e: MouseEvent) { + if ( + !dropdownOpened || + (popupRef.current && popupRef.current.contains(e.target as Node)) + ) + return; + setDropdownState(false); + } + window.addEventListener('mousedown', handleClick); + return () => window.removeEventListener('mousedown', handleClick); + }, [dropdownOpened]); + + return ( +
+
setDropdownState(!dropdownOpened)} + > +
+ {value && value.code && value.name && ( + {value.name} + )} +

{value ? value.name : ''}

+
+ {/* arrow */} + +
+ + {dropdownOpened && ( +
+ {props.withAll && ( +
{ + setValue({ + id: '-1', + name: 'All', + code: 'all', + }); + setDropdownState(false); + }} + > + all +

All

+
+ )} + + {props.content?.map((e, i) => ( + { + setValue(e); + setDropdownState(false); + }} + body={ + !props.noStars + ? separateArray(e.data, (curr) => + (state?.user?.favourite_currencies || []).includes( + curr.id, + ), + ) + : e.data + } + /> + ))} +
+ )} +
+ ); +} + +export default CurrencyDropdown; diff --git a/src/components/UI/CurrencyDropdown/currencyDropdown.module.scss b/src/components/UI/CurrencyDropdown/currencyDropdown.module.scss new file mode 100644 index 0000000..a047ecd --- /dev/null +++ b/src/components/UI/CurrencyDropdown/currencyDropdown.module.scss @@ -0,0 +1,88 @@ +.currency__dropdown__wrapper { + position: relative; + border-radius: 10px; + + .currency__dropdown__header { + width: 254px; + height: 100%; + padding: 0 15px; + display: flex; + align-items: center; + justify-content: space-between; + border-radius: 10px; + background-color: var(--dropdown-bg-color); + transition: + border-radius 0s, + background-color 0.3s, + transform 0s; + cursor: pointer; + + &:hover { + background-color: var(--dropdown-bg-hover); + } + + &.opened { + border-radius: 10px 10px 0 0; + + .dropdown__arrow { + transform: rotateX(180deg); + } + } + + > div { + display: flex; + align-items: center; + gap: 6px; + + > img { + width: 100%; + height: 100%; + } + + > p { + font-weight: 500; + } + } + } + + .currency__dropdown__menu { + width: 100%; + position: absolute; + top: 100%; + left: 0; + border-radius: 0 0 10px 10px; + overflow: hidden; + z-index: 1; + + .currency__dropdown__all { + padding: 15px; + background-color: var(--dropdown-bg-color); + cursor: pointer; + display: flex; + gap: 6px; + align-items: center; + border-top: 1px solid var(--delimiter-color); + + img { + width: auto; + height: auto; + } + + > p { + font-weight: 500; + } + + &:hover { + background-color: var(--dropdown-bg-hover); + } + } + + > * { + border-bottom: 1px solid var(--delimiter-color); + + &:last-child { + border: 0; + } + } + } +} diff --git a/src/components/UI/CurvePairChart/CurvePairChart.module.scss b/src/components/UI/CurvePairChart/CurvePairChart.module.scss new file mode 100644 index 0000000..7db4eb9 --- /dev/null +++ b/src/components/UI/CurvePairChart/CurvePairChart.module.scss @@ -0,0 +1,18 @@ +.curve__chart__wrapper { + width: auto; + height: 50px; + position: relative; + + canvas { + width: 100%; + height: 100%; + } + + h5 { + position: absolute; + transform: translateY(-50%); + top: 50%; + white-space: nowrap; + color: var(--font-dimmed-color); + } +} diff --git a/src/components/UI/CurvePairChart/CurvePairChart.tsx b/src/components/UI/CurvePairChart/CurvePairChart.tsx new file mode 100644 index 0000000..42bd922 --- /dev/null +++ b/src/components/UI/CurvePairChart/CurvePairChart.tsx @@ -0,0 +1,97 @@ +import { useEffect, useRef } from 'react'; +import { useWindowWidth } from '@react-hook/window-size'; +import { canvasResize } from '@/utils/utils'; +import CurvePairChartProps from '@/interfaces/props/components/UI/CurvePairChart/CurvePairChartProps'; +import Point from '@/interfaces/common/Point'; +import styles from './CurvePairChart.module.scss'; + +function CurvePairChart(props: CurvePairChartProps) { + const canvasRef = useRef(null); + + const width = useWindowWidth(); + + const { data, isAscending } = props; + + function canvasDraw(canvas: HTMLCanvasElement, data: Point[] = []) { + canvasResize(canvas); + + const ctx = canvas.getContext('2d'); + + if (!ctx) return; + + ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); + + const rect = ctx.canvas.getBoundingClientRect(); + + const canvasWidth = rect.width; + const canvasHeight = rect.height; + + function drawChart(data: Point[]) { + if (!ctx) return; + + const padding = 3; + const drawingWidth = canvasWidth - padding * 2; + const drawingHeight = canvasHeight - padding * 2; + + const maxValue = Math.max(...data.map((e) => e.y)); + const minValue = Math.min(...data.map((e) => e.y)); + + const maxX = Math.max(...data.map((e) => e.x)); + const minX = Math.min(...data.map((e) => e.x)); + + // const step = drawingWidth / (data.length - 1); + + const points = data + .sort((a, b) => a.x - b.x) + .map((e) => { + const x = padding + ((e.x - minX) / (maxX - minX)) * drawingWidth; + const y = + canvasHeight - + padding - + ((e.y - minValue) / (maxValue - minValue)) * drawingHeight; + + return { x, y }; + }); + + if (points.length < 2) return; + + ctx.strokeStyle = isAscending ? 'rgba(22, 209, 214, 1)' : 'rgba(255, 103, 103, 1)'; + ctx.moveTo(points[0].x, points[0].y); + + ctx.lineWidth = 4; + ctx.lineCap = 'round'; + + let i; + + for (i = 0; i < points.length - 2; i++) { + const xc = (points[i].x + points[i + 1].x) / 2; + const yc = (points[i].y + points[i + 1].y) / 2; + + ctx.quadraticCurveTo(points[i].x, points[i].y, xc, yc); + } + + ctx.quadraticCurveTo(points[i].x, points[i].y, points[i + 1].x, points[i + 1].y); + ctx.stroke(); + } + + drawChart(data); + } + + useEffect(() => { + const canvas = canvasRef.current; + if (!canvas) return; + canvasDraw(canvas, data); + }, [data, width]); + + return ( +
+ {data?.length !== undefined && data.length < (props.minLength || 2) ? ( +
[ Low volume ]
+ ) : ( + + )} +
+ ); +} + +export default CurvePairChart; diff --git a/src/components/UI/DateRangeSelector/DateRangeSelector.module.scss b/src/components/UI/DateRangeSelector/DateRangeSelector.module.scss new file mode 100644 index 0000000..33676f7 --- /dev/null +++ b/src/components/UI/DateRangeSelector/DateRangeSelector.module.scss @@ -0,0 +1,235 @@ +.selector__wrapper { + position: relative; + + &.disabled { + pointer-events: none; + opacity: 0.5; + } + + .selector__header { + width: 100%; + height: 100%; + padding: 0 15px; + display: flex; + justify-content: space-between; + align-items: center; + background: var(--dropdown-bg-color); + border-radius: 10px; + cursor: pointer; + + > p { + font-weight: 500; + } + + &:hover { + background-color: var(--dropdown-bg-hover); + } + } + + .selector__calendar { + width: 446px; + position: absolute; + top: calc(100% + 20px); + left: 50%; + transform: translateX(-50%); + background: var(--dropdown-bg-color); + border-radius: 10px; + z-index: 1; + display: flex; + flex-direction: column; + gap: 20px; + + padding: 35px 0 20px 0; + + .selector__calendar__title { + padding: 0 8.5%; + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; + + > div { + display: flex; + gap: 12px; + + > button { + padding: 0; + width: 32px; + height: 32px; + border-radius: 50%; + background: var(--dimmed-btn-bg); + display: flex; + justify-content: center; + align-items: center; + cursor: pointer; + + &:last-child { + svg { + transform: rotate(180deg); + } + } + + &:hover { + background: var(--dimmed-btn-hover); + } + } + } + } + + .selector__calendar__body { + display: flex; + flex-direction: column; + gap: 20px; + + > div:first-child { + display: flex; + justify-content: space-between; + padding: 0 30px; + + > div { + width: 100%; + display: flex; + justify-content: center; + } + + p { + width: 44px; + text-align: center; + font-weight: 700; + color: var(--font-dimmed-color); + } + } + + .selector__calendar__dates { + display: flex; + flex-direction: column; + gap: 9px; + + > div { + width: 100%; + display: flex; + // justify-content: space-between; + + > div:first-child, + > div:last-child { + width: 30px; + min-width: 30px; + } + + .row__body { + width: 100%; + + > div { + width: 100%; + display: flex; + justify-content: center; + margin: 0 -1px; + } + } + + .selected, + .selected__starting, + .selected__ending { + background: #175faa; + + button { + color: #fff; + + &.faded { + color: rgba(255, 255, 255, 0.5); + } + + &:hover { + background-color: transparent; + } + } + } + + .selected__starting { + border-radius: 100px 0 0 100px; + } + + .selected__ending { + border-radius: 0 100px 100px 0; + } + + .selected__single { + > button { + background-color: #175faa; + + color: #fff; + + &.faded { + color: rgba(255, 255, 255, 0.5); + } + + &:hover { + background-color: #175faa; + } + } + } + + > div { + width: calc(100% + 2px); + display: flex; + justify-content: center; + } + + button { + padding: 0; + width: 44px; + height: 44px; + display: flex; + justify-content: center; + align-items: center; + border-radius: 50%; + background-color: transparent; + cursor: pointer; + color: var(--font-main-color); + + &.faded { + color: var(--font-faded-color); + } + + &:hover { + background: rgba(31, 143, 235, 0.2); + } + + > p { + font-weight: 500; + } + } + } + } + } + + @media screen and (max-width: 500px) { + width: 100%; + } + + @media screen and (max-width: 435px) { + .selector__calendar__title { + padding: 0 9.75%; + } + + .selector__calendar__body { + > div:first-child { + p { + font-size: 14px; + width: 32px; + } + } + + .selector__calendar__dates { + > div { + button { + width: 32px; + height: 32px; + font-size: 16px; + } + } + } + } + } + } +} diff --git a/src/components/UI/DateRangeSelector/DateRangeSelector.tsx b/src/components/UI/DateRangeSelector/DateRangeSelector.tsx new file mode 100644 index 0000000..d111d36 --- /dev/null +++ b/src/components/UI/DateRangeSelector/DateRangeSelector.tsx @@ -0,0 +1,269 @@ +import { ReactComponent as CalendarIcon } from '@/assets/images/UI/callendar.svg'; +import { ReactComponent as CalendarArrowIcon } from '@/assets/images/UI/calendar_arrow.svg'; +import { useRef, useState, useEffect, ReactNode } from 'react'; +import { nanoid } from 'nanoid'; +import { toStandardDateString } from '@/utils/utils'; +import DateRangeSelectorProps from '@/interfaces/props/components/UI/DateRangeSelector/DateRangeSelectorProps'; +import Button from '../Button/Button'; +import styles from './DateRangeSelector.module.scss'; + +function DateRangeSelector(props: DateRangeSelectorProps) { + const months = [ + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December', + ]; + + const weekdays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; + + const selectorRef = useRef(null); + + const [pageDate, setPageDate] = useState(new Date()); + + const [selectorShown, setSelectorState] = useState(false); + + const selectedDateState = props.value; + const setDateState = props.setValue || (() => undefined); + + const forwardButtonDisabled = !!( + pageDate.getFullYear() === new Date().getFullYear() && + pageDate.getMonth() === new Date().getMonth() + ); + + function rangeSelect(date: Date) { + if ( + (selectedDateState.first && selectedDateState.last) || + (!selectedDateState.first && !selectedDateState.last) || + (selectedDateState.first && date.getTime() < selectedDateState.first.getTime()) + ) { + // setFirstState(date); + // setLastState(null); + setDateState({ + first: date, + last: null, + }); + } else if (selectedDateState.first && date.getTime() > selectedDateState.first.getTime()) { + setDateState({ + first: selectedDateState.first, + last: date, + }); + } + } + + function getButtonClass(date: Date) { + let className = ''; + + if ( + selectedDateState.first && + !selectedDateState.last && + date.getTime() === selectedDateState.first.getTime() + ) { + className += `${styles.selected__single} `; + } + + if ( + selectedDateState.first && + selectedDateState.last && + date.getTime() === selectedDateState.first.getTime() + ) { + className += `${styles.selected__starting} `; + } + + if ( + selectedDateState.first && + selectedDateState.last && + date.getTime() === selectedDateState.last.getTime() + ) { + className += `${styles.selected__ending} `; + } + + if ( + selectedDateState.first && + selectedDateState.last && + date.getTime() > selectedDateState.first.getTime() && + date.getTime() < selectedDateState.last.getTime() + ) { + className += `${styles.selected} `; + } + + return className; + } + + const dateButtons = (() => { + const allButtons: ReactNode[] = []; + let buttonsRow: ReactNode[] = []; + let buttons: ReactNode[] = []; + let workingDate = new Date(pageDate); + workingDate.setDate(1); + + while (workingDate.getDay() !== 1) { + workingDate.setDate(workingDate.getDate() - 1); + } + + function pushButton(date: Date, notThisMonth: boolean) { + buttons.push( +
+ +
, + ); + + if (buttons.length === 1) { + buttonsRow.push( +
selectedDateState.first.getTime() && + date.getTime() <= selectedDateState.last.getTime() + ? styles.selected + : '' + } + >
, + ); + } + + if (buttons.length === 7) { + // allButtons.push(buttons); + // buttons = []; + buttonsRow.push( +
+ {buttons} +
, + ); + buttonsRow.push( +
= selectedDateState.first.getTime() && + date.getTime() < selectedDateState.last.getTime() + ? styles.selected + : '' + } + >
, + ); + allButtons.push(buttonsRow); + buttons = []; + buttonsRow = []; + } + + const result = new Date(date); + + result.setDate(date.getDate() + 1); + + return result; + } + + while (workingDate.getMonth() !== pageDate.getMonth()) { + workingDate = pushButton(workingDate, true); + } + + while (workingDate.getMonth() === pageDate.getMonth()) { + workingDate = pushButton(workingDate, false); + } + + while (workingDate.getDay() !== 1) { + workingDate = pushButton(workingDate, true); + } + + return allButtons; + })(); + + useEffect(() => { + function handleClick(e: MouseEvent) { + if ( + !selectorShown || + (selectorRef.current && selectorRef.current.contains(e.target as Node)) + ) + return; + setSelectorState(false); + setPageDate(selectedDateState.first || new Date()); + } + window.addEventListener('mousedown', handleClick); + return () => window.removeEventListener('mousedown', handleClick); + }, [selectorShown]); + + return ( +
+
{ + setSelectorState(!selectorShown); + setPageDate(selectedDateState.first || new Date()); + }} + > +

+ {/* 2023-01-12 - 2023-04-12 */} + {selectedDateState.first && selectedDateState.last + ? `${toStandardDateString(selectedDateState.first)} - ${toStandardDateString(selectedDateState.last)}` + : 'Select date'} +

+ +
+ {selectorShown && ( +
+
+
+ {months[pageDate.getMonth()]} {pageDate.getFullYear()} +
+
+ + +
+
+
+
+ {weekdays.map((e) => ( +
+

{e}

+
+ ))} +
+
+ {dateButtons.map((e) => ( +
{e}
+ ))} +
+
+
+ )} +
+ ); +} + +export default DateRangeSelector; diff --git a/src/components/UI/DepositTitle/DepositTitle.module.scss b/src/components/UI/DepositTitle/DepositTitle.module.scss new file mode 100644 index 0000000..01b546b --- /dev/null +++ b/src/components/UI/DepositTitle/DepositTitle.module.scss @@ -0,0 +1,5 @@ +.deposit__title { + display: flex; + align-items: center; + gap: 10px; +} diff --git a/src/components/UI/DepositTitle/DepositTitle.tsx b/src/components/UI/DepositTitle/DepositTitle.tsx new file mode 100644 index 0000000..550802c --- /dev/null +++ b/src/components/UI/DepositTitle/DepositTitle.tsx @@ -0,0 +1,14 @@ +import { ReactComponent as LockIcon } from '@/assets/images/UI/lock.svg'; +import styles from './DepositTitle.module.scss'; +import EmptyLink from '../EmptyLink/EmptyLink'; + +function DepositTitle(props: { className?: string }) { + return ( +
+ + Deposit +
+ ); +} + +export default DepositTitle; diff --git a/src/components/UI/Dropdown/Dropdown.module.scss b/src/components/UI/Dropdown/Dropdown.module.scss new file mode 100644 index 0000000..7e434dd --- /dev/null +++ b/src/components/UI/Dropdown/Dropdown.module.scss @@ -0,0 +1,145 @@ +.dropdown__wrapper { + position: relative; + width: 100%; + + p { + font-weight: 500; + } + + .dropdown__row { + padding: 16px 15px; + display: flex; + align-items: center; + + &.dropdown__content__row { + max-height: 54px; + } + + background-color: var(--dropdown-bg-color); + cursor: pointer; + + > div { + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; + gap: 5px; + } + + &.row_header { + background-color: var(--row-header-bg); + height: 100%; + + &:hover { + background-color: var(--row-header-bg); + } + + &.opened { + .dropdown__arrow { + transform: rotateX(180deg); + } + } + } + + &.header__self_contained { + background-color: var(--dropdown-bg-color); + border-radius: 10px; + + &.opened { + border-radius: 10px 10px 0 0; + } + + &:hover { + background-color: var(--dropdown-bg-hover); + } + } + + .dropdown__item { + display: flex; + align-items: center; + + img { + width: 100%; + height: 100%; + margin-right: 6px; + } + } + + &:hover { + background-color: var(--dropdown-bg-hover); + } + } + + .dropdown__menu { + left: 0; + z-index: 1; + + &.self_contained { + width: 100%; + position: absolute; + overflow: hidden; + border-radius: 0 0 10px 10px; + } + + .dropdown__row { + border-top: 1px solid var(--delimiter-color); + + &.row__disabled { + cursor: default; + opacity: 0.5; + + &:hover { + background-color: #11316b; + } + } + + &:last-child { + border-bottom: 1px solid var(--delimiter-color); + } + + &.dropdown__search__row { + cursor: auto; + + &:hover { + background-color: var(--dropdown-bg-hover); + } + } + + .dropdown__search { + width: 100%; + position: relative; + + .dropdown__search_input { + width: 100%; + height: 54px; + padding-left: 45px; + } + + .dropdown__search_icon { + position: absolute; + transform: translate(0, -50%); + top: 50%; + left: 15px; + } + } + + .dropdown__star { + &:hover { + opacity: 0.5; + } + + svg.selected { + path { + fill-opacity: 1; + fill: #1f8feb; + } + } + } + } + + .dropdown__list { + overflow: overlay; + background: var(--dropdown-bg-color); + } + } +} diff --git a/src/components/UI/Dropdown/Dropdown.tsx b/src/components/UI/Dropdown/Dropdown.tsx new file mode 100644 index 0000000..2bfb4a6 --- /dev/null +++ b/src/components/UI/Dropdown/Dropdown.tsx @@ -0,0 +1,201 @@ +import { ReactComponent as DropdownArrowIcon } from '@/assets/images/UI/dropdown_arrow.svg'; +import { ReactComponent as SearchIcon } from '@/assets/images/UI/search_icon.svg'; +import { ReactComponent as StarIcon } from '@/assets/images/UI/star_icon.svg'; +import Image from 'next/image'; +import { useState, useEffect, useRef, useContext, MouseEvent } from 'react'; +import { Store } from '@/store/store-reducer'; +import { sendFavouriteCurrencies } from '@/utils/methods'; +import DropdownProps from '@/interfaces/props/components/UI/Dropdown/DropdownProps'; +import DropdownRow from '@/interfaces/common/DropdownRow'; +import DropdownRowProps from '@/interfaces/props/components/UI/Dropdown/DropdownRowProps'; +import { knownCurrencies } from '@/utils/utils'; +import Input from '../Input/Input'; +import styles from './Dropdown.module.scss'; + +function Dropdown(props: DropdownProps) { + const maxItems = props.maxItems || 3; + + const { icon } = props; + + const { state } = useContext(Store); + const { value } = props; + const { setValue } = props; + + const [isOpen, changeOpenState] = useState(props.defaultOpen); + + const [searchState, setSearchState] = useState(''); + + const popupRef = useRef(null); + + const [favouriteCurrencies, setFavouriteCurrencies] = useState( + state?.user?.favourite_currencies || [], + ); + + function searchInputFunc(e: React.ChangeEvent) { + if (e.target) { + setSearchState((e.target as HTMLInputElement).value); + } + } + + useEffect(() => { + function handleClick(e: globalThis.MouseEvent) { + if (!isOpen || (popupRef.current && popupRef.current.contains(e.target as Node))) + return; + changeOpenState(false); + } + + if (props.selfContained) { + window.addEventListener('mousedown', handleClick); + return () => window.removeEventListener('mousedown', handleClick); + } + }, [isOpen]); + + function getIcon(ticker: string) { + const code = knownCurrencies.includes(ticker) ? ticker : 'ct'; + return `/currencies/${code}.svg`; + } + + function DropdownRow(props: DropdownRowProps) { + return ( +
+
{props.children}
+
+ ); + } + + function CurrencyList() { + const items = props.body?.filter((e) => + e.name.toLowerCase().includes(searchState.toLowerCase()), + ); + + async function starClick(event: MouseEvent, e: DropdownRow) { + if (!e.code) return; + if (!favouriteCurrencies.includes(e.code)) { + setFavouriteCurrencies([...favouriteCurrencies, e.code]); + await sendFavouriteCurrencies([...favouriteCurrencies, e.code]); + } else { + setFavouriteCurrencies(favouriteCurrencies.filter((fav: string) => fav !== e.code)); + await sendFavouriteCurrencies( + favouriteCurrencies.filter((fav: string) => fav !== e.code), + ); + } + } + + return ( + <> + {items?.map((e) => ( + ) => { + const target = event.target as HTMLElement; + if (target && (target.tagName === 'svg' || target.tagName === 'path')) + return; + setValue(e); + changeOpenState(false); + }} + > +
+ {props.withImages && e.code && e.name && ( + {e.name} + )} +

{e.name}

+
+ + {state.user?.address && !props.selfContained && !props.noStars && ( +
starClick(event, e)} + > + +
+ )} +
+ ))} + + ); + } + + return ( +
+ changeOpenState(!isOpen)} + header={true} + selfContained={props.selfContained} + > +
+ {props.withImages && value?.code && ( + {value.name} + )} +

{value?.name}

+
+ {/* arrow */} + {icon ?? } +
+ {isOpen && ( +
+ {props.withSearch && ( + <> + {DropdownRow({ + search: true, + children: ( +
+ + +
+ ), + })} + + )} +
+ +
+
+ )} +
+ ); +} + +export default Dropdown; diff --git a/src/components/UI/EmptyLink/EmptyLink.module.scss b/src/components/UI/EmptyLink/EmptyLink.module.scss new file mode 100644 index 0000000..0b2b6ad --- /dev/null +++ b/src/components/UI/EmptyLink/EmptyLink.module.scss @@ -0,0 +1,10 @@ +.empty_link { + cursor: auto; + font-size: 18px; + font-weight: 700; + color: var(--font-dimmed-color); + + &:hover { + color: var(--font-dimmed-color); + } +} diff --git a/src/components/UI/EmptyLink/EmptyLink.tsx b/src/components/UI/EmptyLink/EmptyLink.tsx new file mode 100644 index 0000000..a3f1f28 --- /dev/null +++ b/src/components/UI/EmptyLink/EmptyLink.tsx @@ -0,0 +1,17 @@ +import EmptyLinkProps from '@/interfaces/props/components/UI/EmptyLink/EmptyLinkProps'; +import Link from 'next/link'; +import styles from './EmptyLink.module.scss'; + +function EmptyLink(props: EmptyLinkProps) { + return ( + e.preventDefault()} + className={`${styles.empty_link} ${props.className}`} + > + {props.children} + + ); +} + +export default EmptyLink; diff --git a/src/components/UI/Filters/Filters.module.scss b/src/components/UI/Filters/Filters.module.scss new file mode 100644 index 0000000..98e1271 --- /dev/null +++ b/src/components/UI/Filters/Filters.module.scss @@ -0,0 +1,327 @@ +.filters, +.filters__popup { + width: 100%; + display: flex; + gap: 40px; + + button, + input { + height: 100%; + } + + .filters__switch { + display: flex; + background-color: var(--switch-bg-color); + border-radius: 10px; + + &:hover { + background-color: var(--switch-bg-hover); + } + + button { + padding: 0 48px; + color: #ffffff; + + &:hover { + background-color: #1f8feb; + } + + &.btn_unselected { + background-color: transparent; + + color: var(--font-main-color); + + &:hover { + background-color: transparent; + } + } + } + } + + .filters__limit__select { + padding: 0 15px; + display: flex; + align-items: center; + background-color: #11316b; + border-radius: 10px; + cursor: pointer; + + > div { + width: 224px; + display: flex; + justify-content: space-between; + + > div { + display: flex; + align-items: center; + + img { + margin-right: 6px; + } + } + } + } + + .filters__for { + display: flex; + align-items: center; + + p { + color: rgba(255, 255, 255, 0.7); + } + } + + .filters__price__wrapper { + position: relative; + + > div { + > :first-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; + } + } + + > input { + width: 400px; + padding: 0 15px; + padding-right: 70%; + } + + .filters__price__dropdown { + height: 100%; + min-width: 165px; + position: absolute; + top: 0; + right: 0; + + border-left: 2px solid var(--delimiter-color); + border-radius: 0 10px 10px 0; + } + } +} + +.filters { + @media screen and (max-width: 1500px) { + flex-wrap: wrap; + gap: 20px 0; + } + + @media screen and (max-width: 1500px) { + flex-direction: column; + + // button, input { + // height: 48px; + // } + + > * { + width: 100% !important; + // height: 48px; + } + + .filters__dropdown { + // height: 48px; + + > :first-child { + width: 100% !important; + } + } + + .filters__price__wrapper { + width: 100%; + + > input { + width: 100%; + padding-right: 65%; + } + } + + .filters__for { + height: auto; + justify-content: center; + } + + .filters__switch { + button { + width: 50%; + } + } + + .filters__price__dropdown { + width: 60% !important; + + > :first-child { + width: 100% !important; + } + } + + .filters__buttons { + width: auto !important; + gap: 20px; + + > button:last-child { + min-width: 55px; + } + } + } + + @media screen and (max-width: 550px) { + > div:first-child { + > * { + height: 48px !important; + } + + flex-direction: column; + } + + > div:last-child { + > * { + height: 48px !important; + } + + flex-direction: column; + + .filters__update_button { + max-width: 48px; + min-width: 0; + } + } + } + + > div:first-child { + display: flex; + gap: 20px; + + > * { + height: 55px; + } + + > div:last-child { + width: 100%; + } + } + + > div:last-child { + display: flex; + width: 100%; + gap: 20px; + } + + .filters__buttons { + display: flex; + justify-content: space-between; + width: 100%; + height: 55px; + + .filters__search_button { + padding: 0 32px; + } + + .filters__update_button { + padding: 0 12px; + display: flex; + align-items: center; + background-color: var(--dimmed-btn-bg); + + img { + width: 100%; + height: auto; + } + + &:hover { + background-color: var(--dimmed-btn-hover); + } + } + } +} + +.filters__popup { + flex-direction: column; + gap: 20px; + + > * { + width: 100%; + } + + > div:first-child { + display: flex; + flex-direction: column; + gap: 30px; + + > * { + height: 55px; + } + + > div:last-child { + width: 100%; + } + } + + > div:last-child { + height: 55px; + + > * { + height: 55px; + } + } + + button { + width: 100%; + } + + .filters__dropdown { + > :first-child { + width: 100%; + } + } + + .filters__price__wrapper { + > input { + width: 100%; + padding-right: 55%; + } + + .filters__price__dropdown { + width: 50%; + + > :first-child { + width: 100%; + } + } + } + + .filters__for { + height: auto; + justify-content: center; + } + + .filters__switch { + background: #273666; + } + + @media screen and (max-width: 680px) { + button, + input { + height: 48px; + } + + > div:first-child { + > * { + height: 48px; + } + } + + > div:last-child { + > * { + height: 48px; + } + } + + .filters__price__dropdown { + height: 48px; + + > :first-child { + height: 48px; + } + } + } +} diff --git a/src/components/UI/Filters/Filters.tsx b/src/components/UI/Filters/Filters.tsx new file mode 100644 index 0000000..7ba4f37 --- /dev/null +++ b/src/components/UI/Filters/Filters.tsx @@ -0,0 +1,117 @@ +import Button from '@/components/UI/Button/Button'; +import { ReactComponent as RefreshIcon } from '@/assets/images/UI/refresh_icon.svg'; +import Input from '@/components/UI/Input/Input'; +import CurrencyDropdown from '@/components/UI/CurrencyDropdown/CurrencyDropdown'; +import FiltersProps from '@/interfaces/props/components/UI/Filters/FiltersProps'; +import CurrencyRow from '@/interfaces/common/CurrencyRow'; +import styles from './Filters.module.scss'; + +// filtersState = { +// buyState: true, +// price: 0, +// inputCurrency: { +// name: "FIRO", +// icon: firoIcon +// }, +// targetCurrency: { +// name: "FIRO", +// icon: firoIcon +// } +// } + +function Filters(props: FiltersProps) { + const filtersState = props.value; + const setFiltersState = props.setValue; + + const stateForBtns = props.stateForBtns !== undefined ? props.stateForBtns : filtersState; + const setStateForBtns = + props.setStateForBtns !== undefined ? props.setStateForBtns : setFiltersState; + + // const [inputDropdownState, setInputState] = useState(currenciesElements[0].data[0]); + // const [targetDropdownState, setTargetState] = useState(currenciesElements[0].data[0]); + + return ( +
+
+
+ + +
+ e.name === 'Crypto currencies')} + withAll={props.withSearch} + className={styles.filters__dropdown} + value={filtersState.inputCurrency} + setValue={(e: CurrencyRow) => + setFiltersState({ ...filtersState, inputCurrency: e }) + } + /> +
+
+

for

+
+
+
+ setFiltersState({ ...filtersState, price: e.target.value })} + /> + e.name === 'Fiat currencies')} + className={styles.filters__price__dropdown} + // header={{ title: "ZANO", image: zanoIcon }} + value={filtersState.targetCurrency} + setValue={(e) => setFiltersState({ ...filtersState, targetCurrency: e })} + /> +
+ {props.withSearch && ( +
+ + +
+ )} +
+
+ ); +} + +export default Filters; diff --git a/src/components/UI/HorizontalSelect/HorizontalSelect.module.scss b/src/components/UI/HorizontalSelect/HorizontalSelect.module.scss new file mode 100644 index 0000000..967b65c --- /dev/null +++ b/src/components/UI/HorizontalSelect/HorizontalSelect.module.scss @@ -0,0 +1,61 @@ +.horizontal_select { + display: flex; + gap: 40px; + overflow: auto; + padding-bottom: 3px; + + &.tab { + gap: 10px; + + > div { + a { + font-size: 16px; + font-weight: 500; + display: block; + padding: 12px 16px; + border-radius: 10px; + + &.selected { + background-color: #1f8feb1a; + + &::after { + display: none; + } + } + } + } + } + + > div { + position: relative; + + .profile__filters__notification { + position: absolute; + transform: translate(50%, -50%); + top: -5px; + right: -10px; + } + + a { + font-weight: 600; + position: relative; + white-space: nowrap; + transition: none; + + &.selected { + color: var(--font-main-color); + cursor: auto; + + &::after { + content: ''; + position: absolute; + top: 100%; + left: 0; + width: 100%; + height: 2px; + background-color: var(--font-main-color); + } + } + } + } +} diff --git a/src/components/UI/HorizontalSelect/HorizontalSelect.tsx b/src/components/UI/HorizontalSelect/HorizontalSelect.tsx new file mode 100644 index 0000000..c1d833f --- /dev/null +++ b/src/components/UI/HorizontalSelect/HorizontalSelect.tsx @@ -0,0 +1,42 @@ +import Link from 'next/link'; +import { nanoid } from 'nanoid'; +import HorizontalSelectProps from '@/interfaces/props/components/UI/HorizontalSelect/HorizontalSelectProps'; +import HorizontalSelectValue from '@/interfaces/common/HorizontalSelectValue'; +import NotificationIndicator from '../NotificationIndicator/NotificationIndicator'; +import styles from './HorizontalSelect.module.scss'; + +function HorizontalSelect(props: HorizontalSelectProps) { + const { value } = props; + const { setValue } = props; + const { className } = props; + + return ( +
+ {props.body.map((e) => ( +
+ { + event.preventDefault(); + setValue(e); + }} + className={value?.code === e?.code ? styles.selected : ''} + > + {e?.name || ''} + + + {props.withNotifications && ( +
+ +
+ )} +
+ ))} +
+ ); +} + +export default HorizontalSelect; diff --git a/src/components/UI/IconDropdown/IconDropdown.module.scss b/src/components/UI/IconDropdown/IconDropdown.module.scss new file mode 100644 index 0000000..a36463f --- /dev/null +++ b/src/components/UI/IconDropdown/IconDropdown.module.scss @@ -0,0 +1,58 @@ +.container { + position: relative; + display: inline-block; +} + +.trigger { + background: none; + border: none; + cursor: pointer; + padding: 0; + margin: 0; + display: flex; + align-items: center; + justify-content: center; + + &:focus { + outline: none; + } +} + +.dropdown { + position: absolute; + top: 100%; + margin-top: 8px; + border-radius: 8px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); + z-index: 1000; + min-width: 175px; + overflow: hidden; + + &.left { + left: -142px; + } + + &.right { + right: 0; + } + + &.center { + left: 50%; + transform: translateX(-50%); + } +} + +.item { + padding: 10px 16px; + cursor: pointer; + transition: background-color 0.2s; + background-color: var(--dropdown-bg-color); + + font-size: 14px; + font-weight: 500; + + &.disabled { + opacity: 0.5; + cursor: not-allowed; + } +} diff --git a/src/components/UI/IconDropdown/IconDropdown.tsx b/src/components/UI/IconDropdown/IconDropdown.tsx new file mode 100644 index 0000000..114bd29 --- /dev/null +++ b/src/components/UI/IconDropdown/IconDropdown.tsx @@ -0,0 +1,67 @@ +import { ReactNode, useState, useRef, useEffect } from 'react'; +import styles from './IconDropdown.module.scss'; + +interface IconDropdownProps { + children: ReactNode; + items: { + content: ReactNode; + onClick?: () => void; + disabled?: boolean; + }[]; + position?: 'left' | 'right' | 'center'; + className?: string; + dropdownClassName?: string; +} + +export const IconDropdown = ({ + children, + items, + position = 'left', + className = '', + dropdownClassName = '', +}: IconDropdownProps) => { + const [isOpen, setIsOpen] = useState(false); + const dropdownRef = useRef(null); + + useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { + setIsOpen(false); + } + }; + + document.addEventListener('mousedown', handleClickOutside); + return () => document.removeEventListener('mousedown', handleClickOutside); + }, []); + + return ( +
+
setIsOpen(!isOpen)} + aria-expanded={isOpen} + > + {children} +
+ + {isOpen && ( +
+ {items.map((item, index) => ( +
{ + if (!item.disabled) { + item.onClick?.(); + setIsOpen(false); + } + }} + > + {item.content} +
+ ))} +
+ )} +
+ ); +}; diff --git a/src/components/UI/Input/Input.module.scss b/src/components/UI/Input/Input.module.scss new file mode 100644 index 0000000..40f69fd --- /dev/null +++ b/src/components/UI/Input/Input.module.scss @@ -0,0 +1,30 @@ +.input { + &:disabled { + opacity: 0.5; + } +} + +.input__default { + padding: 0 15px; + background-color: var(--dropdown-bg-color); + border-radius: 10px; + + &::placeholder { + color: var(--font-dimmed-color); + } + + &:focus { + background-color: var(--dropdown-bg-hover); + } +} + +.input__bordered { + padding: 0 15px; + background-color: var(--bordered-input-bg); + border: 1px solid var(--window-border-color); + border-radius: 8px; + + &::placeholder { + color: var(--font-dimmed-color); + } +} diff --git a/src/components/UI/Input/Input.tsx b/src/components/UI/Input/Input.tsx new file mode 100644 index 0000000..e6a62d9 --- /dev/null +++ b/src/components/UI/Input/Input.tsx @@ -0,0 +1,33 @@ +import InputProps from '@/interfaces/props/components/UI/Input/InputProps'; +import styles from './Input.module.scss'; + +function Input(props: InputProps) { + let inputClass = styles.input__range; + + if (!props.type || props.type === 'text' || props.type === 'number') { + inputClass = props.bordered ? styles.input__bordered : styles.input__default; + } + + return ( + (e.target as HTMLInputElement).blur() : undefined) + } + value={props.value} + onKeyDown={props.onKeyDown} + disabled={props.disabled} + maxLength={props.maxLength} + style={props.style} + /> + ); +} + +export default Input; diff --git a/src/components/UI/NotificationIndicator/NotificationIndicator.module.scss b/src/components/UI/NotificationIndicator/NotificationIndicator.module.scss new file mode 100644 index 0000000..2efcf4e --- /dev/null +++ b/src/components/UI/NotificationIndicator/NotificationIndicator.module.scss @@ -0,0 +1,14 @@ +.notification_indicator { + padding: 5px; + background-color: #ff6767; + display: flex; + justify-content: center; + border-radius: 100px; + min-width: 25px; + + .notification_indicator__count { + font-size: 12px; + font-weight: 700; + color: #ffffff; + } +} diff --git a/src/components/UI/NotificationIndicator/NotificationIndicator.tsx b/src/components/UI/NotificationIndicator/NotificationIndicator.tsx new file mode 100644 index 0000000..2d632b3 --- /dev/null +++ b/src/components/UI/NotificationIndicator/NotificationIndicator.tsx @@ -0,0 +1,14 @@ +import styles from './NotificationIndicator.module.scss'; + +function NotificationIndicator(props: { count?: number; className?: string }) { + const { className } = props; + return props.count ? ( +
+ {props.count} +
+ ) : ( + <> + ); +} + +export default NotificationIndicator; diff --git a/src/components/UI/PairText/PairText.module.scss b/src/components/UI/PairText/PairText.module.scss new file mode 100644 index 0000000..282c742 --- /dev/null +++ b/src/components/UI/PairText/PairText.module.scss @@ -0,0 +1,13 @@ +.pair__text { + display: flex; + flex-direction: column; + gap: 12px; + + > div { + display: flex; + + > p:first-child { + color: var(--font-dimmed-color); + } + } +} diff --git a/src/components/UI/PairText/PairText.tsx b/src/components/UI/PairText/PairText.tsx new file mode 100644 index 0000000..5be4530 --- /dev/null +++ b/src/components/UI/PairText/PairText.tsx @@ -0,0 +1,19 @@ +import PairTextProps from '@/interfaces/props/components/UI/PairText/PairText'; +import styles from './PairText.module.scss'; + +function PairText(props: PairTextProps) { + return ( +
+
+

{props.first.key}:

+

{props.first.value}

+
+
+

{props.second.key}:

+

{props.second.value}

+
+
+ ); +} + +export default PairText; diff --git a/src/components/UI/Popup/Popup.module.scss b/src/components/UI/Popup/Popup.module.scss new file mode 100644 index 0000000..6842a22 --- /dev/null +++ b/src/components/UI/Popup/Popup.module.scss @@ -0,0 +1,41 @@ +.popup_background { + height: 100vh; + width: 100%; + position: fixed; + top: 0; + right: 0; + z-index: 100; +} + +.popup_blur { + background: rgba(0, 0, 0, 0.5); +} + +.popup_scroll { + overflow: auto; +} + +.popup_no_pointer { + pointer-events: none; +} + +// .popup__close { +// background-color: var(--ui-danger-color); +// position: fixed; +// right: -5px; +// top: -5px; +// height: 25px; +// width: 25px; +// border-radius: 50%; +// display: flex; +// justify-content: center; +// align-items: center; +// cursor: pointer; +// svg { +// height: 60%; +// fill: var(--icons-color); +// } +// &:hover { +// background-color: var(--ui-danger-hover); +// } +// } diff --git a/src/components/UI/Popup/Popup.tsx b/src/components/UI/Popup/Popup.tsx new file mode 100644 index 0000000..2a41ab0 --- /dev/null +++ b/src/components/UI/Popup/Popup.tsx @@ -0,0 +1,52 @@ +import * as ReactDOM from 'react-dom'; +import { useEffect, useState } from 'react'; +import PopupProps from '@/interfaces/props/components/UI/Popup/PopupProps'; +import styles from './Popup.module.scss'; + +export default function Popup(props: PopupProps) { + const [popupContainer, setPopupContainer] = useState(null); + + function getPopupElement() { + const PopupContent = props.Content; + return ; + } + + useEffect(() => { + if (!props.scroll) return; + document.body.style.overflow = 'hidden'; + return () => { + document.body.style.overflow = 'auto'; + }; + }); + + useEffect(() => { + if (!props.blur) return; + + function handleClick(e: MouseEvent) { + if (e.target === popupContainer) props.close(); + } + window.addEventListener('mousedown', handleClick); + return () => window.removeEventListener('mousedown', handleClick); + }); + + useEffect(() => { + const container = document.createElement('div'); + container.setAttribute('id', `popup${document.querySelectorAll('body > div').length}`); + container.classList.add(styles.popup_background); + if (props.blur) container.classList.add(styles.popup_blur); + if (props.scroll) container.classList.add(styles.popup_scroll); + if (props.noPointer) container.classList.add(styles.popup_no_pointer); + if (props.classList) { + for (const className of props.classList) { + container.classList.add(className); + } + } + setPopupContainer(container); + document.body.appendChild(container); + return () => { + document.body.removeChild(container); + }; + }, []); + + return popupContainer ? ReactDOM.createPortal(getPopupElement(), popupContainer) :
; +} diff --git a/src/components/UI/Preloader/Preloader.module.scss b/src/components/UI/Preloader/Preloader.module.scss new file mode 100644 index 0000000..760e841 --- /dev/null +++ b/src/components/UI/Preloader/Preloader.module.scss @@ -0,0 +1,56 @@ +.ui__preloader__content { + display: inline-block; + position: relative; + width: 64px; + height: 64px; +} +.ui__preloader__content div { + box-sizing: border-box; + display: block; + position: absolute; + width: 100%; + height: 100%; + border: 16px solid transparent; + border-radius: 50%; + animation: preloader 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite; + border-color: #1f8feb transparent transparent transparent; +} +.ui__preloader__content div:nth-child(1) { + animation-delay: -0.45s; +} +.ui__preloader__content div:nth-child(2) { + animation-delay: -0.3s; +} +.ui__preloader__content div:nth-child(3) { + animation-delay: -0.15s; +} +@keyframes preloader { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} + +.preloader { + width: 100%; + height: 100%; + background-color: #233467; + position: fixed; + top: 0; + left: 0; + z-index: 99999; +} + +.preloader .ui__preloader__content { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 250px; + height: 250px; +} +.preloader .ui__preloader__content div { + border-width: 10px; +} diff --git a/src/components/UI/Preloader/Preloader.tsx b/src/components/UI/Preloader/Preloader.tsx new file mode 100644 index 0000000..cea5d9b --- /dev/null +++ b/src/components/UI/Preloader/Preloader.tsx @@ -0,0 +1,26 @@ +import PreloaderProps from '@/interfaces/props/components/UI/Preloader/PreloaderProps'; +import styles from './Preloader.module.scss'; + +function Preloader(props: PreloaderProps) { + function Loader() { + return ( +
+
+
+
+
+
+ ); + } + if (props.fullPage) { + return ( +
+ +
+ ); + } + + return ; +} + +export default Preloader; diff --git a/src/components/UI/ProfileWidget/ProfileWidget.module.scss b/src/components/UI/ProfileWidget/ProfileWidget.module.scss new file mode 100644 index 0000000..7fb353d --- /dev/null +++ b/src/components/UI/ProfileWidget/ProfileWidget.module.scss @@ -0,0 +1,56 @@ +.profile__widget { + display: flex; + align-items: center; + + .profile__widget__avatar { + width: 48px; + height: 48px; + margin-right: 15px; + display: flex; + align-items: center; + justify-content: center; + background-color: var(--profile-widget-avatar); + border-radius: 50% 50%; + + p { + font-weight: 500; + } + } + + .profile__widget__content { + height: 48px; + display: flex; + flex-direction: column; + justify-content: space-between; + + .profile__widget__title { + display: flex; + align-items: flex-end; + + :first-child { + font-weight: 500; + margin-right: 8px; + } + + .profile__widget__hash { + margin-bottom: 3px; + color: var(--font-dimmed-color); + font-size: 14px; + } + + &.widget__hashed { + :first-child { + font-size: 24px; + } + } + } + + .profile__widget__description { + p { + font-size: 14px; + color: var(--font-dimmed-color); + white-space: nowrap; + } + } + } +} diff --git a/src/components/UI/ProfileWidget/ProfileWidget.tsx b/src/components/UI/ProfileWidget/ProfileWidget.tsx new file mode 100644 index 0000000..783be86 --- /dev/null +++ b/src/components/UI/ProfileWidget/ProfileWidget.tsx @@ -0,0 +1,41 @@ +import { shortenAddress } from '@/utils/utils'; +import Link from 'next/link'; +import ProfileWidgetProps from '@/interfaces/props/components/UI/ProfileWidget/ProfileWidget'; +import styles from './ProfileWidget.module.scss'; + +function ProfileWidget(props: ProfileWidgetProps) { + return ( +
+
+

+ {props.offerData.alias ? props.offerData.alias[0] : 'n'} +

+
+
+
+ {props.withLink ? ( + @{props.offerData.alias || 'no alias'} + ) : ( +

@{props.offerData.alias || 'no alias'}

+ )} + {props.offerData?.hash && ( +

{props.offerData?.hash}

+ )} +
+
+

{shortenAddress(props.offerData.address, 6, 6)}

+
+
+
+ ); +} + +export default ProfileWidget; diff --git a/src/components/UI/RangeInput/RangeInput.module.scss b/src/components/UI/RangeInput/RangeInput.module.scss new file mode 100644 index 0000000..191d792 --- /dev/null +++ b/src/components/UI/RangeInput/RangeInput.module.scss @@ -0,0 +1,91 @@ +.input__range__wrapper { + position: relative; + display: flex; + + .input__range { + -webkit-appearance: none; + appearance: none; + width: 100%; + background: none; + outline: none; + border: none; + z-index: 5; + cursor: pointer; + } + + .input__range__tooltip { + position: absolute; + top: 30px; + transition: none; + transform: translateX(-50%); + } + + .range__slider { + height: 4px; + width: 100%; + position: absolute; + transform: translateY(-50%); + border-radius: 100px; + top: 50%; + z-index: 0; + + &.filled { + background-color: #1f8feb; + z-index: 1; + } + + &.unfilled { + background-color: var(--slider-bg-color); + } + } + + .markers { + width: calc(100% - 10px); + height: 10px; + position: absolute; + transform: translate(-50%, -50%); + top: 50%; + left: 50%; + + > div { + height: 10px; + width: 10px; + border-radius: 100px; + background-color: var(--slider-bg-color); + position: absolute; + top: 0; + transform: translateX(-50%); + z-index: 2; + transition: none; + + &.selected { + background-color: #1f8feb; + } + } + } + + .input__range::-webkit-slider-thumb { + -webkit-appearance: none; + height: 20px; + width: 20px; + border-radius: 50%; + background: #1f8feb; + cursor: ew-resize; + border: 2px solid var(--window-bg-color); + transition: background 0.3s ease-in-out; + } + + // .input__range::-webkit-slider-runnable-track::-webkit-slider-thumb { + // background-color: #fff; + // border: 2px solid #555; + // } + + // .input__range::-webkit-slider-runnable-track { + // -webkit-appearance: none; + // height: 20px; + // background-color: #1F8FEB; + // border: 1px solid #ffffff; + // box-shadow: none; + // background: transparent; + // } +} diff --git a/src/components/UI/RangeInput/RangeInput.tsx b/src/components/UI/RangeInput/RangeInput.tsx new file mode 100644 index 0000000..cc8f8a8 --- /dev/null +++ b/src/components/UI/RangeInput/RangeInput.tsx @@ -0,0 +1,71 @@ +import Tooltip from '@/components/UI/Tooltip/Tooltip'; +import RangeInputProps from '@/interfaces/props/components/UI/RangeInput/RangeInputProps'; +import { useState } from 'react'; +import styles from './RangeInput.module.scss'; + +function RangeInput(props: RangeInputProps) { + const [tooltipShown, setTooltipShown] = useState(false); + // const [inputValue, setInputValue] = useState("50"); + + const inputValue = props.value; + const { onInput } = props; + + const realValue = Math.max(Math.min(parseInt(inputValue, 10), 100), 0); + + const markersValues = [0, 25, 50, 75, 100]; + + return ( +
+ { + setTooltipShown(true); + }} + onMouseLeave={() => { + setTooltipShown(false); + }} + /> + + + {realValue}% + + +
+
+
+ {markersValues.map((e) => ( +
+ ))} +
+ + + {markersValues.map((e) => ( + +
+ ); +} + +export default RangeInput; diff --git a/src/components/UI/Switch/Switch.tsx b/src/components/UI/Switch/Switch.tsx new file mode 100644 index 0000000..82c9b5e --- /dev/null +++ b/src/components/UI/Switch/Switch.tsx @@ -0,0 +1,10 @@ +import { FC } from 'react'; +import { Switch as ANTDSwitch } from 'antd'; + +interface IProps { + checked: boolean; + onChange: (_checked: boolean) => void; + disabled?: boolean; +} + +export const Switch: FC = ({ ...rest }) => ; \ No newline at end of file diff --git a/src/components/UI/Tooltip/Tooltip.module.scss b/src/components/UI/Tooltip/Tooltip.module.scss new file mode 100644 index 0000000..31216a1 --- /dev/null +++ b/src/components/UI/Tooltip/Tooltip.module.scss @@ -0,0 +1,22 @@ +.tooltip { + padding: 13px 20px; + background: var(--switch-bg-color); + position: relative; + border-radius: 5px; + white-space: nowrap; + z-index: 3; + + p { + font-weight: 500; + } + + .tooltip__arrow { + width: 10px; + height: 10px; + position: absolute; + top: 0px; + left: 50%; + transform: translate(-50%, -50%) rotate(45deg); + background-color: var(--switch-bg-color); + } +} diff --git a/src/components/UI/Tooltip/Tooltip.tsx b/src/components/UI/Tooltip/Tooltip.tsx new file mode 100644 index 0000000..c8772f0 --- /dev/null +++ b/src/components/UI/Tooltip/Tooltip.tsx @@ -0,0 +1,15 @@ +import TooltipProps from '@/interfaces/props/components/UI/Tooltip/TooltipProps'; +import styles from './Tooltip.module.scss'; + +function Tooltip(props: TooltipProps) { + return props.shown ? ( +
+
+

{props.children}

+
+ ) : ( + <> + ); +} + +export default Tooltip; diff --git a/src/components/default/BackButton/BackButton.module.scss b/src/components/default/BackButton/BackButton.module.scss new file mode 100644 index 0000000..4c7d844 --- /dev/null +++ b/src/components/default/BackButton/BackButton.module.scss @@ -0,0 +1,4 @@ +.back_btn { + display: flex; + gap: 12px; +} diff --git a/src/components/default/BackButton/BackButton.tsx b/src/components/default/BackButton/BackButton.tsx new file mode 100644 index 0000000..c3b05d7 --- /dev/null +++ b/src/components/default/BackButton/BackButton.tsx @@ -0,0 +1,18 @@ +import { ReactComponent as ArrowWhiteIcon } from '@/assets/images/UI/arrow_white.svg'; +import Button from '@/components/UI/Button/Button'; +import { useRouter } from 'next/router'; +import styles from './BackButton.module.scss'; + +function BackButton() { + const router = useRouter(); + + return ( + + ); +} + +export default BackButton; diff --git a/src/components/default/CreateOfferPopup/CreateOfferPopup.module.scss b/src/components/default/CreateOfferPopup/CreateOfferPopup.module.scss new file mode 100644 index 0000000..d2a2573 --- /dev/null +++ b/src/components/default/CreateOfferPopup/CreateOfferPopup.module.scss @@ -0,0 +1,206 @@ +.create_offer__popup { + width: 640px; + display: flex; + flex-direction: column; + padding: 40px; + position: relative; + top: 10%; + left: 50%; + transform: translateX(-50%); + background-color: var(--window-bg-color); + border-radius: 10px; + + .create_offer__deposit { + display: flex; + flex-direction: column; + gap: 8px; + + h6 { + color: var(--font-dimmed-color); + } + } + + > div:first-child { + padding-bottom: 30px; + display: flex; + justify-content: space-between; + border-bottom: 1px solid var(--delimiter-color); + + img { + cursor: pointer; + } + } + + > div:nth-child(2) { + padding-top: 30px; + display: flex; + flex-direction: column; + gap: 30px; + + .create_offer__pay, + .create_offer__receive, + .create_offer__price { + display: flex; + flex-direction: column; + gap: 10px; + + h6 { + color: var(--font-dimmed-color); + } + + > :nth-child(2) { + width: 100%; + height: 54px; + + > :first-child { + width: 100%; + } + } + } + + .create_offer__filters { + h6 { + color: rgba(255, 255, 255, 0.7); + } + + display: flex; + flex-direction: column; + gap: 8px; + } + + .create_offer__comment { + display: flex; + flex-direction: column; + gap: 8px; + + textarea { + padding: 16px; + width: 100% !important; + height: 160px; + resize: none; + background-color: var(--bordered-input-bg); + border: 1px solid var(--window-border-color); + border-radius: 8px; + } + + textarea::placeholder { + color: var(--font-dimmed-color); + } + } + + .create_offer__buttons { + display: flex; + flex-direction: column; + gap: 10px; + + div { + display: flex; + gap: 20px; + + > * { + width: 100%; + } + + button:first-child { + background-color: #16d1d6; + + &:hover { + background-color: #45dade; + } + } + } + + p { + color: var(--font-dimmed-color); + font-size: 14px; + } + } + + .create_offer__parameters { + display: flex; + gap: 20px; + + > * { + width: 100%; + } + } + } + + @media screen and (max-width: 680px) { + width: 100%; + + .create_offer__buttons button { + padding-top: 13px; + padding-bottom: 13px; + } + } + + @media screen and (max-width: 520px) { + .create_offer__parameters { + flex-direction: column; + } + } + + @media screen and (max-width: 470px) { + padding: 40px 20px; + + .create_offer__buttons > div { + flex-direction: column; + } + } +} + +.windowed_inputs__wrapper { + padding: 2px; + border-radius: 10px; + + .windowed_inputs { + padding: 20px; + border-radius: 8px; + background-color: var(--window-bg-color); + display: flex; + flex-direction: column; + gap: 20px; + + .windowed_inputs__title { + display: flex; + gap: 10px; + } + + .windowed_inputs__pair { + display: flex; + flex-direction: column; + gap: 8px; + + > p { + font-weight: 700; + color: var(--font-dimmed-color); + } + + > div { + position: relative; + + input { + width: 100%; + padding: 15px; + padding-right: 75px; + } + + p { + position: absolute; + transform: translateY(-50%); + top: 50%; + right: 15px; + } + } + } + } + + &.blue { + background: radial-gradient(100% 188.88% at 0% 0%, #16d1d6 0%, #274cff 100%); + } + + &.grey { + background: var(--delimiter-color); + } +} diff --git a/src/components/default/CreateOfferPopup/CreateOfferPopup.tsx b/src/components/default/CreateOfferPopup/CreateOfferPopup.tsx new file mode 100644 index 0000000..44717db --- /dev/null +++ b/src/components/default/CreateOfferPopup/CreateOfferPopup.tsx @@ -0,0 +1,318 @@ +import crossIcon from '@/assets/images/UI/cross_icon.svg'; +import Input from '@/components/UI/Input/Input'; +import Button from '@/components/UI/Button/Button'; +import Alert from '@/components/UI/Alert/Alert'; +import { ChangeEvent, useContext, useEffect, useState } from 'react'; +import useUpdateUser from '@/hook/useUpdateUser'; +import { getFormattedCurrencies, updateOffer } from '@/utils/methods'; +import { Store } from '@/store/store-reducer'; +import triggerOffers from '@/store/triggers'; +import Dropdown from '@/components/UI/Dropdown/Dropdown'; +import CurrencyDropdown from '@/components/UI/CurrencyDropdown/CurrencyDropdown'; +import DepositTitle from '@/components/UI/DepositTitle/DepositTitle'; +import CreateOfferPopupProps from '@/interfaces/props/components/default/CreateOfferPopup/CreateOfferPopupProps'; +import CurrencyContentRow from '@/interfaces/common/CurrencyContentRow'; +import WindowedInputsProps, { + DepositState, + LimitsState, +} from '@/interfaces/props/components/default/CreateOfferPopup/WindowedInputsProps'; +import AlertType from '@/interfaces/common/AlertType'; +import CurrencyRow from '@/interfaces/common/CurrencyRow'; +import UpdateOfferData from '@/interfaces/fetch-data/update-offer/UpdateOfferData'; +import styles from './CreateOfferPopup.module.scss'; + +function CreateOfferPopup(props: CreateOfferPopupProps) { + const { offerData } = props; + + const { state, dispatch } = useContext(Store); + + const depositCurrencies = + state.config?.currencies.filter((e) => e?.type === 'deposit' || e?.code === 'zano') || []; + + const allowedDepositCurrencies = depositCurrencies.filter((e) => + (state.wallet?.assets || []).find((asset) => e.name === asset.ticker), + ); + + console.log(allowedDepositCurrencies); + + const [depositCurrency, setDepositCurrency] = useState( + offerData?.deposit_currency || allowedDepositCurrencies[0], + ); + + const [price, setPrice] = useState(offerData?.price.toString() || ''); + + const [firstCurrency, setFirstCurrency] = useState( + (offerData?.type === 'buy' ? offerData?.target_currency : offerData?.input_currency) || + null, + ); + const [secondCurrency, setSecondCurrency] = useState( + (offerData?.type === 'buy' ? offerData?.input_currency : offerData?.target_currency) || + null, + ); + + const [currenciesElements, setCurrencies] = useState([]); + + const [alertState, setAlertState] = useState(null); + + const [alertSubtitle, setAlertSubtitle] = useState(null); + + const fetchUser = useUpdateUser(); + + const [limits, setLimits] = useState({ + min: offerData?.min.toString() || '', + max: offerData?.max.toString() || '', + }); + + const [deposit, setDeposit] = useState({ + seller: offerData?.deposit_seller.toString() || '', + buyer: offerData?.deposit_buyer.toString() || '', + }); + + const [commentState, setCommentState] = useState(offerData?.comment || ''); + + useEffect(() => { + (async () => { + const allCurrencies = state.config?.currencies || []; + + const formattedCurrencies = getFormattedCurrencies(allCurrencies || []); + + setCurrencies(formattedCurrencies); + + if (!firstCurrency && !secondCurrency) { + setFirstCurrency(allCurrencies[0] ? allCurrencies[0] : null); + setSecondCurrency( + allCurrencies.filter((e) => e.type === 'fiat')[0] + ? allCurrencies.filter((e) => e.type === 'fiat')[0] + : null, + ); + } + })(); + }, [state.config?.currencies]); + + async function sendUpdateRequest() { + const limitsMin = parseFloat(limits.min); + const limitsMax = parseFloat(limits.max); + + const depositBuyer = parseFloat(deposit.buyer); + const depositSeller = parseFloat(deposit.seller); + + const offerPrice = parseFloat(price); + + const successedInput = + limits.min && limits.max && firstCurrency && secondCurrency && depositCurrency; + + const rangeCorrect = + limitsMin > 0 && + limitsMin < 1000000000 && + limitsMax > 0 && + limitsMax < 1000000000 && + depositBuyer > 0 && + depositBuyer < 1000000000 && + depositSeller > 0 && + depositSeller < 1000000000 && + parseFloat(price) > 0 && + parseFloat(price) < 10000000000 && + limitsMin < limitsMax && + (firstCurrency?.type === 'fiat') === (secondCurrency?.type === 'crypto'); + + if (!successedInput) { + setAlertState('error'); + setAlertSubtitle('Please, fill all fields'); + setTimeout(() => setAlertState(null), 3000); + return; + } + + if (!rangeCorrect) { + setAlertState('error'); + setAlertSubtitle('Please, set correct values'); + setTimeout(() => setAlertState(null), 3000); + return; + } + + const offerType = firstCurrency.type === 'fiat' ? 'buy' : 'sell'; + + const offerNewData: UpdateOfferData = { + number: offerData?.number || undefined, + price: offerPrice, + min: limitsMin, + max: limitsMax, + deposit_seller: depositSeller, + deposit_buyer: depositBuyer, + type: offerType, + comment: commentState || '', + input_currency_id: offerType === 'buy' ? secondCurrency.id : firstCurrency.id, + target_currency_id: offerType === 'buy' ? firstCurrency.id : secondCurrency.id, + deposit_currency_id: depositCurrency.id, + }; + + setAlertState('loading'); + setAlertSubtitle('Updating offer data'); + const result = await updateOffer(offerNewData); + if (!result.success) { + setAlertState('error'); + setAlertSubtitle('Server error occured.'); + setTimeout(() => setAlertState(null), 3000); + return; + } + setAlertState('success'); + + triggerOffers(dispatch); + + props.setPopupState(false); + await fetchUser(); + setTimeout(() => setAlertState(null), 3000); + // setAlertState(null); + } + + function WindowedInputs(props: WindowedInputsProps) { + function updateState(e: ChangeEvent, key: string) { + props.setValue({ + ...props.value, + [key]: e.target.value, + }); + } + + return ( +
+
+
+ {props.limits ?
Limits
: } +
+
+ {props.limits ? ( +

Min

+ ) : ( +

{firstCurrency?.type === 'crypto' ? 'You' : 'Seller'}

+ )} +
+ updateState(e, props.limits ? 'min' : 'seller')} + type="number" + // value={props.limits ? offerData.min || "" : offerData.deposit_seller || ""} + value={props.limits ? limits.min : deposit.seller} + /> +

{props.limits ? firstCurrency?.name : depositCurrency?.name}

+
+
+
+ {props.limits ? ( +

Max

+ ) : ( +

{secondCurrency?.type === 'crypto' ? 'You' : 'Buyer'}

+ )} +
+ updateState(e, props.limits ? 'max' : 'buyer')} + type="number" + value={props.limits ? limits.max || '' : deposit.buyer || ''} + /> +

{props.limits ? firstCurrency?.name : depositCurrency?.name}

+
+
+
+
+ ); + } + + return ( +
+
+
{props.edit ? 'Edit' : 'Create'} Offer
+ props.setPopupState(false)} src={crossIcon} alt="close" /> +
+
+ {/*
+
Offer type
+ +
*/} +
+
I pay
+ setFirstCurrency(e)} + /> +
+
+
I receive
+ setSecondCurrency(e)} + /> +
+
+
Price for 1 {firstCurrency?.name || ''}
+ setPrice(e.target.value)} + bordered + placeholder={`0 ${secondCurrency?.name}`} + /> +
+
+
Deposit currency
+ +
+
+ {WindowedInputs({ value: limits, setValue: setLimits, limits: true })} + {WindowedInputs({ value: deposit, setValue: setDeposit })} +
+
+
Comment
+ +
+
+
+ + +
+

+ Vivamus suscipit, nisi vel consequat condimentum, diam est volutpat nisi, + quis scelerisque dui odio non tellus. +

+
+
+ + {alertState && ( + setAlertState(null)} + /> + )} +
+ ); +} + +export default CreateOfferPopup; diff --git a/src/components/default/DetailedOfferPopup/DetailedOfferPopup.module.scss b/src/components/default/DetailedOfferPopup/DetailedOfferPopup.module.scss new file mode 100644 index 0000000..b13feaf --- /dev/null +++ b/src/components/default/DetailedOfferPopup/DetailedOfferPopup.module.scss @@ -0,0 +1,298 @@ +.popup__content { + width: 1020px; + padding: 40px; + background-color: #ffffff; + position: relative; + transform: translate(-50%, -50%); + top: 50%; + left: 50%; + background: var(--window-bg-color); + border-radius: 10px; + + @media screen and (max-height: 700px), (max-width: 930px) { + top: 15%; + transform: translate(-50%); + } + + > div { + display: flex; + + &:first-child { + justify-content: space-between; + padding-bottom: 30px; + border-bottom: 1px solid var(--delimiter-color); + + img { + cursor: pointer; + } + } + + &:last-child { + padding-top: 30px; + gap: 40px; + } + } + + .popup__content__info { + width: 100%; + + > * { + padding: 20px 0; + border-bottom: 1px solid var(--delimiter-color); + + &:first-child { + padding-top: 0; + } + + &:last-child { + padding-bottom: 0; + border: 0; + } + } + + .popup__description__row { + display: flex; + gap: 65px; + + .popup__description__pair { + display: flex; + gap: 20px; + + > :first-child { + color: var(--font-dimmed-color); + font-weight: 700; + } + + .popup__buy__price { + font-weight: 500; + color: #45dade; + } + + .popup__sell__price { + font-weight: 500; + color: #ff8585; + } + } + } + + .popup__description__terms { + display: flex; + flex-direction: column; + gap: 10px; + + h6 { + color: var(--font-dimmed-color); + } + + p { + line-height: 139%; + } + } + } + + .popup__content__form { + > * { + margin-bottom: 20px; + + &:last-child { + margin-bottom: 0; + } + } + + input { + width: 410px; + padding-top: 16px; + padding-bottom: 16px; + } + + .popup__deposit__wrapper { + margin-bottom: 30px; + padding: 2px; + background: radial-gradient(100% 188.88% at 0% 0%, #16d1d6 0%, #274cff 100%); + border-radius: 10px; + + .popup__deposit { + padding: 20px; + border-radius: 8px; + background-color: var(--window-bg-color); + display: flex; + flex-direction: column; + gap: 20px; + + .deposit__pair { + display: flex; + gap: 20px; + + :first-child { + color: var(--font-dimmed-color); + font-weight: 700; + } + } + + > :first-child { + display: flex; + gap: 10px; + + h6 { + font-weight: 700; + color: var(--font-dimmed-color); + } + } + + > :last-child { + display: flex; + justify-content: space-between; + gap: 20px; + } + } + } + + .popup__input__wrapper { + margin-bottom: 30px; + + > div { + position: relative; + + input { + padding-right: 120px; + + &.receive__input { + padding-right: 70px !important; + } + } + + > :last-child { + display: flex; + align-items: center; + gap: 10px; + + position: absolute; + top: 50%; + right: 13px; + transform: translate(0, -50%); + font-weight: 500; + + p { + font-weight: 500; + } + + button { + padding: 0; + width: 50px; + height: 30px; + border-radius: 5px; + background-color: transparent; + + &:hover { + background-color: transparent; + } + + &.selected { + background-color: #1f8feb; + + &:hover { + background-color: #1f8feb; + } + } + } + } + } + } + + p.popup__input_label { + color: var(--font-dimmed-color); + font-weight: 700; + margin-bottom: 8px; + } + + p.popup__form__description { + font-size: 14px; + color: var(--font-dimmed-color); + } + + .popup__button__wrapper { + margin-bottom: 10px; + display: flex; + justify-content: space-between; + flex-wrap: wrap; + + button.popup__button__cancel { + padding-left: 54px; + padding-right: 54px; + } + } + } + + @media screen and (max-width: 1100px) { + width: 100%; + } + + @media screen and (max-width: 1000px) { + .popup__description__row { + gap: 30px !important; + } + } + + @media screen and (max-width: 930px) { + > div:last-child { + flex-direction: column; + } + + .popup__content__form { + input { + width: 100%; + } + } + } + + @media screen and (max-width: 540px) { + padding-right: 20px; + padding-left: 20px; + .popup__button__wrapper { + flex-direction: column; + gap: 20px; + + button { + width: 100%; + padding-top: 13px; + padding-bottom: 13px; + } + } + + .popup__deposit { + > div:last-child { + flex-direction: column; + } + } + + .popup__description__row { + flex-direction: column; + gap: 20px !important; + } + + .popup__content__form { + input { + padding-top: 13px; + padding-bottom: 13px; + } + } + } +} + +button { + &.btn_buy { + background-color: rgba(22, 209, 214, 1); + + &:hover { + background-color: #45dade; + } + } + + &.btn_sell { + background-color: #ff6767; + + &:hover { + background-color: #ff8585; + } + } +} diff --git a/src/components/default/DetailedOfferPopup/DetailedOfferPopup.tsx b/src/components/default/DetailedOfferPopup/DetailedOfferPopup.tsx new file mode 100644 index 0000000..b052cb7 --- /dev/null +++ b/src/components/default/DetailedOfferPopup/DetailedOfferPopup.tsx @@ -0,0 +1,248 @@ +import { ChangeEvent, useContext, useState } from 'react'; +import crossIcon from '@/assets/images/UI/cross_icon.svg'; +import ProfileWidget from '@/components/UI/ProfileWidget/ProfileWidget'; +import Input from '@/components/UI/Input/Input'; +import Button from '@/components/UI/Button/Button'; +import { Store } from '@/store/store-reducer'; +import Alert from '@/components/UI/Alert/Alert'; +import { createChat } from '@/utils/methods'; +import DepositTitle from '@/components/UI/DepositTitle/DepositTitle'; +import { useRouter } from 'next/router'; +import AlertType from '@/interfaces/common/AlertType'; +import DetailedOfferPopupProps from '@/interfaces/props/components/default/DetailedOfferPopup/DetailedOfferPopupProps'; +import styles from './DetailedOfferPopup.module.scss'; + +function DetailedOfferPopup(props: DetailedOfferPopupProps) { + const [popupAlertState, setPopupAlertState] = useState(null); + const [popupAlertSubtitle, setPopupAlertSubtitle] = useState(null); + const [payInputState, setPayInputState] = useState(''); + const [receiveInputState, setReceiveInputState] = useState(''); + const { offerData } = props; + + const router = useRouter(); + + const { state } = useContext(Store); + + async function startChat() { + const successedInput = payInputState && receiveInputState; + + const rangeAcceptable = + parseFloat(offerData.type === 'buy' ? receiveInputState : payInputState) >= + offerData.min && + parseFloat(offerData.type === 'buy' ? receiveInputState : payInputState) <= + offerData.max && + parseFloat(receiveInputState) >= 0; + + if (!successedInput) { + setPopupAlertState('error'); + setPopupAlertSubtitle('Please, fill all fields'); + setTimeout(() => { + setPopupAlertState(null); + }, 3000); + return; + } + + if (!rangeAcceptable) { + setPopupAlertState('error'); + setPopupAlertSubtitle('Please, set correct values'); + setTimeout(() => { + setPopupAlertState(null); + }, 3000); + return; + } + + setPopupAlertState('loading'); + setPopupAlertSubtitle('Creating chat...'); + const result = await createChat(offerData.number, payInputState, receiveInputState); + if (!result.success) { + setPopupAlertState('error'); + setPopupAlertSubtitle('Error creating chat.'); + setTimeout(() => { + setPopupAlertState(null); + }, 3000); + return; + } + + router.push(`/p2p/process/${result.data}`); + } + + function calcInput(e: ChangeEvent) { + const value = + props.offerData.type === 'buy' + ? parseFloat(e.target.value) / offerData.price + : parseFloat(e.target.value) * offerData.price; + + setPayInputState(e.target.value); + setReceiveInputState(value.toFixed(9)); + } + + function caclTarget(e: ChangeEvent) { + const value = + props.offerData.type === 'buy' + ? parseFloat(e.target.value) * offerData.price + : parseFloat(e.target.value) / offerData.price; + + setReceiveInputState(e.target.value); + setPayInputState(value.toFixed(9)); + } + + function setAll() { + const maxInCurrency = offerData.max; + const maxInTarget = parseFloat((offerData.max * offerData.price).toFixed(9)); + + setPayInputState((props.offerData.type === 'buy' ? maxInTarget : maxInCurrency).toString()); + + setReceiveInputState( + (props.offerData.type === 'buy' ? maxInCurrency : maxInTarget).toString(), + ); + } + + const inputLimits = `${offerData.min * offerData.price} - ${offerData.max * offerData.price}`; + const outputPrice = `${offerData.min} - ${offerData.max}`; + + const firstInputPlaceholder = props.offerData.type === 'buy' ? inputLimits : outputPrice; + + const secondInputPlaceholder = props.offerData.type === 'buy' ? outputPrice : inputLimits; + + return ( +
+
+
Detailed Offer
+ props.setPopupState(false)} src={crossIcon} alt="close" /> +
+
+
+ +
+
+

Price

+

{`${offerData.price} ${offerData.target_currency?.name}`}

+
+
+ +
+
+

Min

+

+ {offerData.min} {offerData.input_currency?.name} +

+
+
+

Max

+

+ {offerData.max} {offerData.input_currency?.name} +

+
+
+
+ {offerData.comment &&
Comment
} +

{offerData.comment || ''}

+
+
+
+
+
+ +
+
+

You

+

+ {offerData.deposit_buyer}{' '} + {offerData.deposit_currency?.name || ''} +

+
+
+

Seller

+

+ {offerData.deposit_seller}{' '} + {offerData.deposit_currency?.name || ''} +

+
+
+
+
+
+

I pay

+
+ +
+

+ {props.offerData.type === 'buy' + ? offerData.target_currency?.name + : offerData.input_currency?.name} +

+ +
+
+
+
+

I receive

+
+ +

+ {props.offerData.type === 'buy' + ? offerData.input_currency?.name + : offerData.target_currency?.name} +

+
+
+
+ + + +
+

+ Vivamus suscipit, nisi vel consequat condimentum, diam est volutpat nisi, + quis scelerisque dui odio non tellus. +

+
+
+ + {popupAlertState && ( + setPopupAlertState(null)} + /> + )} +
+ ); +} + +export default DetailedOfferPopup; diff --git a/src/components/default/Footer/Footer.module.scss b/src/components/default/Footer/Footer.module.scss new file mode 100644 index 0000000..78fccc3 --- /dev/null +++ b/src/components/default/Footer/Footer.module.scss @@ -0,0 +1,41 @@ +.footer { + padding: 30px 35px 20px; + display: flex; + flex-direction: column; + align-items: center; + gap: 20px; + margin-top: auto; + + border-top: 1px solid var(--delimiter-color); + + .footer__copyright { + p { + color: var(--font-dimmed-color); + font-size: 16px; + text-align: center; + } + } + + .footer__refs { + width: 100%; + display: flex; + justify-content: center; + column-gap: 20px; + row-gap: 15px; + flex-wrap: wrap; + + > a { + font-size: 16px; + + &.footer__ref_selected { + color: var(--footer-selected-link); + pointer-events: none; + } + + &.footer__ref_disabled { + opacity: 0.5; + pointer-events: none; + } + } + } +} diff --git a/src/components/default/Footer/Footer.tsx b/src/components/default/Footer/Footer.tsx new file mode 100644 index 0000000..55099d8 --- /dev/null +++ b/src/components/default/Footer/Footer.tsx @@ -0,0 +1,73 @@ +import { classes } from '@/utils/utils'; +import Link from 'next/link'; +import styles from './Footer.module.scss'; + +type SelectedLink = 'home' | 'explorer' | 'trade' | 'auction' | 'messenger' | 'wrapped-zano'; + +const links: { + title: string; + type: SelectedLink; + link: string; + disabled?: boolean; +}[] = [ + { + title: 'Zano Website', + type: 'home', + link: 'https://zano.org/', + }, + { + title: 'Explorer', + type: 'explorer', + link: 'https://explorer.zano.org/', + }, + { + title: 'Trade', + type: 'trade', + link: 'https://trade.zano.org/', + }, + { + title: 'Auction', + type: 'auction', + link: 'https://wrapped.zano.org/', + }, + { + title: 'Messenger', + type: 'messenger', + link: 'https://zano.org/', + disabled: true, + }, + { + title: 'Wrapped Zano', + type: 'wrapped-zano', + link: 'https://wrapped.zano.org/', + }, +]; + +const selectedLink: SelectedLink = 'trade'; + +function Footer() { + return ( +
+
+ {links.map((e) => ( + + {e.title} + + ))} +
+
+

Copyright © {new Date().getFullYear()} ZANO.org

+
+
+ ); +} + +export default Footer; diff --git a/src/components/default/Header/Header.module.scss b/src/components/default/Header/Header.module.scss new file mode 100644 index 0000000..34181fa --- /dev/null +++ b/src/components/default/Header/Header.module.scss @@ -0,0 +1,382 @@ +.header { + height: 80px; + padding: 0 100px; + position: relative; + display: flex; + align-items: center; + justify-content: space-between; + border-bottom: 1px solid var(--delimiter-color); + background-color: var(--main-bg-color); + z-index: 1; + position: relative; + + .header__logo { + display: flex; + width: 202px; + height: 40px; + + > a { + display: flex; + } + } + + .header__desktop__navigation { + position: absolute; + transform: translateX(-50%); + left: 50%; + + @media screen and (max-width: 1760px) { + display: none; + } + } + + .header__menu { + display: flex; + flex-direction: column; + + .header__account__btn { + width: 54px; + height: 54px; + padding: 0; + display: flex; + justify-content: center; + align-items: center; + } + + .theme__btn__wrapper { + position: relative; + + .theme__tooltip { + position: absolute; + border-radius: 5px; + transform: translate(-50%, 100%); + bottom: -15px; + left: 50%; + } + + .theme__btn { + width: 54px; + min-width: 54px; + height: 54px; + padding: 0; + } + } + + .header__login { + width: 100%; + display: flex; + gap: 10px; + transition: none; + } + + .burger__tablet__btn { + display: none; + + @media screen and (max-width: 1760px) { + display: flex; + } + + @media screen and (max-width: 900px) { + display: none; + } + } + + .header__account { + display: flex; + align-items: center; + gap: 40px; + transition: none; + + .header__account__wrapper { + display: flex; + align-items: center; + + .header__button__wrapper { + position: relative; + + > .offers__tooltip { + padding: 13px 20px; + position: absolute; + background: #11316b; + border-radius: 5px; + white-space: nowrap; + transform: translate(-50%, 100%); + bottom: -15px; + left: 50%; + } + + .offers__notification__wrapper { + position: absolute; + transform: translate(50%, -50%); + top: 3px; + right: 3px; + } + } + } + + .header__account__panel { + display: flex; + gap: 10px; + } + + .header__account__info { + margin-right: 15px; + display: flex; + flex-direction: column; + align-items: flex-end; + gap: 5px; + + :first-child { + font-weight: 500; + } + + :last-child { + font-size: 14px; + color: var(--font-dimmed-color); + } + } + + .header__currency__wrapper { + position: relative; + + .header__currency__check { + height: 54px; + padding: 0 15px; + display: flex; + align-items: center; + gap: 35px; + justify-content: space-between; + background-color: var(--switch-bg-color); + border-radius: 10px; + + &.currency__check__opened { + background-color: var(--switch-bg-hover); + border-radius: 10px 10px 0 0; + } + + &.currency__check__openable { + &:hover { + background-color: var(--switch-bg-hover); + } + + cursor: pointer; + } + } + + .currency__check__menu, + .header__currency__check { + .currency__check__row { + display: flex; + align-items: center; + position: relative; + + .currency__check__tooltip { + position: absolute; + top: calc(100% + 10px); + left: 50px; + transform: translateX(-50%); + } + } + + svg { + cursor: pointer; + } + + .currency__check__icon { + height: 19px; + width: 19px; + margin-right: 6px; + display: flex; + justify-content: center; + } + + .currency__title { + display: flex; + gap: 5px; + + > span { + max-width: 100px; + overflow: hidden; + text-overflow: ellipsis; + } + } + } + + .currency__check__menu { + width: 100%; + padding: 16px; + position: absolute; + top: 100%; + left: 0; + background-color: #273666; + border-radius: 0 0 10px 10px; + display: flex; + flex-direction: column; + gap: 20px; + border-top: 1px solid rgba(255, 255, 255, 0.1); + } + } + } + + &.header__menu__mobile { + .header__account, + .header__login { + padding: 20px; + + @media screen and (min-width: 900px) { + display: none; + } + } + } + } + + .header__burger { + padding: 0; + width: 48px; + height: 48px; + display: none; + flex-direction: column; + justify-content: center; + align-items: center; + border: 2px solid #1f8feb; + border-radius: 10px; + cursor: pointer; + transition: none; + + > svg { + scale: 0.8; + } + + > div { + width: 24px; + height: 2px; + margin-bottom: 6px; + border-radius: 1px; + background-color: #ffffff; + + &:last-child { + margin: 0; + } + } + + &:hover { + background: rgba(255, 255, 255, 0.1); + } + } + + .header__account__mobile { + width: 100%; + display: flex; + position: absolute; + top: calc(100% + 1px); + left: 0; + background-color: var(--main-bg-color); + max-height: 200px; + overflow: hidden; + + > div { + width: 100%; + } + + button { + width: 100%; + padding-top: 13px; + padding-bottom: 13px; + } + + @media screen and (min-width: 900px) { + max-height: 340px; + } + } + + @media screen and (max-width: 1060px) { + padding-right: 20px; + padding-left: 20px; + } + + @media screen and (max-width: 900px) { + height: 94px; + + .header__menu { + .theme__btn__wrapper { + .theme__tooltip { + display: none; + } + } + } + + .header__login { + button { + height: 48px !important; + + &:first-child { + width: 48px !important; + min-width: 48px !important; + } + + img { + scale: 0.8; + } + } + } + + .header__logo { + img { + height: 40px; + width: auto; + } + } + + .header__burger { + display: flex; + } + + .header__menu { + width: 100%; + display: none; + justify-content: flex-end; + + &.header__menu__mobile { + display: flex; + } + } + + .header__menu { + .header__account { + width: 100%; + flex-direction: column-reverse; + align-items: flex-end; + gap: 20px; + + .header__currency__wrapper { + width: 100%; + } + } + + .header__account__btn { + width: 48px !important; + min-width: 48px !important; + height: 48px !important; + + img { + scale: 0.8333; + } + } + } + + .header__account__mobile { + max-height: 320px; + } + } +} + +.header__blur__block { + width: 100vw; + height: 100vh; + position: fixed; + top: 0; + left: 0; + background-color: #0000004c; + z-index: 1; + transform: all 0; +} diff --git a/src/components/default/Header/Header.tsx b/src/components/default/Header/Header.tsx new file mode 100644 index 0000000..9c865d8 --- /dev/null +++ b/src/components/default/Header/Header.tsx @@ -0,0 +1,373 @@ +import logoImg from '@/assets/images/UI/logo_block.svg'; +import logoImgWhite from '@/assets/images/UI/logo_block_dark.svg'; +import { ReactComponent as LogOutIcon } from '@/assets/images/UI/logout.svg'; +import { ReactComponent as BurgerIcon } from '@/assets/images/UI/hamburger_icon.svg'; +import { ReactComponent as BurgerCrossIcon } from '@/assets/images/UI/burger_cross.svg'; +import React, { useRef, useState, useEffect, useContext } from 'react'; +import { ReactComponent as EyeIcon } from '@/assets/images/UI/eye.svg'; +import { ReactComponent as EyeCloseIcon } from '@/assets/images/UI/eye_close.svg'; +import zanoIcon from '@/assets/images/UI/zano.svg'; +import bitcoinWhiteIcon from '@/assets/images/UI/wbtc.svg'; +import sunIcon from '@/assets/images/UI/sun_icon.svg'; +import moonIcon from '@/assets/images/UI/moon_icon.svg'; +import ethWhiteIcon from '@/assets/images/UI/weth.svg'; +import customWhiteIcon from '@/assets/images/UI/tsds.svg'; +import Link from 'next/link'; +import Tooltip from '@/components/UI/Tooltip/Tooltip'; +import Button from '@/components/UI/Button/Button'; + +import { useWindowWidth } from '@react-hook/window-size'; +import ConnectButton from '@/components/UI/ConnectButton/ConnectButton'; +import { notationToString, setWalletCredentials, shortenAddress } from '@/utils/utils'; +import useAdvancedTheme from '@/hook/useTheme'; + +import { Store } from '@/store/store-reducer'; +import { updateAutoClosedNotification, updateWalletState } from '@/store/actions'; +import CurrencyCheckRowProps from '@/interfaces/props/components/default/Header/CurrencyCheckRowProps'; +import Decimal from 'decimal.js'; +import socket from '@/utils/socket'; +import { OrderDataWithPair } from '@/interfaces/responses/orders/GetOrdersPageRes'; +import { useRouter } from 'next/router'; +import zanoImg from '@/assets/images/UI/zano.svg'; +import useUpdateUser from '@/hook/useUpdateUser'; +import NavBar from './NavBar/NavBar'; +import styles from './Header.module.scss'; + +function Header() { + const { theme, setTheme } = useAdvancedTheme(); + const router = useRouter(); + + const eyeRef = useRef(null); + + const { dispatch, state } = useContext(Store); + const loggedIn = !!state.wallet?.connected; + + const [menuOpened, setMenuState] = useState(false); + const [currencyCheckOpended, setCurrencyState] = useState(false); + const [balanceSeen, setBalanceState] = useState(true); + + const width = useWindowWidth(); + + useEffect(() => { + setMenuState(false); + }, [width]); + + function logout() { + sessionStorage.removeItem('token'); + setWalletCredentials(undefined); + updateWalletState(dispatch, null); + } + + const getIcon = (ticker: string) => { + switch (ticker) { + case 'WBTC': + return bitcoinWhiteIcon; + case 'WETH': + return ethWhiteIcon; + default: + return customWhiteIcon; + } + }; + + function BurgerButton(props: { className?: string }) { + return ( + + ); + } + + function Menu(props: { isMobile?: boolean } = {}) { + function CurrencyCheck() { + function Row({ icon, title, amount, balanceSeen }: CurrencyCheckRowProps) { + const [textHovered, setTextHovered] = useState(false); + + const displayedAmount = balanceSeen ? new Decimal(amount).toFixed() : '****'; + + const showTooltip = displayedAmount.length >= 7; + + return ( +
setTextHovered(true)} + onMouseLeave={() => setTextHovered(false)} + > +
+ {title} +
+

+ {displayedAmount} {title} +

+ {showTooltip && ( + + {displayedAmount} + + )} +
+ ); + } + + const assets = state.wallet?.connected ? state.wallet?.assets || [] : []; + + const openable = assets.length > 1; + + return ( +
+
{ + if (e.target === eyeRef.current || !openable) return; + setCurrencyState(!currencyCheckOpended); + }} + className={`${styles.header__currency__check} ${ + currencyCheckOpended ? styles.currency__check__opened : '' + } ${openable ? styles.currency__check__openable : ''}`} + > + e.ticker === 'ZANO')?.balance) || 0} + > + {/* setBalanceState(!balanceSeen)} + src={balanceSeen ? eyeCloseIcon : eyeIcon} alt="see" + style={!balanceSeen ? {opacity: "0.6"} : {}} + /> */} +
setBalanceState(!balanceSeen)} + style={!balanceSeen ? { opacity: '0.6' } : {}} + ref={eyeRef} + > + {balanceSeen ? ( + + ) : ( + + )} +
+
+ {currencyCheckOpended && ( +
+ {assets + ?.filter((e) => e.ticker !== 'ZANO') + .map((e) => ( + + ))} +
+ )} +
+ ); + } + + function ThemeButton(props: { className?: string }) { + const [tooltipShown, setTooltipState] = useState(false); + + return ( +
+ + + {theme === 'dark' ? 'Light' : 'Dark'} Theme + +
+ ); + } + + return ( +
+ <> + {loggedIn ? ( +
+ {CurrencyCheck()} +
+
+

+ {state.wallet?.connected && state.wallet.alias + ? `@${state.wallet.alias}` + : '@no alias'} +

+

+ {state.wallet?.connected + ? shortenAddress(state.wallet.address || '') + : '...'} +

+
+
+
+ +
+ + + + +
+
+
+ ) : ( +
+ + + {!props.isMobile && } +
+ )} + {props.isMobile && } + +
+ ); + } + + useEffect(() => { + const token = sessionStorage.getItem('token'); + + if (token) { + socket.emit('in-dex-notifications', { token }); + + return () => { + socket.emit('out-dex-notifications', { token }); + }; + } + }, [state.user?.address]); + + const [activeNotifications, setActiveNotifications] = useState( + new Map(), + ); + + const fetchUser = useUpdateUser(); + + useEffect(() => { + function onNotify({ orderData }: { orderData: OrderDataWithPair }) { + if (state.user) { + fetchUser(); + if (!!('Notification' in window) && Notification.permission === 'granted') { + const { pair } = orderData; + + const pairLink = `/dex/trading/${pair.id}#my_orders`; + + const notification = new Notification('Zano Trade - New offer', { + body: `You have new offer: ${orderData.type === 'buy' ? 'Buy' : 'Sell'} | ${ + pair.first_currency.name + }/${pair.second_currency.name} | Price: ${notationToString( + orderData.price, + )}`, + icon: zanoImg, + }); + + notification.onclick = () => { + router.push(pairLink); + }; + + setActiveNotifications((prevNotifications) => { + const newNotifications = new Map(prevNotifications); + console.log('Added notification with orderId:', orderData.id); + + newNotifications.set(parseInt(orderData.id, 10), { + Notification: notification, + orderData, + }); + return newNotifications; + }); + } + } + } + + function onCancel({ orderId }: { orderId: number }) { + fetchUser(); + setActiveNotifications((prevNotifications) => { + const newNotifications = new Map(prevNotifications); + const notification = newNotifications.get(orderId); + + if (notification) { + notification.Notification.close(); + newNotifications.delete(orderId); + console.log('Deleted notification with orderId:', orderId); + } + + return newNotifications; + }); + } + + if (state.closed_notifications.length > 0) { + for (const notificationID of state.closed_notifications) { + onCancel({ orderId: notificationID }); + } + + console.log('Closed notifications:', state.closed_notifications); + + updateAutoClosedNotification(dispatch, []); + } + + socket.on('order-notification', onNotify); + socket.on('order-notification-cancelation', onCancel); + + return () => { + socket.off('order-notification', onNotify); + socket.off('order-notification-cancelation', onCancel); + }; + }, [state.user, activeNotifications, state.closed_notifications]); + + const mobileHeaderStyle: React.CSSProperties = {}; + + if (!menuOpened) { + mobileHeaderStyle.maxHeight = '0'; + } else if (currencyCheckOpended) { + mobileHeaderStyle.overflow = 'inherit'; + } + + return ( + <> + {menuOpened &&
} +
+
+ + Zano P2P + +
+ +
+ +
+ {Menu()} + + +
+
+ +
+
+
+ + ); +} + +export default Header; diff --git a/src/components/default/Header/NavBar/NavBar.module.scss b/src/components/default/Header/NavBar/NavBar.module.scss new file mode 100644 index 0000000..87ef6fa --- /dev/null +++ b/src/components/default/Header/NavBar/NavBar.module.scss @@ -0,0 +1,76 @@ +.nav { + a { + display: flex; + align-items: center; + gap: 10px; + position: relative; + + &:hover { + opacity: 0.8; + } + + &.selected { + h6 { + color: var(--font-main-color); + } + + svg * { + fill: var(--font-main-color); + } + } + + &.disabled { + opacity: 0.5; + pointer-events: none; + + &:hover { + opacity: 0.5; + } + } + + h6 { + color: #1f8feb; + } + + svg path { + fill: #1f8feb; + } + + img { + height: 20px; + width: auto; + + @media screen and (max-width: 1600px) { + width: 32px; + height: auto; + } + + @media screen and (max-width: 900px) { + width: 20px; + height: auto; + } + } + } +} + +.nav__desktop { + display: flex; + gap: 40px; +} + +.nav__mobile { + padding: 20px; + display: flex; + flex-direction: column; + align-items: center; + gap: 20px; + + @media screen and (min-width: 900px) { + padding: 60px; + gap: 50px; + + h6 { + font-size: 32px; + } + } +} diff --git a/src/components/default/Header/NavBar/NavBar.tsx b/src/components/default/Header/NavBar/NavBar.tsx new file mode 100644 index 0000000..423dd16 --- /dev/null +++ b/src/components/default/Header/NavBar/NavBar.tsx @@ -0,0 +1,80 @@ +import { useRouter } from 'next/router'; +import Link from 'next/link'; + +import { ReactComponent as TradeIcon } from '@/assets/images/UI/trade_icon.svg'; +import { ReactComponent as SwapIcon } from '@/assets/images/UI/swap_icon.svg'; +import { ReactComponent as PersonsIcon } from '@/assets/images/UI/persons_icon.svg'; +import NavItemProps from '@/interfaces/props/components/default/Header/NavBar/NavItemProps'; +import NavBarProps from '@/interfaces/props/components/default/Header/NavBar/NavBarProps'; +import NotificationIndicator from '@/components/UI/NotificationIndicator/NotificationIndicator'; +import { useContext } from 'react'; +import { Store } from '@/store/store-reducer'; +import styles from './NavBar.module.scss'; + +function NavBar(props: NavBarProps) { + const router = useRouter(); + + const { state } = useContext(Store); + + const { wallet, user } = state; + + function NavItem(props: NavItemProps) { + const { routeKeyphrase } = props; + const { title } = props; + const { href } = props; + const { Img } = props; + const { disabled } = props; + const { notifications } = props; + // const ImgSelected = props.imgSelected; + + const selected = router.route.includes(routeKeyphrase); + let linkClass = ''; + + if (selected) { + linkClass = styles.selected; + } else if (disabled) { + linkClass = styles.disabled; + } + + return ( + + +
{title}
+ + + ); + } + + return ( + + ); +} + +export default NavBar; diff --git a/src/components/default/MainPageTitle/MainPageTitle.module.scss b/src/components/default/MainPageTitle/MainPageTitle.module.scss new file mode 100644 index 0000000..f6514db --- /dev/null +++ b/src/components/default/MainPageTitle/MainPageTitle.module.scss @@ -0,0 +1,80 @@ +.title__wrapper { + width: 100%; + margin-bottom: 40px; + display: flex; + flex-direction: column; + align-items: center; + border-radius: 30px; + text-align: center; + gap: 20px; + + > button { + padding-top: 0; + padding-bottom: 0; + height: 54px; + } + + > :first-child { + display: flex; + flex-direction: column; + gap: 10px; + + .desktop__description { + max-width: 850px; + font-size: 18px; + font-weight: 500; + color: var(--font-dimmed-color); + + @media (max-width: 768px) { + display: none; + } + } + } + + .mobile__description { + display: none; + font-size: 18px; + font-weight: 400; + color: var(--font-dimmed-color); + + @media (max-width: 768px) { + display: block; + } + + @media (max-width: 375px) { + display: block; + max-width: 280px; + margin: 0 auto; + } + } + + .learn_more__button { + display: flex; + flex-direction: row; + align-items: center; + gap: 5px; + user-select: none; + cursor: pointer; + + p { + font-size: 18px; + color: rgba(31, 143, 235, 1); + } + + svg:not(.stroked) * { + fill: transparent; + } + } + + .connect__button { + height: 54px; + } + + @media screen and (max-width: 550px) { + margin-bottom: 40px; + + .connect__button { + height: 48px; + } + } +} diff --git a/src/components/default/MainPageTitle/MainPageTitle.tsx b/src/components/default/MainPageTitle/MainPageTitle.tsx new file mode 100644 index 0000000..6886714 --- /dev/null +++ b/src/components/default/MainPageTitle/MainPageTitle.tsx @@ -0,0 +1,38 @@ +import { ReactComponent as ArrowRight } from '@/assets/images/UI/arrow_blue_right.svg'; +import { Store } from '@/store/store-reducer'; +import { useContext } from 'react'; +import MainPageTitleProps from '@/interfaces/props/components/default/MainPageTitle/MainPageTitleProps'; +import styles from './MainPageTitle.module.scss'; + +function MainPageTitle(props: MainPageTitleProps) { + const { state } = useContext(Store); + + return ( +
+
+

+ {props.blue} + {props.white} +

+ {props.description && ( +

{props.description}

+ )} + +

+ {props.mobileDescription ?? props.description} +

+
+ + {state.wallet?.connected && !!state.wallet?.address ? ( + props.children + ) : ( +
+

Learn more

+ +
+ )} +
+ ); +} + +export default MainPageTitle; diff --git a/src/components/default/Offers/Offers.js b/src/components/default/Offers/Offers.js new file mode 100644 index 0000000..2da1be7 --- /dev/null +++ b/src/components/default/Offers/Offers.js @@ -0,0 +1,612 @@ +import arrowIcon from '@/assets/images/UI/arrow.svg'; +import lockIcon from '@/assets/images/UI/lock.svg'; +import crossIcon from '@/assets/images/UI/cross_icon.svg'; +import deleteIcon from '@/assets/images/UI/delete.svg'; +import editIcon from '@/assets/images/UI/edit.svg'; +import noOffersIcon from '@/assets/images/UI/no_offers.svg'; +import noChatsIcon from '@/assets/images/UI/no_chats.svg'; +import Link from 'next/link'; +import Button from '@/components/UI/Button/Button'; +import Input from '@/components/UI/Input/Input'; +import Popup from '@/components/UI/Popup/Popup'; +import ProfileWidget from '@/components/UI/ProfileWidget/ProfileWidget'; +import { useContext, useState } from 'react'; +import { nanoid } from 'nanoid'; +import { toStandardDateString } from '@/utils/utils'; +import { createChat, deleteChat, deleteOffer } from '@/utils/methods'; +import useUpdateUser from '@/hook/useUpdateUser'; +import Alert from '@/components/UI/Alert/Alert'; +import Preloader from '@/components/UI/Preloader/Preloader'; +import { Store } from '@/store/store-reducer'; +import { useRouter } from 'next/router'; +import NotificationIndicator from '@/components/UI/NotificationIndicator/NotificationIndicator'; +import { updateUser } from '@/store/actions'; +import CreateOfferPopup from '../CreateOfferPopup/CreateOfferPopup'; +import rowStyles from './Row.module.scss'; +import styles from './Offers.module.scss'; + +function Offers(props) { + // const [priceDescending, setPriceState] = useState(false); + + const priceDescending = props.value; + const setPriceState = props.setValue; + + const router = useRouter(); + + const { state, dispatch } = useContext(Store); + + const fetchUser = useUpdateUser(); + + const [alertState, setAlertState] = useState(null); + + const [alertSubtitle, setAlertSubtitle] = useState(null); + + const { offers } = props; + + function PopupContent(props) { + const [popupAlertState, setPopupAlertState] = useState(null); + const [popupAlertSubtitle, setPopupAlertSubtitle] = useState(null); + const [payInputState, setPayInputState] = useState(''); + const [receiveInputState, setReceiveInputState] = useState(''); + const { offerData } = props; + + async function startChat() { + const successedInput = payInputState && receiveInputState; + + const rangeAcceptable = + parseFloat(offerData.type === 'buy' ? receiveInputState : payInputState) >= + parseFloat(offerData.min) && + parseFloat(offerData.type === 'buy' ? receiveInputState : payInputState) <= + parseFloat(offerData.max) && + parseFloat(receiveInputState) >= 0 && + parseFloat(receiveInputState) <= 1000000000; + + if (!successedInput) { + setPopupAlertState('error'); + setPopupAlertSubtitle('Please, fill all fields'); + setTimeout(() => { + setPopupAlertState(null); + }, 3000); + return; + } + + if (!rangeAcceptable) { + setPopupAlertState('error'); + setPopupAlertSubtitle('Please, set correct values'); + setTimeout(() => { + setPopupAlertState(null); + }, 3000); + return; + } + + setPopupAlertState('loading'); + setPopupAlertSubtitle('Creating chat...'); + const result = await createChat(offerData.number, payInputState, receiveInputState); + if (!result.success) { + setPopupAlertState('error'); + setPopupAlertSubtitle('Error creating chat.'); + setTimeout(() => { + setPopupAlertState(null); + }, 3000); + return; + } + + router.push(`/p2p/process/${result.data}`); + } + + function calcInput(e) { + const value = + props.offerData.type === 'buy' + ? e.target.value / offerData.price + : e.target.value * offerData.price; + + setPayInputState(e.target.value); + setReceiveInputState(parseFloat(value.toFixed(9))); + } + + function caclTarget(e) { + const value = + props.offerData.type === 'buy' + ? e.target.value * offerData.price + : e.target.value / offerData.price; + + setReceiveInputState(e.target.value); + setPayInputState(parseFloat(value.toFixed(9))); + } + + function setAll() { + const maxInCurrency = parseFloat(offerData.max); + const maxInTarget = parseFloat((offerData.max * offerData.price).toFixed(9)); + + setPayInputState(props.offerData.type === 'buy' ? maxInTarget : maxInCurrency); + + setReceiveInputState(props.offerData.type === 'buy' ? maxInCurrency : maxInTarget); + } + + const inputLimits = `${offerData.min * offerData.price} - ${offerData.max * offerData.price}`; + const outputPrice = `${offerData.min} - ${offerData.max}`; + + const firstInputPlaceholder = props.offerData.type === 'buy' ? inputLimits : outputPrice; + + const secondInputPlaceholder = props.offerData.type === 'buy' ? outputPrice : inputLimits; + + return ( +
+
+
Detailed Offer
+ props.setPopupState(false)} src={crossIcon} alt="close" /> +
+
+
+ +
+
+

Price

+

{`${offerData.price} ${offerData.target_currency?.name}`}

+
+
+ +
+
+

Min

+

+ {offerData.min} {offerData.input_currency?.name} +

+
+
+

Max

+

+ {offerData.max} {offerData.input_currency?.name} +

+
+
+
+ {offerData.comment &&
Comment
} +

{offerData.comment || ''}

+
+
+
+
+
+
+ lock +
Deposit
+
+
+
+

You

+

+ {offerData.deposit_buyer}{' '} + {offerData.deposit_currency?.name || ''} +

+
+
+

Seller

+

+ {offerData.deposit_seller}{' '} + {offerData.deposit_currency?.name || ''} +

+
+
+
+
+
+

I pay

+
+ e.target.blur()} + type="number" + value={payInputState} + onInput={calcInput} + bordered={true} + placeholder={firstInputPlaceholder} + /> +
+

+ {props.offerData.type === 'buy' + ? offerData.target_currency?.name + : offerData.input_currency?.name} +

+ +
+
+
+
+

I receive

+
+ e.target.blur()} + type="number" + onInput={caclTarget} + value={receiveInputState} + className={rowStyles.receive__input} + bordered={true} + placeholder={secondInputPlaceholder} + /> +

+ {props.offerData.type === 'buy' + ? offerData.input_currency?.name + : offerData.target_currency?.name} +

+
+
+
+ + + +
+

+ Vivamus suscipit, nisi vel consequat condimentum, diam est volutpat + nisi, quis scelerisque dui odio non tellus. +

+
+
+ + {popupAlertState && ( + setPopupAlertState(null)} + /> + )} +
+ ); + } + + function Row(props) { + const [popupShown, setPopupState] = useState(false); + + async function removeOffer() { + if (props.extended && !props.withEditor && props.offerData.offer_number) { + setAlertState('loading'); + setAlertSubtitle('Deleting chat...'); + const result = await deleteChat(props.offerData.id); + if (!result.success) { + setAlertState('error'); + setAlertSubtitle('Error deleting chat. Please try again later.'); + setTimeout(() => { + setAlertState(null); + }, 3000); + return; + } + setAlertState(null); + await fetchUser(); + return; + } + + setAlertState('loading'); + setAlertSubtitle('Deleting offer...'); + const result = await deleteOffer(props.offerData.number); + if (!result.success) { + setAlertState('error'); + setAlertSubtitle('Error deleting offer. Please try again later.'); + setTimeout(() => { + setAlertState(null); + }, 3000); + return; + } + setAlertState(null); + await fetchUser(); + } + + const withNotification = !(props.offerData?.view_list || []).includes(state.user?.id || ''); + + function viewRedirect() { + if (props.extended && !props.withEditor) { + if (state.user?.id) { + const newUser = JSON.parse(JSON.stringify({ ...state.user })); + const currentViewList = newUser.chats.find( + (e) => e.id === (props.offerData?.id || 0), + )?.view_list; + if (!currentViewList?.includes(state.user?.id)) + currentViewList.push(state.user?.id); + + updateUser(dispatch, newUser); + } + + router.push(`/p2p/process/${props.offerData?.id || ''}`); + } + } + + return ( + + {props.extended && ( + <> + +
+

{props.offerData.type === 'buy' ? 'Buy' : 'Sell'}

+
+ + +

+ {`${toStandardDateString(new Date(parseInt(props.offerData.timestamp, 10)))} `} +
+ {new Date( + parseInt(props.offerData.timestamp, 10), + ).toLocaleTimeString()} +

+ + + +
+

{props.offerData.type === 'buy' ? 'Buy' : 'Sell'}

+
+ +

+ {props.offerData.date} {props.offerData.time} +

+ + + )} + + {props.inUser ? ( +
+ {props.offerData.currency} +

{props.offerData.currency}

+
+ ) : ( + + )} + + +

Price

+

+ {props.offerData.price} {props.offerData.target_currency?.name} +

+ + +

Limit / Available

+
+
+

+ Min: +

+

+ {props.offerData.min} {props.offerData.input_currency?.name} +

+
+ +
+

+ Max: +

+

+ {props.offerData.max} {props.offerData.input_currency?.name} +

+
+
+ + +
+ lock + e.preventDefault()}> + Deposit + +
+
+
+

Seller:

+

+ {props.offerData.deposit_seller}{' '} + {props.offerData.deposit_currency?.name || ''} +

+
+ +
+

Buyer:

+

+ {props.offerData.deposit_buyer}{' '} + {props.offerData.deposit_currency?.name || ''} +

+
+
+ + + {!props.extended ? ( +
+ +
+ ) : ( +
+ {props.withEditor ? ( + + ) : ( +
+ + +
+ +
+
+ )} + {props.categoryState !== 'finished' && + props.categoryState !== 'active' && ( + + )} +
+ )} + + {popupShown && ( + setPopupState(false)} + scroll={true} + /> + )} + + + ); + } + + return ( +
+ + + + {props.extended && ( + <> + + + + )} + + + + + + + + + {offers.map((e) => ( + + ))} + +
+ e.preventDefault()}> + Type + + + e.preventDefault()}> + Date + + + e.preventDefault()}> + Makers + + +
setPriceState(!priceDescending)} + > + e.preventDefault()}> + Price + {!props.extended && + (priceDescending ? ' (Descending)' : ' (Ascending)')} + + {!props.extended && ( + arrow + )} +
+
+ e.preventDefault()}> + Limits + + +
+ lock + e.preventDefault()}> + Deposit + +
+
+ + {!offers.length && !props.preloaderState && ( +
+
+ {props.extended +

No {props.extended && !props.withEditor ? 'chats' : 'offers'}

+
+
+ )} + + {props.preloaderState && ( +
+
+ +

Loading...

+
+
+ )} + + setAlertState(null)} + /> +
+ ); +} + +export default Offers; diff --git a/src/components/default/Offers/Offers.module.scss b/src/components/default/Offers/Offers.module.scss new file mode 100644 index 0000000..cd4bda2 --- /dev/null +++ b/src/components/default/Offers/Offers.module.scss @@ -0,0 +1,137 @@ +.offers__table__extended { + table { + @media screen and (max-width: 1700px) { + .header__row__extended { + th:first-child { + max-width: 140px; + } + + th:nth-child(2) { + max-width: 160px; + } + + th:nth-child(3) { + max-width: 220px; + } + + th:nth-child(4) { + max-width: 160px; + } + + th:last-child { + max-width: 200px; + } + } + } + + thead > tr { + @media screen and (max-width: 1500px) { + display: none !important; + } + } + } +} + +.offers__table__wrapper { + width: 100%; + + table { + width: 100%; + + th { + text-align: left; + + > div { + position: relative; + display: flex; + align-items: center; + + img { + margin-right: 10px; + } + + &.table__header__price { + cursor: pointer; + + a { + cursor: pointer; + } + + img { + margin: 0; + position: absolute; + left: 175px; + } + } + } + + a { + cursor: auto; + font-weight: 700; + color: rgba(255, 255, 255, 0.7); + } + } + + thead > tr { + width: 100%; + padding: 40px 0; + display: flex; + border: 1px solid rgba(255, 255, 255, 0.1); + border-right: 0; + border-left: 0; + + @media screen and (max-width: 1450px) { + display: none; + } + } + + th { + width: 100%; + display: flex; + align-items: center; + } + + // tbody { + // @media screen and (max-width: 1450px) { + // display: grid; + // grid-template-columns: repeat(auto-fill, 340px); + // grid-gap: 40px; + // justify-content: space-between; + // } + + // @media screen and (max-width: 1345px) { + // grid-template-columns: repeat(auto-fill, 450px); + // } + + // @media screen and (max-width: 1170px) { + // grid-template-columns: repeat(1, 450px); + // justify-content: center; + // } + + // @media screen and (max-width: 650px) { + // display: flex; + // flex-direction: column; + // grid-gap: 0; + // } + // } + } +} + +.offers__no_offers { + width: 100%; + height: 500px; + display: flex; + justify-content: center; + align-items: center; + + > div { + display: flex; + flex-direction: column; + align-items: center; + gap: 20px; + } + + p { + color: rgba(255, 255, 255, 0.7); + } +} diff --git a/src/components/default/Offers/Row.module.scss b/src/components/default/Offers/Row.module.scss new file mode 100644 index 0000000..898c608 --- /dev/null +++ b/src/components/default/Offers/Row.module.scss @@ -0,0 +1,634 @@ +.table__row__extended { + @media screen and (max-width: 1700px) { + td:first-child { + max-width: 140px; + } + + td:nth-child(2) { + max-width: 160px; + } + + td:nth-child(4) { + max-width: 220px; + } + + td:nth-child(5) { + max-width: 160px; + } + + td:last-child { + max-width: 200px; + } + + .user_info__price { + span { + font-size: 18px; + } + } + + .column__text { + .column__text__title { + width: 65px; + + &.column__limits { + width: 50px; + } + } + } + } + + @media screen and (max-width: 1500px) { + &.table__row__extended { + > td { + max-width: none; + } + } + + .user_info__price { + span { + font-size: 24px; + } + } + + .column__text { + .column__text__title { + width: 80px; + + &.column__limits { + width: 65px; + } + } + } + } + + @media screen and (max-width: 1500px) { + // padding: 30px 40px !important; + // flex-direction: column; + // gap: 20px; + // border: 1px solid rgba(255, 255, 255, 0.1); + // border-radius: 10px; + + width: 100%; + position: relative; + flex-wrap: wrap; + justify-content: space-between; + gap: 20px; + + td { + width: auto !important; + flex-direction: column; + align-items: flex-start !important; + + &.top_element { + width: 100% !important; + } + + .row__label__mobile { + display: flex !important; + } + + &.extended__mobile { + display: flex !important; + } + + &.extended__hidden { + display: none !important; + } + + &.row__button__wrapper { + position: absolute; + top: 60px !important; + right: 0; + } + } + } +} + +.table__row { + padding: 40px 0; + display: flex; + border-bottom: 1px solid rgba(255, 255, 255, 0.1); + + td { + width: 100%; + display: flex; + align-items: center; + + .table__date { + text-align: center; + } + + .table__offer_type { + width: 82px; + height: 40px; + border-radius: 10px; + display: flex; + align-items: center; + justify-content: center; + + p { + font-weight: 700; + } + } + + .table__offer_type__buy { + border: 2px solid #16d1d6; + + p { + color: #16d1d6; + } + } + + .table__offer_type__sell { + border: 2px solid #ff6767; + + p { + color: #ff6767; + } + } + + &.extended__mobile { + display: none; + flex-direction: row; + align-items: center !important; + gap: 20px; + + > p { + font-size: 16px; + + br { + display: none; + } + } + } + + @media screen and (max-width: 1450px) { + &.extended__mobile { + display: flex; + } + + &.extended__hidden { + display: none; + } + } + + .row__label__mobile { + margin-bottom: 10px; + display: none; + font-weight: 700; + color: rgba(255, 255, 255, 0.7); + + &.row__deposit__label { + align-items: center; + + img { + margin-right: 10px; + } + + a { + cursor: auto; + font-weight: 700; + color: rgba(255, 255, 255, 0.7); + } + } + } + } + + @media screen and (max-width: 1450px) { + // padding: 30px 40px; + // flex-direction: column; + // gap: 20px; + // border: 1px solid rgba(255, 255, 255, 0.1); + // border-radius: 10px; + position: relative; + justify-content: space-between; + flex-wrap: wrap; + gap: 23px; + + td { + flex-direction: column; + align-items: flex-start; + + width: auto; + + .row__label__mobile { + display: flex; + } + + &.top_element { + width: 100%; + } + + &.row__button__wrapper { + position: absolute; + top: 37.5px; + right: 0; + } + } + } + + @media screen and (max-width: 650px) { + padding: 40px 0 !important; + border: 0; + border-radius: 0; + border-top: 1px solid rgba(255, 255, 255, 0.1); + + &:last-child { + border-bottom: 1px solid rgba(255, 255, 255, 0.1); + } + + td { + &.row__button__wrapper { + position: static; + } + + width: 100% !important; + + &.row__button__wrapper { + > div { + width: 100%; + + button { + width: 100%; + height: 48px; + + &.row__button__iconed { + width: 48px; + min-width: 48px; + } + } + } + } + } + } +} + +.row__button__wrapper { + display: flex; + justify-content: flex-end; + + > div { + display: flex; + gap: 20px; + + .row__button__view { + position: relative; + + .row__button__notification { + position: absolute; + transform: translate(50%, -50%); + top: 0; + right: 0; + } + } + + button { + padding: 0 40px; + height: 54px; + + &.row__button__iconed { + padding: 0; + height: 54px; + width: 54px; + background-color: rgba(255, 255, 255, 0.1); + + &:hover { + background-color: rgba(255, 255, 255, 0.3); + } + } + } + } +} + +button { + &.btn_buy { + background-color: rgba(22, 209, 214, 1); + + &:hover { + background-color: #45dade; + } + } + + &.btn_sell { + background-color: #ff6767; + + &:hover { + background-color: #ff8585; + } + } +} + +.user_info__price { + span { + font-size: 24px; + font-weight: 600; + } +} + +.column__text { + height: 56px; + display: flex; + flex-direction: column; + justify-content: space-between; + + > div { + display: flex; + + p { + white-space: nowrap; + } + + .column__text__title { + width: 80px; + color: rgba(255, 255, 255, 0.7); + + &.column__limits { + width: 65px; + } + } + } +} + +.row__currency { + display: flex; + align-items: center; + + img { + height: 24px; + width: auto; + margin-right: 8px; + } +} + +.popup__content { + width: 1020px; + padding: 40px; + background-color: #ffffff; + position: relative; + transform: translate(-50%, -50%); + top: 50%; + left: 50%; + background: #0f2055; + border-radius: 10px; + + @media screen and (max-height: 700px), (max-width: 930px) { + top: 15%; + transform: translate(-50%); + } + + > div { + display: flex; + + &:first-child { + justify-content: space-between; + padding-bottom: 30px; + border-bottom: 1px solid rgba(255, 255, 255, 0.1); + + img { + cursor: pointer; + } + } + + &:last-child { + padding-top: 30px; + gap: 40px; + } + } + + .popup__content__info { + width: 100%; + + > * { + padding: 20px 0; + border-bottom: 1px solid rgba(255, 255, 255, 0.1); + + &:first-child { + padding-top: 0; + } + + &:last-child { + padding-bottom: 0; + border: 0; + } + } + + .popup__description__row { + display: flex; + gap: 65px; + + .popup__description__pair { + display: flex; + gap: 20px; + + > :first-child { + color: rgba(255, 255, 255, 0.7); + font-weight: 700; + } + + .popup__buy__price { + color: #45dade; + } + + .popup__sell__price { + color: #ff8585; + } + } + } + + .popup__description__terms { + display: flex; + flex-direction: column; + gap: 10px; + + h6 { + color: rgba(255, 255, 255, 0.7); + } + + p { + line-height: 139%; + } + } + } + + .popup__content__form { + > * { + margin-bottom: 20px; + + &:last-child { + margin-bottom: 0; + } + } + + input { + width: 410px; + padding-top: 16px; + padding-bottom: 16px; + } + + .popup__deposit__wrapper { + margin-bottom: 30px; + padding: 2px; + background: radial-gradient(100% 188.88% at 0% 0%, #16d1d6 0%, #274cff 100%); + border-radius: 10px; + + .popup__deposit { + padding: 20px; + border-radius: 8px; + background-color: #0f2055; + display: flex; + flex-direction: column; + gap: 20px; + + .deposit__pair { + display: flex; + gap: 20px; + + :first-child { + color: rgba(255, 255, 255, 0.7); + } + } + + > :first-child { + display: flex; + gap: 10px; + + h6 { + font-weight: 700; + color: rgba(255, 255, 255, 0.7); + } + } + + > :last-child { + display: flex; + justify-content: space-between; + gap: 20px; + } + } + } + + .popup__input__wrapper { + margin-bottom: 30px; + + > div { + position: relative; + + input { + padding-right: 120px; + + &.receive__input { + padding-right: 70px !important; + } + } + + > :last-child { + display: flex; + align-items: center; + gap: 10px; + + position: absolute; + top: 50%; + right: 13px; + transform: translate(0, -50%); + + button { + padding: 0; + width: 50px; + height: 30px; + border-radius: 5px; + background-color: transparent; + + &:hover { + background-color: transparent; + } + + &.selected { + background-color: #1f8feb; + + &:hover { + background-color: #1f8feb; + } + } + } + } + } + } + + p.popup__input_label { + color: rgba(255, 255, 255, 0.7); + font-weight: 700; + margin-bottom: 8px; + } + + p.popup__form__description { + font-size: 14px; + color: rgba(255, 255, 255, 0.7); + } + + .popup__button__wrapper { + margin-bottom: 10px; + display: flex; + justify-content: space-between; + flex-wrap: wrap; + gap: 20px; + + button.popup__button__cancel { + padding-left: 54px; + padding-right: 54px; + } + } + } + + @media screen and (max-width: 1100px) { + width: 100%; + } + + @media screen and (max-width: 1000px) { + .popup__description__row { + gap: 30px !important; + } + } + + @media screen and (max-width: 930px) { + > div:last-child { + flex-direction: column; + } + + .popup__content__form { + input { + width: 100%; + } + } + } + + @media screen and (max-width: 540px) { + padding-right: 20px; + padding-left: 20px; + .popup__button__wrapper { + flex-direction: column; + + button { + width: 100%; + padding-top: 13px; + padding-bottom: 13px; + } + } + + .popup__deposit { + > div:last-child { + flex-direction: column; + } + } + + .popup__description__row { + flex-direction: column; + gap: 20px !important; + } + + .popup__content__form { + input { + padding-top: 13px; + padding-bottom: 13px; + } + } + } +} diff --git a/src/components/default/OrderNotification/OrderNotification.module.scss b/src/components/default/OrderNotification/OrderNotification.module.scss new file mode 100644 index 0000000..511d3d8 --- /dev/null +++ b/src/components/default/OrderNotification/OrderNotification.module.scss @@ -0,0 +1,124 @@ +.dex__order-notification { + padding: 20px; + width: 350px; + background-color: var(--dex-offer-notification); + border-radius: 15px; + border: 1px solid #ffffff33; + + &_title { + margin-bottom: 8px; + display: flex; + align-items: center; + justify-content: space-between; + + > button { + padding: 0; + height: 25px; + width: 25px; + display: flex; + justify-content: center; + align-items: center; + border-radius: 2px; + } + } + + &_pair { + display: flex; + align-items: center; + gap: 10px; + + > p { + font-size: 14px; + font-weight: 500; + + > span { + font-size: 14px; + font-weight: 500; + color: var(--font-dimmed-color); + } + } + + > div { + padding: 2px 8px; + border: 2px solid #16d1d6; + border-radius: 5px; + + > p { + color: #16d1d6; + font-size: 12px; + font-weight: 700; + } + + &.order-sell { + border-color: #ff6767; + + > p { + color: #ff6767; + } + } + } + } + + &_delimiter { + margin: 10px 0; + width: 100%; + height: 1px; + background-color: #ffffff1a; + } + + &_info { + padding: 5px 0; + width: 100%; + display: flex; + flex-direction: column; + gap: 15px; + + .dex__order-notification_info-item { + display: flex; + justify-content: space-between; + align-items: center; + + > p { + font-size: 16px; + } + + > :first-child { + font-weight: 700; + color: var(--font-dimmed-color); + } + + > :last-child { + min-width: 0; + text-align: left; + overflow: hidden; + text-overflow: ellipsis; + } + } + + .dex__order-notification_price-buy { + > :last-child { + color: #16d1d6; + } + } + + .dex__order-notification_price-sell { + > :last-child { + color: #ff6767; + } + } + } + + &_details { + padding-top: 5px; + display: flex; + justify-content: center; + + > a { + font-size: 16px; + } + } + + @media screen and (max-width: 400px) { + width: calc(100vw - 40px); + } +} diff --git a/src/components/default/OrderNotification/OrderNotification.tsx b/src/components/default/OrderNotification/OrderNotification.tsx new file mode 100644 index 0000000..d982049 --- /dev/null +++ b/src/components/default/OrderNotification/OrderNotification.tsx @@ -0,0 +1,79 @@ +import { OrderDataWithPair } from '@/interfaces/responses/orders/GetOrdersPageRes'; +import Button from '@/components/UI/Button/Button'; +import { ReactComponent as CrossIcon } from '@/assets/images/UI/dex_cross_icon.svg'; +import Image from 'next/image'; +import { notationToString, tradingKnownCurrencies } from '@/utils/utils'; +import Link from 'next/link'; +import { Dispatch, SetStateAction } from 'react'; +import styles from './OrderNotification.module.scss'; + +interface OrderNotificationProps { + order: OrderDataWithPair; + setNotificationOrders: Dispatch>; + index: number; +} + +export default function OrderNotification({ + order, + setNotificationOrders, + index, +}: OrderNotificationProps) { + const { pair } = order; + const { first_currency, second_currency } = order.pair; + const firstCurrencyTicker = first_currency.name; + const secondCurrencyTicker = second_currency.name; + const isBuy = order.type === 'buy'; + + function onCloseClick() { + setNotificationOrders((prev) => prev.filter((e, i) => i !== index)); + } + + const imgCode = tradingKnownCurrencies.includes(pair.first_currency?.code) + ? pair.first_currency?.code + : 'tsds'; + + const pairLink = `/dex/trading/${order.pair.id}#my_orders`; + + return ( +
+
+
New Offer!
+ +
+
+ currency +

+ {firstCurrencyTicker} + /{secondCurrencyTicker} +

+
+

{isBuy ? 'Buy' : 'Sell'}

+
+
+
+
+
+

Price

+

{notationToString(order.price)}

+
+
+
+
+ Details +
+
+ ); +} diff --git a/src/components/default/PageTitle/PageTitle.module.scss b/src/components/default/PageTitle/PageTitle.module.scss new file mode 100644 index 0000000..e560ed5 --- /dev/null +++ b/src/components/default/PageTitle/PageTitle.module.scss @@ -0,0 +1,24 @@ +.page_title { + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; + gap: 30px; + + > div { + display: flex; + flex-direction: column; + gap: 10px; + } + + @media screen and (max-width: 600px) { + flex-direction: column-reverse; + align-items: normal; + gap: 40px; + + button { + padding-top: 13px; + padding-bottom: 13px; + } + } +} diff --git a/src/components/default/PageTitle/PageTitle.tsx b/src/components/default/PageTitle/PageTitle.tsx new file mode 100644 index 0000000..15d2064 --- /dev/null +++ b/src/components/default/PageTitle/PageTitle.tsx @@ -0,0 +1,14 @@ +import { ReactNode } from 'react'; +import styles from './PageTitle.module.scss'; +import BackButton from '../BackButton/BackButton'; + +function PageTitle(props: { children: ReactNode }) { + return ( +
+
{props.children}
+ +
+ ); +} + +export default PageTitle; diff --git a/src/hook/useTheme.ts b/src/hook/useTheme.ts new file mode 100644 index 0000000..de8afd5 --- /dev/null +++ b/src/hook/useTheme.ts @@ -0,0 +1,25 @@ +import { useTheme } from 'next-themes'; +import { useState, useEffect } from 'react'; + +function useAdvancedTheme() { + const { theme, setTheme } = useTheme(); + const [mounted, setMounted] = useState(false); + + useEffect(() => { + setMounted(true); + }, []); + + if (mounted) { + return { + setTheme, + theme, + }; + } + + return { + setTheme, + theme: 'dark', + }; +} + +export default useAdvancedTheme; diff --git a/src/hook/useUpdateUser.ts b/src/hook/useUpdateUser.ts new file mode 100644 index 0000000..7b7a59f --- /dev/null +++ b/src/hook/useUpdateUser.ts @@ -0,0 +1,24 @@ +import { useContext } from 'react'; +import { getUser } from '@/utils/methods'; +import { Store } from '@/store/store-reducer'; +import { updateUser as updateUserAction } from '@/store/actions'; +import sha256 from 'sha256'; + +function useUpdateUser() { + const { state, dispatch } = useContext(Store); + async function fetchUser() { + if (!sessionStorage.getItem('token')) return false; + return getUser().then((result) => { + if (!result.success) return false; + + if (sha256(JSON.stringify(state.user)) !== sha256(JSON.stringify(result.data))) { + updateUserAction(dispatch, result.data); + } + + return true; + }); + } + return fetchUser; +} + +export default useUpdateUser; diff --git a/src/interfaces/common/AlertType.ts b/src/interfaces/common/AlertType.ts new file mode 100644 index 0000000..468c6ca --- /dev/null +++ b/src/interfaces/common/AlertType.ts @@ -0,0 +1,3 @@ +type AlertType = 'success' | 'error' | 'loading' | 'custom' | null; + +export default AlertType; diff --git a/src/interfaces/common/ApplyTip.ts b/src/interfaces/common/ApplyTip.ts new file mode 100644 index 0000000..4ce6211 --- /dev/null +++ b/src/interfaces/common/ApplyTip.ts @@ -0,0 +1,18 @@ +import OfferType from './OfferType'; +import UserData from './UserData'; + +interface ApplyTip { + id: string; + left: number; + price: number; + user: UserData; + timestamp?: string; + type: OfferType; + total: number; + connected_order_id: string; + transaction: boolean; + hex_raw_proposal?: string; + isInstant: boolean; +} + +export default ApplyTip; diff --git a/src/interfaces/common/CandleRow.ts b/src/interfaces/common/CandleRow.ts new file mode 100644 index 0000000..3df63c7 --- /dev/null +++ b/src/interfaces/common/CandleRow.ts @@ -0,0 +1,11 @@ +interface CandleRow { + id?: string; + pair_id?: string; + timestamp: string; + shadow_top?: number; + shadow_bottom?: number; + body_first?: number; + body_second?: number; +} + +export default CandleRow; diff --git a/src/interfaces/common/ContextValue.ts b/src/interfaces/common/ContextValue.ts new file mode 100644 index 0000000..974cc8e --- /dev/null +++ b/src/interfaces/common/ContextValue.ts @@ -0,0 +1,87 @@ +import { Dispatch } from 'react'; +import { GetUserResData } from '../responses/user/GetUserRes'; +import { GetConfigResData } from '../responses/config/GetConfigRes'; + +export interface Asset { + name: string; + ticker: string; + assetId: string; + decimalPoint: number; + balance: string; + unlockedBalance: string; +} + +export interface Transfer { + amount: string; + assetId: string; + incoming: boolean; +} + +export interface Transaction { + isConfirmed: boolean; + txHash: string; + blobSize: number; + timestamp: number; + height: number; + paymentId: string; + comment: string; + fee: string; + isInitiator: boolean; + transfers: Transfer[]; +} + +interface WalletState { + address: string; + alias: string; + balance: string; + assets: Asset[]; + transactions: Transaction[]; + connected: boolean +} + +type UserState = GetUserResData | null; + +interface ContextState { + wallet: WalletState | null; + user: UserState; + config: GetConfigResData | null; + assetsRates: Map; + __triggers: { + offers: number; + }; + closed_notifications: number[]; +} + +type ContextAction = + | { + type: 'WALLET_UPDATED'; + payload: WalletState | null; + } + | { + type: 'USER_UPDATED'; + payload: UserState; + } + | { + type: 'CONFIG_UPDATED'; + payload: GetConfigResData | null; + } + | { + type: 'TRIGGER_OFFERS_UPDATE'; + } + | { + type: 'ASSETS_RATE_UPDATED'; + payload: Map; + } + | { + type: 'CLOSED_NOTIFICATIONS_UPDATED'; + payload: number[]; + }; + +interface ContextValue { + state: ContextState; + dispatch: Dispatch; +} + +export default ContextValue; + +export type { ContextState, ContextAction, WalletState, UserState }; diff --git a/src/interfaces/common/CurrencyContentRow.ts b/src/interfaces/common/CurrencyContentRow.ts new file mode 100644 index 0000000..f0192d9 --- /dev/null +++ b/src/interfaces/common/CurrencyContentRow.ts @@ -0,0 +1,8 @@ +import CurrencyRow from './CurrencyRow'; + +interface CurrencyContentRow { + name: string; + data: CurrencyRow[]; +} + +export default CurrencyContentRow; diff --git a/src/interfaces/common/CurrencyRow.ts b/src/interfaces/common/CurrencyRow.ts new file mode 100644 index 0000000..7b3acd6 --- /dev/null +++ b/src/interfaces/common/CurrencyRow.ts @@ -0,0 +1,24 @@ +import CurrencyType from './CurrencyType'; + +export interface Asset { + asset_id: string; + logo: string; + price_url: string; + ticker: string; + full_name: string; + total_max_supply: bigint; + current_supply: bigint; + decimal_point: number; + meta_info: string; +} + +interface CurrencyRow { + id: string; + name: string; + code: string; + type?: CurrencyType; + asset_id?: string | null; + asset_info?: Asset; +} + +export default CurrencyRow; diff --git a/src/interfaces/common/CurrencyType.ts b/src/interfaces/common/CurrencyType.ts new file mode 100644 index 0000000..de1b879 --- /dev/null +++ b/src/interfaces/common/CurrencyType.ts @@ -0,0 +1,3 @@ +type CurrencyType = 'fiat' | 'crypto' | 'deposit'; + +export default CurrencyType; diff --git a/src/interfaces/common/DateState.ts b/src/interfaces/common/DateState.ts new file mode 100644 index 0000000..c3d8d59 --- /dev/null +++ b/src/interfaces/common/DateState.ts @@ -0,0 +1,6 @@ +interface DateState { + first: Date | null; + last: Date | null; +} + +export default DateState; diff --git a/src/interfaces/common/DepositState.ts b/src/interfaces/common/DepositState.ts new file mode 100644 index 0000000..ede08d3 --- /dev/null +++ b/src/interfaces/common/DepositState.ts @@ -0,0 +1,3 @@ +type DepositState = 'default' | 'deposit' | 'confirmed' | 'canceled' | null; + +export default DepositState; diff --git a/src/interfaces/common/DropdownRow.ts b/src/interfaces/common/DropdownRow.ts new file mode 100644 index 0000000..6bf8614 --- /dev/null +++ b/src/interfaces/common/DropdownRow.ts @@ -0,0 +1,7 @@ +interface DropdownRow { + name: string; + code?: string; + disabled?: boolean; +} + +export default DropdownRow; diff --git a/src/interfaces/common/HorizontalSelectValue.ts b/src/interfaces/common/HorizontalSelectValue.ts new file mode 100644 index 0000000..629d2ca --- /dev/null +++ b/src/interfaces/common/HorizontalSelectValue.ts @@ -0,0 +1,7 @@ +interface HorizontalSelectValue { + name: string; + code: string; + notifications?: number; +} + +export default HorizontalSelectValue; diff --git a/src/interfaces/common/OfferType.ts b/src/interfaces/common/OfferType.ts new file mode 100644 index 0000000..306faa6 --- /dev/null +++ b/src/interfaces/common/OfferType.ts @@ -0,0 +1,3 @@ +type OfferType = 'buy' | 'sell'; + +export default OfferType; diff --git a/src/interfaces/common/OrderRow.ts b/src/interfaces/common/OrderRow.ts new file mode 100644 index 0000000..d13a0cd --- /dev/null +++ b/src/interfaces/common/OrderRow.ts @@ -0,0 +1,18 @@ +import OfferType from './OfferType'; + +interface OrderRow { + id: string; + type: OfferType; + timestamp: string; + side: string; + price: number; + amount: number; + total: number; + pair_id: string; + user_id: string; + status: string; + left: number; + isInstant: boolean; +} + +export default OrderRow; diff --git a/src/interfaces/common/PairData.ts b/src/interfaces/common/PairData.ts new file mode 100644 index 0000000..e6fb9c0 --- /dev/null +++ b/src/interfaces/common/PairData.ts @@ -0,0 +1,15 @@ +import CurrencyRow from './CurrencyRow'; + +interface PairData { + id: string; + first_currency: CurrencyRow; + second_currency: CurrencyRow; + rate?: number; + coefficient?: number; + high?: number; + low?: number; + volume: number; + featured: boolean; +} + +export default PairData; diff --git a/src/interfaces/common/Period.ts b/src/interfaces/common/Period.ts new file mode 100644 index 0000000..3aa1672 --- /dev/null +++ b/src/interfaces/common/Period.ts @@ -0,0 +1,3 @@ +type Period = '1h' | '1d' | '1w' | '1m'; + +export default Period; diff --git a/src/interfaces/common/Point.ts b/src/interfaces/common/Point.ts new file mode 100644 index 0000000..c0ce822 --- /dev/null +++ b/src/interfaces/common/Point.ts @@ -0,0 +1,6 @@ +interface Point { + x: number; + y: number; +} + +export default Point; diff --git a/src/interfaces/common/Side.ts b/src/interfaces/common/Side.ts new file mode 100644 index 0000000..754d5ac --- /dev/null +++ b/src/interfaces/common/Side.ts @@ -0,0 +1,3 @@ +type Side = 'limit' | 'market'; + +export default Side; diff --git a/src/interfaces/common/UserData.ts b/src/interfaces/common/UserData.ts new file mode 100644 index 0000000..17e97de --- /dev/null +++ b/src/interfaces/common/UserData.ts @@ -0,0 +1,8 @@ +interface UserData { + id?: undefined; + alias: string; + address: string; + favourite_currencies?: undefined; +} + +export default UserData; diff --git a/src/interfaces/common/UserRow.ts b/src/interfaces/common/UserRow.ts new file mode 100644 index 0000000..f3b32bd --- /dev/null +++ b/src/interfaces/common/UserRow.ts @@ -0,0 +1,8 @@ +interface UserRow { + id: string; + alias: string; + address: string; + favourite_currencies: string[]; +} + +export default UserRow; diff --git a/src/interfaces/common/WalletCredentials.ts b/src/interfaces/common/WalletCredentials.ts new file mode 100644 index 0000000..6840270 --- /dev/null +++ b/src/interfaces/common/WalletCredentials.ts @@ -0,0 +1,5 @@ +export default interface WalletCredentials { + nonce: string; + signature: string; + publicKey: string; +} diff --git a/src/interfaces/common/ZanoWindow.ts b/src/interfaces/common/ZanoWindow.ts new file mode 100644 index 0000000..0f367ba --- /dev/null +++ b/src/interfaces/common/ZanoWindow.ts @@ -0,0 +1,10 @@ +type GlobalWindow = Window & typeof globalThis; + +type ZanoWindow = Omit & { + zano: { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + request: (_str: string, _params?: any, _timeoutMs?: number | null) => Promise; + }; +}; + +export default ZanoWindow; diff --git a/src/interfaces/enum/pair.ts b/src/interfaces/enum/pair.ts new file mode 100644 index 0000000..3854f22 --- /dev/null +++ b/src/interfaces/enum/pair.ts @@ -0,0 +1,5 @@ +/* eslint-disable no-unused-vars */ +export enum PairSortOption { + VOLUME_LOW_TO_HIGH = 'VOLUME_LOW_TO_HIGH', + VOLUME_HIGH_TO_LOW = 'VOLUME_HIGH_TO_LOW', +} diff --git a/src/interfaces/fetch-data/apply-order/ApplyOrderData.ts b/src/interfaces/fetch-data/apply-order/ApplyOrderData.ts new file mode 100644 index 0000000..e28a6ea --- /dev/null +++ b/src/interfaces/fetch-data/apply-order/ApplyOrderData.ts @@ -0,0 +1,7 @@ +interface ApplyOrderData { + id: string; + connected_order_id: string; + hex_raw_proposal: string; +} + +export default ApplyOrderData; diff --git a/src/interfaces/fetch-data/create-order/CreateOrderData.ts b/src/interfaces/fetch-data/create-order/CreateOrderData.ts new file mode 100644 index 0000000..a355086 --- /dev/null +++ b/src/interfaces/fetch-data/create-order/CreateOrderData.ts @@ -0,0 +1,12 @@ +import OfferType from '@/interfaces/common/OfferType'; +import Side from '@/interfaces/common/Side'; + +interface CreateOrderData { + type: OfferType; + side: Side; + price: string; + amount: string; + pairId: string; +} + +export default CreateOrderData; diff --git a/src/interfaces/fetch-data/get-page/GetPageData.ts b/src/interfaces/fetch-data/get-page/GetPageData.ts new file mode 100644 index 0000000..ab9c9e0 --- /dev/null +++ b/src/interfaces/fetch-data/get-page/GetPageData.ts @@ -0,0 +1,12 @@ +import OfferType from '@/interfaces/common/OfferType'; + +interface GetPageData { + type: OfferType; + page: number; + input_currency_id?: string; + target_currency_id?: string; + price?: number; + priceDescending?: boolean; +} + +export default GetPageData; diff --git a/src/interfaces/fetch-data/update-offer/UpdateOfferData.ts b/src/interfaces/fetch-data/update-offer/UpdateOfferData.ts new file mode 100644 index 0000000..6a52c7e --- /dev/null +++ b/src/interfaces/fetch-data/update-offer/UpdateOfferData.ts @@ -0,0 +1,17 @@ +import OfferType from '@/interfaces/common/OfferType'; + +interface UpdateOfferData { + price: number; + min: number; + max: number; + deposit_seller: number; + deposit_buyer: number; + type: OfferType; + comment?: string; + input_currency_id: string; + target_currency_id: string; + deposit_currency_id: string; + number?: string; +} + +export default UpdateOfferData; diff --git a/src/interfaces/props/components/UI/Alert/AlertProps.ts b/src/interfaces/props/components/UI/Alert/AlertProps.ts new file mode 100644 index 0000000..0b66038 --- /dev/null +++ b/src/interfaces/props/components/UI/Alert/AlertProps.ts @@ -0,0 +1,14 @@ +import AlertType from '@/interfaces/common/AlertType'; +import { ReactNode } from 'react'; + +interface AlertProps { + type: AlertType; + title?: string; + subtitle?: string; + close: () => void; + customIcon?: ReactNode; + customContent?: ReactNode; + children?: ReactNode; +} + +export default AlertProps; diff --git a/src/interfaces/props/components/UI/Button/ButtonProps.ts b/src/interfaces/props/components/UI/Button/ButtonProps.ts new file mode 100644 index 0000000..b72515f --- /dev/null +++ b/src/interfaces/props/components/UI/Button/ButtonProps.ts @@ -0,0 +1,15 @@ +import { CSSProperties, ReactNode } from 'react'; + +interface ButtonProps { + children: ReactNode; + style?: CSSProperties; + onClick?: () => void; + transparent?: boolean; + onMouseEnter?: () => void; + onMouseLeave?: () => void; + disabled?: boolean; + className?: string; + noBorder?: boolean; +} + +export default ButtonProps; diff --git a/src/interfaces/props/components/UI/ConnectButton/ConnectButtonProps.ts b/src/interfaces/props/components/UI/ConnectButton/ConnectButtonProps.ts new file mode 100644 index 0000000..e353e20 --- /dev/null +++ b/src/interfaces/props/components/UI/ConnectButton/ConnectButtonProps.ts @@ -0,0 +1,7 @@ +interface ConnectButtonProps { + autoAuth?: boolean; + className?: string; + transparent?: boolean; +} + +export default ConnectButtonProps; diff --git a/src/interfaces/props/components/UI/CurrencyDropdown/CurrencyDropdownProps.ts b/src/interfaces/props/components/UI/CurrencyDropdown/CurrencyDropdownProps.ts new file mode 100644 index 0000000..5b6859c --- /dev/null +++ b/src/interfaces/props/components/UI/CurrencyDropdown/CurrencyDropdownProps.ts @@ -0,0 +1,13 @@ +import CurrencyContentRow from '@/interfaces/common/CurrencyContentRow'; +import CurrencyRow from '@/interfaces/common/CurrencyRow'; + +interface CurrencyDropdownProps { + value: CurrencyRow | null; + setValue: (_e: CurrencyRow) => void; + className?: string; + withAll?: boolean; + noStars?: boolean; + content: CurrencyContentRow[]; +} + +export default CurrencyDropdownProps; diff --git a/src/interfaces/props/components/UI/CurvePairChart/CurvePairChartProps.ts b/src/interfaces/props/components/UI/CurvePairChart/CurvePairChartProps.ts new file mode 100644 index 0000000..eb2150a --- /dev/null +++ b/src/interfaces/props/components/UI/CurvePairChart/CurvePairChartProps.ts @@ -0,0 +1,10 @@ +import Point from '@/interfaces/common/Point'; + +interface CurvePairChartProps { + data: Point[]; + isAscending: boolean; + className?: string; + minLength?: number; +} + +export default CurvePairChartProps; diff --git a/src/interfaces/props/components/UI/DateRangeSelector/DateRangeSelectorProps.ts b/src/interfaces/props/components/UI/DateRangeSelector/DateRangeSelectorProps.ts new file mode 100644 index 0000000..1fa6111 --- /dev/null +++ b/src/interfaces/props/components/UI/DateRangeSelector/DateRangeSelectorProps.ts @@ -0,0 +1,10 @@ +import DateState from '@/interfaces/common/DateState'; + +interface DateRangeSelectorProps { + value: DateState; + setValue: (_e: DateState) => void; + className?: string; + disabled?: boolean; +} + +export default DateRangeSelectorProps; diff --git a/src/interfaces/props/components/UI/Dropdown/DropdownProps.ts b/src/interfaces/props/components/UI/Dropdown/DropdownProps.ts new file mode 100644 index 0000000..47b31a0 --- /dev/null +++ b/src/interfaces/props/components/UI/Dropdown/DropdownProps.ts @@ -0,0 +1,18 @@ +import DropdownRow from '@/interfaces/common/DropdownRow'; +import { ReactElement } from 'react'; + +interface DropdownProps { + value: DropdownRow; + setValue: (_e: T) => void; + maxItems?: number; + defaultOpen?: boolean; + selfContained?: boolean; + body: T[]; + withImages?: boolean; + noStars?: boolean; + className?: string; + withSearch?: boolean; + icon?: ReactElement; +} + +export default DropdownProps; diff --git a/src/interfaces/props/components/UI/Dropdown/DropdownRowProps.ts b/src/interfaces/props/components/UI/Dropdown/DropdownRowProps.ts new file mode 100644 index 0000000..248981c --- /dev/null +++ b/src/interfaces/props/components/UI/Dropdown/DropdownRowProps.ts @@ -0,0 +1,13 @@ +import { MouseEventHandler, ReactNode } from 'react'; + +interface DropdownRowProps { + header?: boolean; + search?: boolean; + selfContained?: boolean; + className?: string; + disabled?: boolean; + children: ReactNode | undefined; + onClick?: MouseEventHandler; +} + +export default DropdownRowProps; diff --git a/src/interfaces/props/components/UI/EmptyLink/EmptyLinkProps.tsx b/src/interfaces/props/components/UI/EmptyLink/EmptyLinkProps.tsx new file mode 100644 index 0000000..768c24d --- /dev/null +++ b/src/interfaces/props/components/UI/EmptyLink/EmptyLinkProps.tsx @@ -0,0 +1,8 @@ +import { ReactNode } from 'react'; + +interface EmptyLinkProps { + children: ReactNode; + className?: string; +} + +export default EmptyLinkProps; diff --git a/src/interfaces/props/components/UI/Filters/FiltersProps.ts b/src/interfaces/props/components/UI/Filters/FiltersProps.ts new file mode 100644 index 0000000..4c5dd7d --- /dev/null +++ b/src/interfaces/props/components/UI/Filters/FiltersProps.ts @@ -0,0 +1,20 @@ +import CurrencyContentRow from '@/interfaces/common/CurrencyContentRow'; +import FiltersState from '@/interfaces/states/FiltersState'; +import { CSSProperties, Dispatch, SetStateAction } from 'react'; + +interface FiltersProps { + value: FiltersState; + setValue: Dispatch>; + stateForBtns: FiltersState; + setStateForBtns: (_e: FiltersState) => void; + inPopup?: boolean; + className?: string; + style?: CSSProperties; + noStars?: boolean; + withSearch?: boolean; + refreshClick: () => void; + searchClick: () => void; + currencies: CurrencyContentRow[]; +} + +export default FiltersProps; diff --git a/src/interfaces/props/components/UI/HorizontalSelect/HorizontalSelectProps.ts b/src/interfaces/props/components/UI/HorizontalSelect/HorizontalSelectProps.ts new file mode 100644 index 0000000..23ae30a --- /dev/null +++ b/src/interfaces/props/components/UI/HorizontalSelect/HorizontalSelectProps.ts @@ -0,0 +1,13 @@ +import HorizontalSelectValue from '@/interfaces/common/HorizontalSelectValue'; +import { Dispatch, SetStateAction } from 'react'; + +interface HorizontalSelectProps { + withNotifications?: boolean; + body: T[]; + value: T; + setValue: Dispatch>; + className?: string; + isTab?: boolean; +} + +export default HorizontalSelectProps; diff --git a/src/interfaces/props/components/UI/Input/InputProps.tsx b/src/interfaces/props/components/UI/Input/InputProps.tsx new file mode 100644 index 0000000..7014692 --- /dev/null +++ b/src/interfaces/props/components/UI/Input/InputProps.tsx @@ -0,0 +1,20 @@ +import { CSSProperties, ChangeEvent, KeyboardEventHandler, WheelEventHandler } from 'react'; + +interface InputProps { + className?: string; + type?: 'text' | 'number'; + min?: string; + max?: string; + placeholder?: string; + onInput?: (_e: ChangeEvent) => void; + onWheel?: WheelEventHandler; + value: string | number; + onKeyDown?: KeyboardEventHandler; + disabled?: boolean; + maxLength?: number; + bordered?: boolean; + readOnly?: boolean; + style?: CSSProperties; +} + +export default InputProps; diff --git a/src/interfaces/props/components/UI/PairText/PairText.tsx b/src/interfaces/props/components/UI/PairText/PairText.tsx new file mode 100644 index 0000000..6ee9d03 --- /dev/null +++ b/src/interfaces/props/components/UI/PairText/PairText.tsx @@ -0,0 +1,12 @@ +interface PairText { + key: string; + value: string; +} + +interface PairTextProps { + columnWidth: number; + first: PairText; + second: PairText; +} + +export default PairTextProps; diff --git a/src/interfaces/props/components/UI/Popup/PopupProps.ts b/src/interfaces/props/components/UI/Popup/PopupProps.ts new file mode 100644 index 0000000..712b1c0 --- /dev/null +++ b/src/interfaces/props/components/UI/Popup/PopupProps.ts @@ -0,0 +1,13 @@ +import { FC } from 'react'; + +interface PopupProps { + Content: FC<{ close: () => void } & T>; + settings: T; + close: () => void; + scroll?: boolean; + blur?: boolean; + noPointer?: boolean; + classList?: string[]; +} + +export default PopupProps; diff --git a/src/interfaces/props/components/UI/Preloader/PreloaderProps.tsx b/src/interfaces/props/components/UI/Preloader/PreloaderProps.tsx new file mode 100644 index 0000000..5819b4e --- /dev/null +++ b/src/interfaces/props/components/UI/Preloader/PreloaderProps.tsx @@ -0,0 +1,6 @@ +interface PreloaderProps { + className?: string; + fullPage?: boolean; +} + +export default PreloaderProps; diff --git a/src/interfaces/props/components/UI/ProfileWidget/ProfileWidget.ts b/src/interfaces/props/components/UI/ProfileWidget/ProfileWidget.ts new file mode 100644 index 0000000..7e82ad6 --- /dev/null +++ b/src/interfaces/props/components/UI/ProfileWidget/ProfileWidget.ts @@ -0,0 +1,10 @@ +interface ProfileWidgetProps { + withLink?: boolean; + offerData: { + alias: string; + address: string; + hash?: string; + }; +} + +export default ProfileWidgetProps; diff --git a/src/interfaces/props/components/UI/RangeInput/RangeInputProps.tsx b/src/interfaces/props/components/UI/RangeInput/RangeInputProps.tsx new file mode 100644 index 0000000..e57e4db --- /dev/null +++ b/src/interfaces/props/components/UI/RangeInput/RangeInputProps.tsx @@ -0,0 +1,12 @@ +import { ChangeEvent } from 'react'; + +interface RangeInputProps { + value: string; + onInput: (_e: ChangeEvent) => void; + min?: number; + max?: number; + disabled?: boolean; + className?: string; +} + +export default RangeInputProps; diff --git a/src/interfaces/props/components/UI/Tooltip/TooltipProps.ts b/src/interfaces/props/components/UI/Tooltip/TooltipProps.ts new file mode 100644 index 0000000..528e431 --- /dev/null +++ b/src/interfaces/props/components/UI/Tooltip/TooltipProps.ts @@ -0,0 +1,11 @@ +import { CSSProperties, ReactNode } from 'react'; + +interface TooltipProps { + shown?: boolean; + style?: CSSProperties; + className?: string; + arrowClass?: string; + children: ReactNode; +} + +export default TooltipProps; diff --git a/src/interfaces/props/components/default/CreateOfferPopup/CreateOfferPopupProps.ts b/src/interfaces/props/components/default/CreateOfferPopup/CreateOfferPopupProps.ts new file mode 100644 index 0000000..81a446d --- /dev/null +++ b/src/interfaces/props/components/default/CreateOfferPopup/CreateOfferPopupProps.ts @@ -0,0 +1,10 @@ +import OfferData from '@/interfaces/responses/offers/OfferData'; +import { Dispatch, SetStateAction } from 'react'; + +interface CreateOfferPopupProps { + edit?: boolean; + offerData?: OfferData; + setPopupState: Dispatch>; +} + +export default CreateOfferPopupProps; diff --git a/src/interfaces/props/components/default/CreateOfferPopup/WindowedInputsProps.ts b/src/interfaces/props/components/default/CreateOfferPopup/WindowedInputsProps.ts new file mode 100644 index 0000000..4f180a4 --- /dev/null +++ b/src/interfaces/props/components/default/CreateOfferPopup/WindowedInputsProps.ts @@ -0,0 +1,22 @@ +import { Dispatch, SetStateAction } from 'react'; + +interface LimitsState { + min: string; + max: string; +} + +interface DepositState { + seller: string; + buyer: string; +} + +type WindowedInputsProps = { + limits?: boolean; + value: LimitsState | DepositState; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + setValue: Dispatch>; +}; + +export default WindowedInputsProps; + +export { type LimitsState, type DepositState }; diff --git a/src/interfaces/props/components/default/DetailedOfferPopup/DetailedOfferPopupProps.ts b/src/interfaces/props/components/default/DetailedOfferPopup/DetailedOfferPopupProps.ts new file mode 100644 index 0000000..5a83a85 --- /dev/null +++ b/src/interfaces/props/components/default/DetailedOfferPopup/DetailedOfferPopupProps.ts @@ -0,0 +1,9 @@ +import OfferData from '@/interfaces/responses/offers/OfferData'; +import { Dispatch, SetStateAction } from 'react'; + +interface DetailedOfferPopupProps { + offerData: OfferData; + setPopupState: Dispatch>; +} + +export default DetailedOfferPopupProps; diff --git a/src/interfaces/props/components/default/Header/CurrencyCheckRowProps.ts b/src/interfaces/props/components/default/Header/CurrencyCheckRowProps.ts new file mode 100644 index 0000000..b9182ff --- /dev/null +++ b/src/interfaces/props/components/default/Header/CurrencyCheckRowProps.ts @@ -0,0 +1,8 @@ +interface CurrencyCheckRowProps { + icon: string; + title: string; + amount: number; + balanceSeen?: boolean; +} + +export default CurrencyCheckRowProps; diff --git a/src/interfaces/props/components/default/Header/NavBar/NavBarProps.ts b/src/interfaces/props/components/default/Header/NavBar/NavBarProps.ts new file mode 100644 index 0000000..10bebf8 --- /dev/null +++ b/src/interfaces/props/components/default/Header/NavBar/NavBarProps.ts @@ -0,0 +1,5 @@ +interface NavBarProps { + mobile?: boolean; +} + +export default NavBarProps; diff --git a/src/interfaces/props/components/default/Header/NavBar/NavItemProps.ts b/src/interfaces/props/components/default/Header/NavBar/NavItemProps.ts new file mode 100644 index 0000000..fd6e299 --- /dev/null +++ b/src/interfaces/props/components/default/Header/NavBar/NavItemProps.ts @@ -0,0 +1,12 @@ +import { ElementType } from 'react'; + +interface NavItemProps { + title: string; + routeKeyphrase: string; + href: string; + Img: ElementType; + disabled?: boolean; + notifications?: number; +} + +export default NavItemProps; diff --git a/src/interfaces/props/components/default/MainPageTitle/MainPageTitleProps.ts b/src/interfaces/props/components/default/MainPageTitle/MainPageTitleProps.ts new file mode 100644 index 0000000..1feb8fc --- /dev/null +++ b/src/interfaces/props/components/default/MainPageTitle/MainPageTitleProps.ts @@ -0,0 +1,11 @@ +import { ReactNode } from 'react'; + +interface MainPageTitleProps { + blue: string; + white: string; + description: string; + mobileDescription?: string; + children: ReactNode; +} + +export default MainPageTitleProps; diff --git a/src/interfaces/props/pages/dex/orders/OrdersTable/OrdersTableProps.ts b/src/interfaces/props/pages/dex/orders/OrdersTable/OrdersTableProps.ts new file mode 100644 index 0000000..203e7d7 --- /dev/null +++ b/src/interfaces/props/pages/dex/orders/OrdersTable/OrdersTableProps.ts @@ -0,0 +1,13 @@ +import AlertType from '@/interfaces/common/AlertType'; +import { UserOrderData } from '@/interfaces/responses/orders/GetUserOrdersRes'; +import { Dispatch, SetStateAction } from 'react'; + +interface OrdersTableProps { + value: UserOrderData[]; + category: string; + setAlertState: Dispatch>; + setAlertSubtitle: Dispatch>; + setOrders: Dispatch>; +} + +export default OrdersTableProps; diff --git a/src/interfaces/props/pages/dex/orders/PairValue.ts b/src/interfaces/props/pages/dex/orders/PairValue.ts new file mode 100644 index 0000000..0793947 --- /dev/null +++ b/src/interfaces/props/pages/dex/orders/PairValue.ts @@ -0,0 +1,8 @@ +import DropdownRow from '@/interfaces/common/DropdownRow'; + +interface PairValue extends DropdownRow { + code: string; + name: string; +} + +export default PairValue; diff --git a/src/interfaces/props/pages/dex/trading/CandleChartProps/CandleChartProps.ts b/src/interfaces/props/pages/dex/trading/CandleChartProps/CandleChartProps.ts new file mode 100644 index 0000000..167f518 --- /dev/null +++ b/src/interfaces/props/pages/dex/trading/CandleChartProps/CandleChartProps.ts @@ -0,0 +1,9 @@ +import CandleRow from '@/interfaces/common/CandleRow'; +import Period from '@/interfaces/common/Period'; + +interface CandleChartProps { + candles: CandleRow[]; + period: Period; +} + +export default CandleChartProps; diff --git a/src/interfaces/props/pages/dex/trading/InputPanelItem/InputPanelItemProps.ts b/src/interfaces/props/pages/dex/trading/InputPanelItem/InputPanelItemProps.ts new file mode 100644 index 0000000..b6b3695 --- /dev/null +++ b/src/interfaces/props/pages/dex/trading/InputPanelItem/InputPanelItemProps.ts @@ -0,0 +1,28 @@ +import AlertType from '@/interfaces/common/AlertType'; +import SelectValue from '@/interfaces/states/pages/dex/trading/InputPanelItem/SelectValue'; +import { Dispatch, SetStateAction } from 'react'; + +interface InputPanelItemProps { + priceState: string; + amountState: string; + totalState: string; + buySellValues: SelectValue[]; + buySellState: SelectValue; + setBuySellState: Dispatch>; + setPriceFunction: (_value: string) => void; + setAmountFunction: (_value: string) => void; + setAlertState: Dispatch>; + setAlertSubtitle: Dispatch>; + setRangeInputValue: Dispatch>; + rangeInputValue: string; + firstCurrencyName: string; + secondCurrencyName: string; + balance: number | undefined; + amountValid: boolean; + priceValid: boolean; + totalValid: boolean; + totalUsd: string | undefined; + scrollToOrderList: () => void; +} + +export default InputPanelItemProps; diff --git a/src/interfaces/props/pages/dex/trading/InputPanelItem/LabeledInputProps.ts b/src/interfaces/props/pages/dex/trading/InputPanelItem/LabeledInputProps.ts new file mode 100644 index 0000000..e506c47 --- /dev/null +++ b/src/interfaces/props/pages/dex/trading/InputPanelItem/LabeledInputProps.ts @@ -0,0 +1,12 @@ +interface LabeledInputProps { + label: string; + value: string; + setValue: (_value: string) => void; + placeholder: string; + currency: string; + usd?: string; + readonly?: boolean; + invalid?: boolean; +} + +export default LabeledInputProps; diff --git a/src/interfaces/props/pages/dex/trading/StatItemProps.ts b/src/interfaces/props/pages/dex/trading/StatItemProps.ts new file mode 100644 index 0000000..cf99aeb --- /dev/null +++ b/src/interfaces/props/pages/dex/trading/StatItemProps.ts @@ -0,0 +1,10 @@ +import { FC } from 'react'; + +interface StatItemProps { + Img: FC; + title: string; + value: string; + coefficient?: number; +} + +export default StatItemProps; diff --git a/src/interfaces/props/pages/p2p/HomeProps.ts b/src/interfaces/props/pages/p2p/HomeProps.ts new file mode 100644 index 0000000..ee0d442 --- /dev/null +++ b/src/interfaces/props/pages/p2p/HomeProps.ts @@ -0,0 +1,7 @@ +import { Stats } from '../../../responses/offers/GetStatsRes'; + +interface HomeProps { + stats: Stats; +} + +export default HomeProps; diff --git a/src/interfaces/props/pages/p2p/components/HomeTable/HomeTableProps.ts b/src/interfaces/props/pages/p2p/components/HomeTable/HomeTableProps.ts new file mode 100644 index 0000000..2d73496 --- /dev/null +++ b/src/interfaces/props/pages/p2p/components/HomeTable/HomeTableProps.ts @@ -0,0 +1,11 @@ +import { Dispatch, SetStateAction } from 'react'; +import OfferData from '../../../../../responses/offers/OfferData'; + +interface HomeTableProps { + preloaderState: boolean; + priceDescending: boolean; + setPriceState: Dispatch>; + offers: OfferData[]; +} + +export default HomeTableProps; diff --git a/src/interfaces/props/pages/p2p/components/Marketplace/MarketplaceProps.ts b/src/interfaces/props/pages/p2p/components/Marketplace/MarketplaceProps.ts new file mode 100644 index 0000000..edd82be --- /dev/null +++ b/src/interfaces/props/pages/p2p/components/Marketplace/MarketplaceProps.ts @@ -0,0 +1,9 @@ +import { Dispatch, SetStateAction } from 'react'; +import OfferData from '../../../../../responses/offers/OfferData'; + +interface MarketplaceProps { + value: OfferData[]; + setValue: Dispatch>; +} + +export default MarketplaceProps; diff --git a/src/interfaces/props/pages/p2p/components/Pagination/PaginationProps.ts b/src/interfaces/props/pages/p2p/components/Pagination/PaginationProps.ts new file mode 100644 index 0000000..4008ea6 --- /dev/null +++ b/src/interfaces/props/pages/p2p/components/Pagination/PaginationProps.ts @@ -0,0 +1,9 @@ +import { Dispatch, SetStateAction } from 'react'; + +interface PaginationProps { + totalPages: number; + value: number; + setValue: Dispatch>; +} + +export default PaginationProps; diff --git a/src/interfaces/props/pages/p2p/process/components/Messenger/MessageProps.ts b/src/interfaces/props/pages/p2p/process/components/Messenger/MessageProps.ts new file mode 100644 index 0000000..fe52cac --- /dev/null +++ b/src/interfaces/props/pages/p2p/process/components/Messenger/MessageProps.ts @@ -0,0 +1,16 @@ +import { Message } from '@/interfaces/responses/chats/GetChatRes'; + +interface MessageProps { + isSender: boolean; + success: boolean; + fail: boolean; + // messageInfo: { + // type: "img" | "text"; + // text?: string; + // url?: string; + // timestamp: string; + // } + messageInfo: Message; +} + +export default MessageProps; diff --git a/src/interfaces/props/pages/p2p/process/components/Messenger/MessengerProps.ts b/src/interfaces/props/pages/p2p/process/components/Messenger/MessengerProps.ts new file mode 100644 index 0000000..ef74554 --- /dev/null +++ b/src/interfaces/props/pages/p2p/process/components/Messenger/MessengerProps.ts @@ -0,0 +1,16 @@ +import { Message } from '@/interfaces/responses/chats/GetChatRes'; +import { Dispatch, SetStateAction } from 'react'; + +interface MessengerProps { + alias: string; + address: string; + isOwner: boolean; + finishState: 'confirmed' | 'canceled' | null; + chatId: string; + value: Message[]; + setValue: Dispatch>; + maxChunks: number; + scrollTrigger: boolean; +} + +export default MessengerProps; diff --git a/src/interfaces/props/pages/p2p/profile/ProfileTable/ProfileTableProps.ts b/src/interfaces/props/pages/p2p/profile/ProfileTable/ProfileTableProps.ts new file mode 100644 index 0000000..58c8e7b --- /dev/null +++ b/src/interfaces/props/pages/p2p/profile/ProfileTable/ProfileTableProps.ts @@ -0,0 +1,10 @@ +import { CategoriesCode } from '@/interfaces/states/pages/p2p/profile/CategoriesState'; +import OffersStateElement from '@/interfaces/states/pages/p2p/profile/OffersState'; + +interface ProfileTableProps { + categoryState: CategoriesCode; + offers: OffersStateElement[]; + preloaderState?: boolean; +} + +export default ProfileTableProps; diff --git a/src/interfaces/props/pages/swap/SwapItemProps.ts b/src/interfaces/props/pages/swap/SwapItemProps.ts new file mode 100644 index 0000000..4e83af1 --- /dev/null +++ b/src/interfaces/props/pages/swap/SwapItemProps.ts @@ -0,0 +1,10 @@ +interface SwapItemProps { + item: { + name: string; + code: string; + rate: string; + coefficient: number; + }; +} + +export default SwapItemProps; diff --git a/src/interfaces/responses/ErrorRes.ts b/src/interfaces/responses/ErrorRes.ts new file mode 100644 index 0000000..4cc3b04 --- /dev/null +++ b/src/interfaces/responses/ErrorRes.ts @@ -0,0 +1,6 @@ +interface ErrorRes { + success: false; + data: string; +} + +export default ErrorRes; diff --git a/src/interfaces/responses/candles/GetCandlesRes.ts b/src/interfaces/responses/candles/GetCandlesRes.ts new file mode 100644 index 0000000..940193d --- /dev/null +++ b/src/interfaces/responses/candles/GetCandlesRes.ts @@ -0,0 +1,8 @@ +import CandleRow from '@/interfaces/common/CandleRow'; + +interface GetCandlesRes { + success: true; + data: CandleRow[]; +} + +export default GetCandlesRes; diff --git a/src/interfaces/responses/chats/GetAllChatsRes.ts b/src/interfaces/responses/chats/GetAllChatsRes.ts new file mode 100644 index 0000000..7c381bc --- /dev/null +++ b/src/interfaces/responses/chats/GetAllChatsRes.ts @@ -0,0 +1,8 @@ +import { UserChatData } from '../user/GetUserRes'; + +interface GetAllChatsRes { + success: true; + data: UserChatData[]; +} + +export default GetAllChatsRes; diff --git a/src/interfaces/responses/chats/GetChatChunkRes.ts b/src/interfaces/responses/chats/GetChatChunkRes.ts new file mode 100644 index 0000000..17ee462 --- /dev/null +++ b/src/interfaces/responses/chats/GetChatChunkRes.ts @@ -0,0 +1,8 @@ +import { Message } from './GetChatRes'; + +interface GetChatChunkRes { + success: true; + data: Message[]; +} + +export default GetChatChunkRes; diff --git a/src/interfaces/responses/chats/GetChatRes.ts b/src/interfaces/responses/chats/GetChatRes.ts new file mode 100644 index 0000000..b5e099b --- /dev/null +++ b/src/interfaces/responses/chats/GetChatRes.ts @@ -0,0 +1,58 @@ +import CurrencyRow from '@/interfaces/common/CurrencyRow'; +import DepositState from '@/interfaces/common/DepositState'; +import OfferType from '@/interfaces/common/OfferType'; +import UserData from '@/interfaces/common/UserData'; + +interface Message { + id: string; + type?: 'img'; + url?: string; + text?: string; + timestamp: string; + fromOwner?: boolean; + success: boolean; + fail: boolean; + system?: boolean; +} + +interface ChatData { + id: string; + user_id: string; + price: number; + min: number; + max: number; + deposit_seller: number; + deposit_buyer: number; + type: OfferType; + input_currency: CurrencyRow; + target_currency: CurrencyRow; + comment: string | null; + number: string; + offer_status: string; + deposit_currency: CurrencyRow; + timestamp: string; + creator_data: UserData; + buyer_data: UserData; + + offer_number: string; + buyer_id: string; + // chat_history: Message[]; + chunk_count: number; + status: string; + pay: number; + receive: number; + owner_deposit: DepositState; + opponent_deposit: DepositState; + view_list: string[]; + + favourite_currencies?: undefined; +} + +interface GetChatRes { + success: true; + data: ChatData; +} + +export default GetChatRes; + +export type { ChatData, Message }; diff --git a/src/interfaces/responses/config/GetConfigRes.ts b/src/interfaces/responses/config/GetConfigRes.ts new file mode 100644 index 0000000..ef35587 --- /dev/null +++ b/src/interfaces/responses/config/GetConfigRes.ts @@ -0,0 +1,16 @@ +import CurrencyRow from '@/interfaces/common/CurrencyRow'; + +interface GetConfigResData { + currencies: CurrencyRow[]; +} + +interface GetConfigRes { + success: true; + data: { + currencies: CurrencyRow[]; + }; +} + +export default GetConfigRes; + +export type { GetConfigResData }; diff --git a/src/interfaces/responses/dex/GetPairRes.ts b/src/interfaces/responses/dex/GetPairRes.ts new file mode 100644 index 0000000..7329816 --- /dev/null +++ b/src/interfaces/responses/dex/GetPairRes.ts @@ -0,0 +1,8 @@ +import PairData from '@/interfaces/common/PairData'; + +interface GetPairRes { + success: true; + data: PairData; +} + +export default GetPairRes; diff --git a/src/interfaces/responses/dex/GetPairsPageRes.ts b/src/interfaces/responses/dex/GetPairsPageRes.ts new file mode 100644 index 0000000..e2f24db --- /dev/null +++ b/src/interfaces/responses/dex/GetPairsPageRes.ts @@ -0,0 +1,8 @@ +import PairData from '@/interfaces/common/PairData'; + +interface GetPairsPageRes { + success: true; + data: PairData[]; +} + +export default GetPairsPageRes; diff --git a/src/interfaces/responses/dex/GetPairsPagesAmountRes.ts b/src/interfaces/responses/dex/GetPairsPagesAmountRes.ts new file mode 100644 index 0000000..a906f2c --- /dev/null +++ b/src/interfaces/responses/dex/GetPairsPagesAmountRes.ts @@ -0,0 +1,4 @@ +export default interface GetPairsPagesAmountRes { + success: true; + data: number; +} diff --git a/src/interfaces/responses/offers/GetPageRes.ts b/src/interfaces/responses/offers/GetPageRes.ts new file mode 100644 index 0000000..b7dc6c9 --- /dev/null +++ b/src/interfaces/responses/offers/GetPageRes.ts @@ -0,0 +1,11 @@ +import OfferData from './OfferData'; + +interface GetPageRes { + success: true; + data: { + pages: number; + offers: OfferData[]; + }; +} + +export default GetPageRes; diff --git a/src/interfaces/responses/offers/GetStatsRes.ts b/src/interfaces/responses/offers/GetStatsRes.ts new file mode 100644 index 0000000..cf6ca0d --- /dev/null +++ b/src/interfaces/responses/offers/GetStatsRes.ts @@ -0,0 +1,15 @@ +interface Stats { + opened: number; + volume_24: number; + volume_7: number; + volume_30: number; +} + +interface GetStatsRes { + success: true; + data: Stats; +} + +export default GetStatsRes; + +export { type Stats }; diff --git a/src/interfaces/responses/offers/OfferData.ts b/src/interfaces/responses/offers/OfferData.ts new file mode 100644 index 0000000..2664961 --- /dev/null +++ b/src/interfaces/responses/offers/OfferData.ts @@ -0,0 +1,23 @@ +import CurrencyRow from '@/interfaces/common/CurrencyRow'; +import OfferType from '@/interfaces/common/OfferType'; + +interface OfferData { + id: string; + alias: string; + address: string; + price: number; + min: number; + max: number; + deposit_seller: number; + deposit_buyer: number; + type: OfferType; + input_currency: CurrencyRow; + target_currency: CurrencyRow; + comment: string | null; + number: string; + offer_status: string; + deposit_currency: CurrencyRow; + timestamp: string; +} + +export default OfferData; diff --git a/src/interfaces/responses/orders/GetChartOrdersRes.ts b/src/interfaces/responses/orders/GetChartOrdersRes.ts new file mode 100644 index 0000000..6153fc6 --- /dev/null +++ b/src/interfaces/responses/orders/GetChartOrdersRes.ts @@ -0,0 +1,8 @@ +import OrderRow from '@/interfaces/common/OrderRow'; + +interface GetChartOrdersRes { + success: true; + data: OrderRow[]; +} + +export default GetChartOrdersRes; diff --git a/src/interfaces/responses/orders/GetOrdersPageRes.ts b/src/interfaces/responses/orders/GetOrdersPageRes.ts new file mode 100644 index 0000000..0dded44 --- /dev/null +++ b/src/interfaces/responses/orders/GetOrdersPageRes.ts @@ -0,0 +1,20 @@ +import PairData from '@/interfaces/common/PairData'; +import UserData from '@/interfaces/common/UserData'; +import OrderRow from '@/interfaces/common/OrderRow'; + +interface PageOrderData extends OrderRow { + user: UserData; +} + +interface OrderDataWithPair extends OrderRow { + pair: PairData; +} + +interface GetOrdersPageRes { + success: true; + data: PageOrderData[]; +} + +export default GetOrdersPageRes; + +export type { PageOrderData, OrderDataWithPair }; diff --git a/src/interfaces/responses/orders/GetPairStatsRes.ts b/src/interfaces/responses/orders/GetPairStatsRes.ts new file mode 100644 index 0000000..6291f4d --- /dev/null +++ b/src/interfaces/responses/orders/GetPairStatsRes.ts @@ -0,0 +1,16 @@ +interface PairStats { + rate: number; + coefficient: number; + high: number; + low: number; + volume: number; +} + +interface GetPairStatsRes { + success: true; + data: PairStats; +} + +export default GetPairStatsRes; + +export type { PairStats }; diff --git a/src/interfaces/responses/orders/GetUserOrdersPageRes.ts b/src/interfaces/responses/orders/GetUserOrdersPageRes.ts new file mode 100644 index 0000000..732a67a --- /dev/null +++ b/src/interfaces/responses/orders/GetUserOrdersPageRes.ts @@ -0,0 +1,12 @@ +import ApplyTip from '@/interfaces/common/ApplyTip'; +import OrderRow from '@/interfaces/common/OrderRow'; + +interface GetUserOrdersPageRes { + success: true; + data: { + orders: OrderRow[]; + applyTips: ApplyTip[]; + }; +} + +export default GetUserOrdersPageRes; diff --git a/src/interfaces/responses/orders/GetUserOrdersRes.ts b/src/interfaces/responses/orders/GetUserOrdersRes.ts new file mode 100644 index 0000000..4ac61ac --- /dev/null +++ b/src/interfaces/responses/orders/GetUserOrdersRes.ts @@ -0,0 +1,27 @@ +import CurrencyRow from '@/interfaces/common/CurrencyRow'; +import OfferType from '@/interfaces/common/OfferType'; + +interface UserOrderData { + id: string; + type: OfferType; + timestamp: string; + side: string; + price: number; + amount: number; + total: number; + pair_id: string; + user_id: string; + status: string; + left: number; + first_currency: CurrencyRow; + second_currency: CurrencyRow; +} + +interface GetUserOrdersRes { + success: true; + data: UserOrderData[]; +} + +export default GetUserOrdersRes; + +export type { UserOrderData }; diff --git a/src/interfaces/responses/user/GetUserRes.ts b/src/interfaces/responses/user/GetUserRes.ts new file mode 100644 index 0000000..42c7cdb --- /dev/null +++ b/src/interfaces/responses/user/GetUserRes.ts @@ -0,0 +1,51 @@ +import UserRow from '@/interfaces/common/UserRow'; +import UserData from '@/interfaces/common/UserData'; +import CurrencyRow from '@/interfaces/common/CurrencyRow'; +import DepositState from '@/interfaces/common/DepositState'; +import OfferType from '@/interfaces/common/OfferType'; +import OfferData from '../offers/OfferData'; + +interface UserChatData { + id: string; + offer_number: string; + status: string; + pay: number; + receive: number; + owner_deposit: DepositState; + opponent_deposit: DepositState; + view_list: string[]; + creator_data: UserData; + buyer_data: UserData; + chat_history?: undefined; + favourite_currencies?: undefined; + user_id?: undefined; + buyer_id?: undefined; + input_currency: CurrencyRow; + target_currency: CurrencyRow; + deposit_currency: CurrencyRow; + price: number; + min: number; + max: number; + deposit_seller: number; + deposit_buyer: number; + type: OfferType; + comment: string | null; + number: string; + offer_status: string; + timestamp: string; +} + +type GetUserResData = UserRow & { + offers: OfferData[]; + chats: UserChatData[]; + exchange_notifications: number; +}; + +interface GetUserRes { + success: true; + data: GetUserResData; +} + +export default GetUserRes; + +export type { UserChatData, GetUserResData }; diff --git a/src/interfaces/states/FiltersState.ts b/src/interfaces/states/FiltersState.ts new file mode 100644 index 0000000..36e34f7 --- /dev/null +++ b/src/interfaces/states/FiltersState.ts @@ -0,0 +1,10 @@ +import CurrencyRow from '../common/CurrencyRow'; + +interface FiltersState { + buyState: boolean; + price: string; + inputCurrency: CurrencyRow | null; + targetCurrency: CurrencyRow | null; +} + +export default FiltersState; diff --git a/src/interfaces/states/pages/dex/trading/CandleChart/CandlesData.ts b/src/interfaces/states/pages/dex/trading/CandleChart/CandlesData.ts new file mode 100644 index 0000000..8185eb9 --- /dev/null +++ b/src/interfaces/states/pages/dex/trading/CandleChart/CandlesData.ts @@ -0,0 +1,11 @@ +interface CandlesData { + start: number; + body: { + blockFirst?: number; + blockSecond?: number; + lineFirst?: number; + lineSecond?: number; + }[]; +} + +export default CandlesData; diff --git a/src/interfaces/states/pages/dex/trading/InputPanelItem/PeriodState.ts b/src/interfaces/states/pages/dex/trading/InputPanelItem/PeriodState.ts new file mode 100644 index 0000000..0c75576 --- /dev/null +++ b/src/interfaces/states/pages/dex/trading/InputPanelItem/PeriodState.ts @@ -0,0 +1,8 @@ +import Period from '@/interfaces/common/Period'; + +interface PeriodState { + name: string; + code: Period; +} + +export default PeriodState; diff --git a/src/interfaces/states/pages/dex/trading/InputPanelItem/SelectValue.ts b/src/interfaces/states/pages/dex/trading/InputPanelItem/SelectValue.ts new file mode 100644 index 0000000..1e6cec0 --- /dev/null +++ b/src/interfaces/states/pages/dex/trading/InputPanelItem/SelectValue.ts @@ -0,0 +1,5 @@ +type SelectValue = { + name: string; + code: string; +}; +export default SelectValue; diff --git a/src/interfaces/states/pages/p2p/profile/CategoriesState.ts b/src/interfaces/states/pages/p2p/profile/CategoriesState.ts new file mode 100644 index 0000000..cdb9cec --- /dev/null +++ b/src/interfaces/states/pages/p2p/profile/CategoriesState.ts @@ -0,0 +1,13 @@ +import HorizontalSelectValue from '@/interfaces/common/HorizontalSelectValue'; + +type CategoriesCode = 'my-offers' | 'chats' | 'active' | 'finished'; + +interface CategoriesState extends HorizontalSelectValue { + notifications: number; + name: 'My offers' | 'Chats' | 'Active' | 'Finished'; + code: CategoriesCode; +} + +export default CategoriesState; + +export { type CategoriesCode }; diff --git a/src/interfaces/states/pages/p2p/profile/FiltersState.ts b/src/interfaces/states/pages/p2p/profile/FiltersState.ts new file mode 100644 index 0000000..3d5132b --- /dev/null +++ b/src/interfaces/states/pages/p2p/profile/FiltersState.ts @@ -0,0 +1,12 @@ +import DateState from '@/interfaces/common/DateState'; + +type BuySell = 'Buy & Sell' | 'Buy' | 'Sell'; + +interface FiltersState { + buySell: BuySell; + date: DateState; +} + +export default FiltersState; + +export type { BuySell }; diff --git a/src/interfaces/states/pages/p2p/profile/OffersState.ts b/src/interfaces/states/pages/p2p/profile/OffersState.ts new file mode 100644 index 0000000..35b0899 --- /dev/null +++ b/src/interfaces/states/pages/p2p/profile/OffersState.ts @@ -0,0 +1,6 @@ +import OfferData from '@/interfaces/responses/offers/OfferData'; +import { UserChatData } from '@/interfaces/responses/user/GetUserRes'; + +type OffersStateElement = OfferData | (UserChatData & { alias: string; address: string }); + +export default OffersStateElement; diff --git a/src/interfaces/wallet/IonicSwap.ts b/src/interfaces/wallet/IonicSwap.ts new file mode 100644 index 0000000..83c2bc1 --- /dev/null +++ b/src/interfaces/wallet/IonicSwap.ts @@ -0,0 +1,9 @@ +interface IonicSwap { + destinationAssetID: string; + destinationAssetAmount: string; + currentAssetID: string; + currentAssetAmount: string; + destinationAddress: string; +} + +export default IonicSwap; diff --git a/src/pages/404.tsx b/src/pages/404.tsx new file mode 100644 index 0000000..ccb728f --- /dev/null +++ b/src/pages/404.tsx @@ -0,0 +1,11 @@ +import styles from '../styles/404.module.scss'; + +function NotFound() { + return ( +
+

404 | Not found

+
+ ); +} + +export default NotFound; diff --git a/src/pages/NotificationPopups.tsx b/src/pages/NotificationPopups.tsx new file mode 100644 index 0000000..72f0c0a --- /dev/null +++ b/src/pages/NotificationPopups.tsx @@ -0,0 +1,75 @@ +import { OrderDataWithPair } from '@/interfaces/responses/orders/GetOrdersPageRes'; +import { Store } from '@/store/store-reducer'; +import socket from '@/utils/socket'; +import { useContext, useEffect, useState } from 'react'; +import styles from '@/styles/NotificationPopups.module.scss'; +import OrderNotification from '@/components/default/OrderNotification/OrderNotification'; +import { nanoid } from 'nanoid'; +import { updateAutoClosedNotification } from '@/store/actions'; + +export default function NotificationPopups() { + const { state, dispatch } = useContext(Store); + + const [notificationOrders, setNotificationOrders] = useState([]); + + useEffect(() => { + const token = sessionStorage.getItem('token'); + + if (token) { + socket.emit('in-dex-notifications', { token }); + + return () => { + socket.emit('out-dex-notifications', { token }); + }; + } + }, [state.user?.address]); + + useEffect(() => { + function onNotify({ orderData }: { orderData: OrderDataWithPair }) { + setNotificationOrders((prev) => [orderData, ...prev].slice(0, 2)); + } + + function onCancel(data: { orderId: number }) { + console.log('cancel', data.orderId, notificationOrders); + + setNotificationOrders((prev) => { + console.log(prev, data.orderId); + + return prev.filter((e) => parseInt(e.id, 10) !== data.orderId); + }); + } + + socket.on('order-notification', onNotify); + socket.on('order-notification-cancelation', onCancel); + + if (state.closed_notifications.length > 0) { + for (const notificationID of state.closed_notifications) { + onCancel({ orderId: notificationID }); + } + + console.log('Closed notifications:', state.closed_notifications); + + updateAutoClosedNotification(dispatch, []); + } + + return () => { + socket.off('order-notification', onNotify); + socket.off('order-notification-cancelation', onCancel); + }; + }, [dispatch, state.user, notificationOrders, state.closed_notifications]); + + return ( + <> +
+ {notificationOrders.map((e, i) => ( + + ))} +
+ + ); +} diff --git a/src/pages/PageHandler.tsx b/src/pages/PageHandler.tsx new file mode 100644 index 0000000..f463dce --- /dev/null +++ b/src/pages/PageHandler.tsx @@ -0,0 +1,91 @@ +import { useContext, useEffect } from 'react'; +import useUpdateUser from '@/hook/useUpdateUser'; +import { Store } from '@/store/store-reducer'; +import { updateAssetsRate, updateConfig } from '@/store/actions'; +import { useRouter } from 'next/router'; +import socket from '@/utils/socket'; +import { GetConfigResData } from '@/interfaces/responses/config/GetConfigRes'; +import { getZanoPrice } from '@/utils/methods'; +import { ZANO_ASSET_ID } from '@/utils/utils'; + +function PageHandler(props: { config: GetConfigResData }) { + const { state, dispatch } = useContext(Store); + const fetchUser = useUpdateUser(); + const router = useRouter(); + + useEffect(() => { + async function authUser() { + if (state.user?.address) return; + + const user = await fetchUser(); + if (user) return; + + if ( + ['/profile', '/process'].includes(`/${router.route.split('/')[2]}`) && + !state.wallet?.connected + ) { + router.push('/p2p'); + } + } + + authUser(); + }, [state.wallet?.connected, router.route]); + + useEffect(() => { + console.log(state); + if (state.user?.id) { + socket.emit('in-account', { + id: state.user?.id, + }); + + socket.on('refresh-request', () => { + fetchUser(); + }); + } + + return () => { + socket.off('refresh-request'); + }; + }, [state.user?.id]); + + useEffect(() => { + if (Object.keys(state.config || {}).length === 0) { + updateConfig(dispatch, props.config); + } + }, []); + + useEffect(() => { + async function fetchAssetsRate() { + let result; + + try { + result = await getZanoPrice(); + } catch { + return; + } + + const zanoUsd = result?.data?.usd; + + if (!result?.success || typeof zanoUsd !== 'number') return; + + const assetsRates = new Map(); + assetsRates.set(ZANO_ASSET_ID, zanoUsd); + + updateAssetsRate(dispatch, assetsRates); + } + + fetchAssetsRate(); + + const intervalId = setInterval(async () => { + await fetchAssetsRate(); + }, 20e3); + + return () => { + clearInterval(intervalId); + }; + }, [dispatch]); + + return <>; +} + +export default PageHandler; diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx new file mode 100644 index 0000000..4f00b40 --- /dev/null +++ b/src/pages/_app.tsx @@ -0,0 +1,85 @@ +import '@/styles/globals.scss'; +import '@/styles/themes/light.scss'; +import Head from 'next/head'; +import { StoreProvider } from '@/store/store-reducer'; +import NextApp, { AppContext, AppProps } from 'next/app'; +import { ThemeProvider } from 'next-themes'; +import GetConfigRes, { GetConfigResData } from '@/interfaces/responses/config/GetConfigRes'; +import inter from '@/utils/font'; +import PageHandler from './PageHandler'; +import NotificationPopups from './NotificationPopups'; + +function App(data: AppProps & { config?: GetConfigResData }) { + const { Component, pageProps } = data; + return ( + <> + + + Zano Trade + + + + + + + + + + + + + + + + + + + + + + + + + ); +} + +App.getInitialProps = async (context: AppContext) => { + try { + const pageProps = await NextApp.getInitialProps(context); + if (!context.ctx.req) return pageProps; + + const { host } = context.ctx.req.headers; + const configData = (await fetch(`http://${host}/api/config`).then((res) => + res.json(), + )) as GetConfigRes; + + return { + ...pageProps, + config: configData.data, + }; + } catch (error) { + console.log( + `Unable to fetch config data from http://${context?.ctx?.req?.headers?.host}/api/config`, + ); + console.log(error); + + return NextApp.getInitialProps(context); + } +}; + +export default App; diff --git a/src/pages/_document.js b/src/pages/_document.js new file mode 100644 index 0000000..7620299 --- /dev/null +++ b/src/pages/_document.js @@ -0,0 +1,15 @@ +import { Html, Head, Main, NextScript } from 'next/document'; + +function Document() { + return ( + + + +
+ + + + ); +} + +export default Document; diff --git a/src/pages/admin/Admins.tsx b/src/pages/admin/Admins.tsx new file mode 100644 index 0000000..86e784e --- /dev/null +++ b/src/pages/admin/Admins.tsx @@ -0,0 +1,80 @@ +import React from 'react'; +import { Table, Button, Form, Input, FormInstance } from 'antd'; +import { ColumnsType } from 'antd/es/table'; +import styles from './styles.module.scss'; + +interface Admin { + alias: string; + isOwner: boolean; + key: number; +} + +interface AdminsProps { + admins: Admin[]; + removeAdmin: (_key: number) => void; + addAdmin: (_values: { alias: string }) => void; + form: FormInstance; +} + +const Admins: React.FC = ({ admins, removeAdmin, addAdmin, form }) => { + const columns: ColumnsType = [ + { + title: 'Alias', + dataIndex: 'alias', + key: 'alias', + }, + { + title: 'Is Owner', + dataIndex: 'isOwner', + key: 'isOwner', + render: (text) => (text ? 'Owner' : 'Admin'), + }, + { + title: 'Action', + key: 'action', + render: (_, record) => ( + + ), + }, + ]; + + return ( +
+

Admins

+
+
+ + + + + + +
+
+ + + + ); +}; + +export default Admins; diff --git a/src/pages/admin/FeaturedPairs.tsx b/src/pages/admin/FeaturedPairs.tsx new file mode 100644 index 0000000..ed27624 --- /dev/null +++ b/src/pages/admin/FeaturedPairs.tsx @@ -0,0 +1,77 @@ +import React from 'react'; +import { Table, Button, Input, Form, FormInstance } from 'antd'; +import { ColumnsType } from 'antd/es/table'; +import styles from './styles.module.scss'; + +interface FeaturedPair { + name: string; + key: number; +} + +interface FeaturedPairsProps { + featuredPairs: FeaturedPair[]; + form: FormInstance; + addFeaturedPair: (_values: { asset_id: string }) => void; + removeFeaturedPair: (_key: number) => void; +} + +const FeaturedPairs: React.FC = ({ + featuredPairs, + form, + addFeaturedPair, + removeFeaturedPair, +}) => { + const columns: ColumnsType = [ + { + title: 'Name', + dataIndex: 'name', + key: 'name', + }, + { + title: 'Action', + key: 'action', + render: (_, record) => ( + + ), + }, + ]; + + return ( +
+

Featured pairs

+
+
+ + + + + + + +
+ +
+ + ); +}; + +export default FeaturedPairs; diff --git a/src/pages/admin/PairStats.tsx b/src/pages/admin/PairStats.tsx new file mode 100644 index 0000000..0690f82 --- /dev/null +++ b/src/pages/admin/PairStats.tsx @@ -0,0 +1,101 @@ +import React from 'react'; +import { Button, Input, Spin, Typography, Checkbox } from 'antd'; +import DateRangeSelector from '@/components/UI/DateRangeSelector/DateRangeSelector'; +import styles from './styles.module.scss'; + +interface DateState { + first: Date | null; + last: Date | null; +} + +interface PairStatsProps { + loading: boolean; + volumeStats: number | null; + selectedAddress: string; + setSelectedAddress: React.Dispatch>; + selectedPairID: string; + setSelectedPairID: React.Dispatch>; + allDates: boolean; + setAllDates: React.Dispatch>; + dateRange: DateState; + setDateRange: React.Dispatch>; + fetchVolumeStats: () => void; +} + +const PairStats: React.FC = ({ + loading, + volumeStats, + selectedAddress, + setSelectedAddress, + selectedPairID, + setSelectedPairID, + allDates, + setAllDates, + dateRange, + setDateRange, + fetchVolumeStats, +}) => ( +
+
+ setSelectedAddress(e.target.value)} + /> + setSelectedPairID(e.target.value)} + /> +
+ +
+
+ +
+ + + +
+ + {volumeStats !== null && ( + + {JSON.stringify(volumeStats, null, 2)} + + )} +
+); + +export default PairStats; diff --git a/src/pages/admin/index.tsx b/src/pages/admin/index.tsx new file mode 100644 index 0000000..1d4c4e8 --- /dev/null +++ b/src/pages/admin/index.tsx @@ -0,0 +1,352 @@ +import { useContext, useEffect, useState } from 'react'; +import { Form, message, Spin } from 'antd'; +import axios from 'axios'; +import Header from '@/components/default/Header/Header'; +import PageTitle from '@/components/default/PageTitle/PageTitle'; + +import ConnectButton from '@/components/UI/ConnectButton/ConnectButton'; +import { Store } from '@/store/store-reducer'; +import styles from './styles.module.scss'; +import PairStats from './PairStats'; +import FeaturedPairs from './FeaturedPairs'; +import Admins from './Admins'; + +interface FeaturedPair { + name: string; + key: number; +} + +interface Admin { + alias: string; + isOwner: boolean; + key: number; +} + +interface DateState { + first: Date | null; + last: Date | null; +} + +interface CurrencyType { + name: string; +} + +interface PairType { + id: string | number; + first_currency: CurrencyType; +} + +const AdminPanel: React.FC = () => { + const [accessAllowed, setAccessAllowed] = useState(null); + const { state } = useContext(Store); + + const [form] = Form.useForm(); + const [adminForm] = Form.useForm(); + const [featuredPairs, setFeaturedPairs] = useState([]); + const [admins, setAdmins] = useState([]); + const [selectedAddress, setSelectedAddress] = useState(''); + const [selectedPairID, setSelectedPairID] = useState(''); + const [dateRange, setDateRange] = useState({ first: null, last: null }); + const [loading, setLoading] = useState(false); + const [volumeStats, setVolumeStats] = useState(null); + const [allDates, setAllDates] = useState(false); + + const fetchFeaturedPairs = async () => { + try { + const response = await axios.post('/api/admin/get-featured', { + token: sessionStorage.getItem('token'), + }); + if (response.data.success) { + setFeaturedPairs( + response.data.data.map((pair: PairType) => ({ + name: pair.first_currency.name, + key: pair.id, + })), + ); + } else { + message.error('Error fetching featured pairs'); + } + } catch (error) { + message.error('Error fetching featured pairs'); + } + }; + + const fetchAdmins = async () => { + try { + const response = await axios.post('/api/admin/get-admins', { + token: sessionStorage.getItem('token'), + }); + if (response.data.success) { + const fetchedAdmins = response.data.data; + setAdmins( + fetchedAdmins.map((admin: {alias: string, isOwner: boolean, id: string}) => ({ + alias: admin.alias, + isOwner: admin.isOwner, + key: admin.id, + })), + ); + } else { + message.error({ + content: 'Failed to fetch admins', + className: styles.message, + }); + } + } catch (error) { + message.error({ + content: 'Error fetching admins', + className: styles.message, + }); + } + }; + + // Add featured pair to the backend + const addFeaturedPair = async (values: { asset_id: string }) => { + try { + const response = await axios.post('/api/admin/add-featured', { + asset_id: values.asset_id, + token: sessionStorage.getItem('token'), + }); + + if (response.data.success) { + fetchFeaturedPairs(); + message.success({ + content: 'Pair added to featured', + className: styles.message, + }); + form.resetFields(); + } else { + message.error({ + content: response.data.message, + className: styles.message, + }); + } + } catch (error) { + message.error('Error adding featured pair'); + } + }; + + // Remove featured pair from the backend + const removeFeaturedPair = async (key: number) => { + try { + const pairToRemove = featuredPairs.find((pair) => pair.key === key); + if (pairToRemove) { + const response = await axios.post('/api/admin/delete-featured', { + token: sessionStorage.getItem('token'), + id: pairToRemove.key, + }); + + if (response.data.success) { + fetchFeaturedPairs(); + message.success({ + content: 'Pair removed from featured', + className: styles.message, + }); + } else { + message.error({ + content: response.data.message, + className: styles.message, + }); + } + } + } catch (error) { + message.error('Error removing featured pair'); + } + }; + + useEffect(() => { + if (!accessAllowed) { + return; + } + + fetchAdmins(); + fetchFeaturedPairs(); + }, [accessAllowed]); + + // Add Admin function + const addAdmin = async (values: { alias: string }) => { + try { + if (admins.some((admin) => admin.alias === values.alias)) { + return message.error({ + content: 'Admin already exists', + className: styles.message, + }); + } + + const { data } = await axios.post('/api/admin/add-admin', { + alias: values.alias, + token: sessionStorage.getItem('token'), + }); + + message[data.success ? 'success' : 'error']({ + content: data.success ? 'Admin added successfully' : data.message, + className: styles.message, + }); + + if (data.success) { + fetchAdmins(); + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } catch (error: any) { + message.error({ + content: + error.response?.status === 401 + ? 'Unauthorized: Please log in.' + : 'Error adding admin', + className: styles.message, + }); + console.log(error); + } finally { + adminForm.resetFields(); + } + }; + + // Remove Admin function + const removeAdmin = async (key: number) => { + const adminToRemove = admins.find((admin) => admin.key === key); + if (adminToRemove && adminToRemove.isOwner) { + return; + } + + try { + const response = await axios.post('/api/admin/delete-admin', { + token: sessionStorage.getItem('token'), + id: key, + }); + + if (response.data.success) { + await fetchAdmins(); + message.success({ + content: 'Admin deleted successfully', + className: styles.message, + }); + } else { + message.error({ + content: response.data.message, + className: styles.message, + }); + } + } catch (error) { + message.error({ + content: 'Error deleting admin', + className: styles.message, + }); + } + }; + + const fetchVolumeStats = async () => { + if ( + !selectedAddress || + !selectedPairID || + (allDates ? false : !dateRange.first || !dateRange.last) + ) { + message.error({ + content: 'Please fill in all fields to fetch volume stats', + className: styles.message, + }); + return; + } + + setLoading(true); + try { + const response = await axios.post('/api/dex/volume-stats', { + address: selectedAddress, + pairID: selectedPairID, + from: allDates ? 0 : dateRange?.first?.getTime(), + to: allDates ? 999999999999999 : dateRange?.last?.getTime(), + }); + + setVolumeStats(response.data); + + message.success({ + content: 'Volume stats fetched successfully!', + className: styles.message, + }); + } catch (error) { + console.error(error); + message.error({ + content: 'Failed to fetch volume stats. Please try again', + className: styles.message, + }); + } finally { + setLoading(false); + } + }; + + useEffect(() => { + if (!state?.wallet?.alias) { + return; + } + + axios + .post('/api/admin/check-admin', { + token: sessionStorage.getItem('token'), + }) + .then(async (res) => { + await new Promise((resolve) => setTimeout(resolve, 500)); + setAccessAllowed(res?.data?.success); + }) + .catch((err) => { + console.error(err); + setAccessAllowed(false); + }); + }, [state?.wallet?.alias]); + + if (!state?.wallet?.alias) { + return ( +
+ +
+ ); + } + + if (!accessAllowed) { + return ( + <> +
+
+ + + ); + } + + return ( + <> +
+
+
+ +

Admin panel

+
+ + + + +
+
+ + ); +}; + +export default AdminPanel; diff --git a/src/pages/admin/styles.module.scss b/src/pages/admin/styles.module.scss new file mode 100644 index 0000000..c068c90 --- /dev/null +++ b/src/pages/admin/styles.module.scss @@ -0,0 +1,136 @@ +.admin__connect { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +} + +.admin { + padding: 40px; + + display: flex; + flex-direction: column; + align-items: center; + + > div { + width: 1400px; + } + + &__subtitle { + margin-top: 40px; + font-size: 32px; + font-weight: 600; + } + + &__form { + margin-top: 20px; + display: flex; + align-items: center; + justify-content: space-between; + + &_input { + width: 500px; + height: 50px; + background: var(--dropdown-bg-color) !important; + color: var(--font-main-color); + border-color: transparent; + + &::placeholder { + color: var(--font-dimmed-color); + } + + &:focus { + background-color: var(--dropdown-bg-color); + } + } + + &_btn { + height: 50px; + width: 200px; + + span { + color: #fff; + } + } + } + + &__table { + margin-top: 20px; + + * { + border-color: var(--admin-table-border-color) !important; + } + + tbody div { + color: var(--font-main-color) !important; + } + + th, + td { + background-color: var(--dropdown-bg-color) !important; + color: var(--font-main-color) !important; + } + + &_btn { + span { + color: #ffffff; + } + } + } + + &__volume { + margin-top: 20px; + + input { + font-size: 16px; + } + + &_form { + margin: 20px 0; + display: flex; + align-items: center; + justify-content: space-between; + gap: 20px; + } + + &_input { + width: 100%; + } + + &_range { + width: 100%; + + &__date { + height: 50px !important; + } + } + + &_btns { + display: flex; + align-items: center; + justify-content: space-between; + + .allDates { + cursor: pointer; + } + } + } +} + +.message { + > div { + background: var(--window-bg-color) !important; + } +} + +.modal { + button span { + color: #000000 !important; + } + + button:last-child { + span { + color: #ffffff !important; + } + } +} diff --git a/src/pages/dex/DexHeader/DexHeader.tsx b/src/pages/dex/DexHeader/DexHeader.tsx new file mode 100644 index 0000000..d996307 --- /dev/null +++ b/src/pages/dex/DexHeader/DexHeader.tsx @@ -0,0 +1,181 @@ +import React, { Dispatch, SetStateAction, useCallback, useState } from 'react'; +import styles from '@/styles/Dex.module.scss'; +import { ReactComponent as SearchLogo } from '@/assets/images/UI/search_icon.svg'; +import { ReactComponent as RefreshIcon } from '@/assets/images/UI/refrash_small_icon.svg'; +import { ReactComponent as InfoSmallIcon } from '@/assets/images/UI/info_outlined.svg'; +import { ReactComponent as DropdownArrowIcon } from '@/assets/images/UI/dropdown_arrow_small.svg'; +import { ReactComponent as FilterIcon } from '@/assets/images/UI/filter_icon.svg'; +import Input from '@/components/UI/Input/Input'; +import { Switch } from '@/components/UI/Switch/Switch'; +import { IconDropdown } from '@/components/UI/IconDropdown/IconDropdown'; +import Dropdown from '@/components/UI/Dropdown/Dropdown'; +import { getPairsPagesAmount } from '@/utils/methods'; +import PairData from '@/interfaces/common/PairData'; +import { PairSortOption } from '@/interfaces/enum/pair'; + +interface IProps { + pairInputState: string; + whitelistedOnly: boolean; + setWhitelistedOnly: Dispatch>; + setPairInputState: Dispatch>; + setLoadedState: Dispatch>; + setPairs: Dispatch>; + setShouldUpdatePairSearch: Dispatch>; + setCurrentPage: Dispatch>; + sortOption: PairSortOption; + setSortOption: Dispatch>; + fetchPairs(): Promise; +} + +const SORT_OPTION = { + VOLUME: { + LOW_TO_HIGH: 'Volume: Low to High', + HIGH_TO_LOW: 'Volume: High to Low', + }, +}; + +const sortOptions = [ + { name: SORT_OPTION.VOLUME.LOW_TO_HIGH, value: PairSortOption.VOLUME_LOW_TO_HIGH }, + { name: SORT_OPTION.VOLUME.HIGH_TO_LOW, value: PairSortOption.VOLUME_HIGH_TO_LOW }, +]; + +function DexHeader({ + pairInputState, + whitelistedOnly, + setWhitelistedOnly, + setCurrentPage, + setShouldUpdatePairSearch, + setPairInputState, + setPairs, + setLoadedState, + setSortOption, + sortOption, + fetchPairs, +}: IProps) { + const [isRefetching, setIsRefetching] = useState(false); + + const updatePairsSearch = useCallback((_pairInputState: string, _whitelistedOnly: boolean) => { + setLoadedState(false); + setPairs([]); + setCurrentPage(1); + setShouldUpdatePairSearch(true); + }, []); + + const handleClickRefetch = async () => { + setIsRefetching(true); + + try { + setCurrentPage(1); + await fetchPairs(); + await getPairsPagesAmount(pairInputState, whitelistedOnly); + } catch (e) { + console.error('Refetch failed:', e); + } finally { + setIsRefetching(false); + setLoadedState(true); + } + }; + + const handleClickSwitch = () => { + const currentState = localStorage.getItem('all_pairs'); + + if (currentState === 'false') { + localStorage.setItem('all_pairs', `true`); + } + + if (currentState === 'true' || !currentState) { + localStorage.setItem('all_pairs', `false`); + } + + setWhitelistedOnly(!whitelistedOnly); + updatePairsSearch(pairInputState, !whitelistedOnly); + }; + + const handleSortChange = (option: PairSortOption) => { + setSortOption(option); + handleClickRefetch(); + }; + + return ( +
+
+
+
+
+ + { + const newInput = e.target.value; + setPairInputState(newInput); + updatePairsSearch(newInput, whitelistedOnly); + }} + /> +
+
+ +
+ +

All pairs

+ +
+
+ +
+ ({ + name: option.name, + value: option.value, + }))} + value={{ + name: sortOptions.find((o) => o.value === sortOption)?.name || '', + }} + setValue={(val) => handleSortChange(val.value as PairSortOption)} + icon={} + className={styles.sort_dropdown} + selfContained + /> + + +
+ + handleSortChange(PairSortOption.VOLUME_LOW_TO_HIGH), + }, + { + content: SORT_OPTION.VOLUME.HIGH_TO_LOW, + onClick: () => handleSortChange(PairSortOption.VOLUME_HIGH_TO_LOW), + }, + ]} + > +
+ +
+
+
+ +
+
+ +

All pairs

+ +
+
+
+ ); +} + +export default DexHeader; diff --git a/src/pages/dex/index.tsx b/src/pages/dex/index.tsx new file mode 100644 index 0000000..bd54072 --- /dev/null +++ b/src/pages/dex/index.tsx @@ -0,0 +1,165 @@ +import styles from '@/styles/Dex.module.scss'; +import Footer from '@/components/default/Footer/Footer'; +import Header from '@/components/default/Header/Header'; +import { ReactComponent as HistoryIcon } from '@/assets/images/UI/history_icon.svg'; +import { useEffect, useRef, useState } from 'react'; +import Button from '@/components/UI/Button/Button'; +import Link from 'next/link'; +import { nanoid } from 'nanoid'; +import MainPageTitle from '@/components/default/MainPageTitle/MainPageTitle'; +import { getPairsPage, getPairsPagesAmount } from '@/utils/methods'; +import ContentPreloader from '@/components/UI/ContentPreloader/ContentPreloader'; +import PairData from '@/interfaces/common/PairData'; +import { useInView } from 'react-intersection-observer'; +import Preloader from '@/components/UI/Preloader/Preloader'; +import { PairSortOption } from '@/interfaces/enum/pair'; +import PairsTable from './pairs/PairsTable/PairsTable'; +import DexHeader from './DexHeader/DexHeader'; +import PairsList from './pairs/PairsList/PairsList'; + +function Dex() { + const fetchIdRef = useRef(nanoid()); + const bottomInView = useRef(false); + + const [pairInputState, setPairInputState] = useState(''); + const [pairs, setPairs] = useState([]); + const [allLoaded, setLoadedState] = useState(false); + const [pagesAmount, setPagesAmount] = useState(); + const [pageLoading, setPageLoading] = useState(false); + const [currentPage, setCurrentPage] = useState(1); + const [whitelistedOnly, setWhitelistedOnly] = useState(true); + const [shouldUpdatePairSearch, setShouldUpdatePairSearch] = useState(true); + const [sortOption, setSortOption] = useState(PairSortOption.VOLUME_HIGH_TO_LOW); + + const { ref: inViewRef, inView } = useInView({ + threshold: 0, + }); + + useEffect(() => { + if (typeof window !== undefined) { + const currentState = localStorage.getItem('all_pairs') ?? ''; + + if (currentState === '' || currentState === 'true') { + setWhitelistedOnly(true); + return; + } + + if (currentState === 'false') { + setWhitelistedOnly(false); + } + } + }, []); + + useEffect(() => { + if (!shouldUpdatePairSearch) return; + getPairsPagesAmount(pairInputState, whitelistedOnly) + .then((result) => { + if (!result.success) throw new Error('Error fetch pages amount'); + setPagesAmount(result.data); + }) + .catch((e) => { + console.error(e); + setPagesAmount((prev) => prev && 1); + }); + }, [pairInputState, whitelistedOnly, shouldUpdatePairSearch]); + + async function fetchPairs() { + const initial = currentPage === 1; + + if (initial) { + setLoadedState(false); + setPageLoading(false); + } else { + setPageLoading(true); + setLoadedState(true); + } + + const newFetchId = nanoid(); + fetchIdRef.current = newFetchId; + const result = await getPairsPage(currentPage, pairInputState, whitelistedOnly, sortOption); + + const fetchId = fetchIdRef.current; + if (fetchId !== newFetchId) return; + if (!result.success) return; + + if (initial) { + setPairs(result.data); + } else { + setPairs((prev) => [ + ...prev, + ...result.data.filter((e) => !prev.some((prevEl) => prevEl.id === e.id)), + ]); + } + + if (initial) { + setLoadedState(true); + } else { + setPageLoading(false); + } + + if (bottomInView.current && pagesAmount && currentPage < pagesAmount) { + setCurrentPage((prev) => prev + 1); + } + } + + useEffect(() => { + fetchPairs(); + }, [currentPage, pairInputState, whitelistedOnly, pagesAmount, sortOption]); + + useEffect(() => { + if (inView && allLoaded && !pageLoading && pagesAmount && currentPage < pagesAmount) { + setCurrentPage((prev) => prev + 1); + } + }, [inView, allLoaded, pageLoading, pagesAmount, currentPage]); + + return ( + <> +
+
+ + + + + + +
+ + {allLoaded ? ( + <> + + + + ) : ( + + )} +
{pageLoading && }
+
+
+
+ + ); +} + +export default Dex; diff --git a/src/pages/dex/orders/OrdersTable/OrdersTable.module.scss b/src/pages/dex/orders/OrdersTable/OrdersTable.module.scss new file mode 100644 index 0000000..63b1ac4 --- /dev/null +++ b/src/pages/dex/orders/OrdersTable/OrdersTable.module.scss @@ -0,0 +1,247 @@ +.table { + display: flex; + flex-direction: column; + + > thead { + width: 100%; + + > tr { + width: 100%; + padding: 10px 20px; + display: flex; + background-color: var(--table-thead-bg); + border-top-left-radius: 10px; + border-top-right-radius: 10px; + + > th { + width: 100%; + text-align: start; + + @media screen and (max-width: 1600px) { + &:first-child { + max-width: 140px; + } + + &:nth-child(4) { + max-width: 120px; + } + } + + a { + font-weight: 700; + font-size: 14px; + color: var(--table-th-color); + } + } + } + } + + > tbody { + width: 100%; + + > tr { + width: 100%; + padding: 20px; + display: flex; + gap: 20px; + border-bottom: 1px solid var(--delimiter-color); + background-color: var(--table-tbody-bg); + + &:last-child { + border-bottom: none; + border-bottom-left-radius: 10px; + border-bottom-right-radius: 10px; + } + + > td { + min-width: 0; + width: 100%; + display: flex; + align-items: center; + position: relative; + margin-left: -20px; + + &:first-child { + margin-left: 0; + } + + .table__tooltip { + position: absolute; + top: calc(100% + 5px); + left: 50%; + transform: translateX(-50%); + } + + > p { + width: 100%; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + + .price { + display: block; + margin-top: 6px; + opacity: 70%; + font-weight: 400; + font-size: 14px; + } + } + + @media screen and (max-width: 1600px) { + &:first-child { + max-width: 140px; + } + + &:nth-child(4) { + max-width: 120px; + } + } + + .type__marker { + width: 58px; + height: 30px; + border: 2px solid white; + border-radius: 50px; + display: flex; + align-items: center; + justify-content: center; + + h6 { + font-size: 14px; + font-weight: 400; + } + + &.marker__buy { + border-color: #16d1d6; + + h6 { + color: #16d1d6; + } + } + + &.marker__sell { + border-color: #ff6767; + + h6 { + color: #ff6767; + } + } + } + + .delete__button { + height: 54px; + width: 54px; + padding: 0; + background: var(--dimmed-btn-bg); + + &:hover { + background: var(--dimmed-btn-hover); + } + } + + .table__header__mobile { + display: none; + } + + &.table__delete { + justify-content: flex-end; + } + } + } + } + + @media screen and (max-width: 1500px) { + > thead { + display: none; + + td { + max-width: none !important; + } + } + + > tbody { + > tr { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + gap: 20px; + position: relative; + + &:first-child { + border-top-left-radius: 10px; + border-top-right-radius: 10px; + } + + > td { + margin-left: 0; + width: auto; + flex-direction: column; + align-items: flex-start; + max-width: none !important; + gap: 15px; + + .table__header__mobile { + display: block; + color: var(--font-dimmed-color); + font-weight: 700; + } + + &:first-child { + width: 100%; + } + + &:nth-child(2) { + width: auto; + position: absolute; + left: 140px; + + p { + text-align: center; + } + + @media screen and (max-width: 400px) { + left: 120px; + } + + @media screen and (max-width: 350px) { + left: 100px; + } + } + + &.table__delete { + width: auto; + position: absolute; + right: 20px; + + button { + height: 40px !important; + width: 40px !important; + + img { + scale: 0.8; + } + } + } + + h6 { + color: var(--font-dimmed-color); + } + } + } + } + } +} + +.orders__table__message { + width: 100%; + height: 500px; + display: flex; + flex-direction: column; + gap: 20px; + justify-content: center; + align-items: center; + + p { + color: var(--font-dimmed-color); + } +} diff --git a/src/pages/dex/orders/OrdersTable/OrdersTable.tsx b/src/pages/dex/orders/OrdersTable/OrdersTable.tsx new file mode 100644 index 0000000..4406de9 --- /dev/null +++ b/src/pages/dex/orders/OrdersTable/OrdersTable.tsx @@ -0,0 +1,209 @@ +import { nanoid } from 'nanoid'; +import Button from '@/components/UI/Button/Button'; +import { ReactComponent as DeleteIcon } from '@/assets/images/UI/delete.svg'; +import { ReactComponent as NoOffersIcon } from '@/assets/images/UI/no_offers.svg'; +import EmptyLink from '@/components/UI/EmptyLink/EmptyLink'; +import { notationToString, toStandardDateString } from '@/utils/utils'; +import { cancelOrder, getUserOrders, } from '@/utils/methods'; +import OrdersTableProps from '@/interfaces/props/pages/dex/orders/OrdersTable/OrdersTableProps'; +import { UserOrderData } from '@/interfaces/responses/orders/GetUserOrdersRes'; +import Decimal from 'decimal.js'; +import Tooltip from '@/components/UI/Tooltip/Tooltip'; +import { useState } from 'react'; +import styles from './OrdersTable.module.scss'; + +function OrdersTable(props: OrdersTableProps) { + const orders = props.value || []; + + const { setAlertState, setAlertSubtitle, setOrders, category } = props; + + const isActive = category === 'active-orders'; + + function Row(props: { orderData: UserOrderData }) { + const { orderData } = props; + + const firstCurrencyName = orderData?.first_currency?.name || ''; + const secondCurrencyName = orderData?.second_currency?.name || ''; + + const timestampDate = new Date(parseInt(orderData.timestamp, 10)); + + async function deleteOrder() { + setAlertState('loading'); + setAlertSubtitle('Canceling order...'); + const result = await cancelOrder(orderData.id); + + if (result.success) { + setAlertState('success'); + setAlertSubtitle('Order canceled'); + } else { + setAlertState('error'); + setAlertSubtitle('Error canceling order'); + } + + setTimeout(() => { + setAlertState(null); + setAlertSubtitle(''); + }, 2000); + + const { success, data } = await getUserOrders(); + + if (success) { + setOrders(data); + } + } + + const amount = ( + isActive + ? new Decimal(orderData.amount) + : new Decimal(orderData.amount).minus(orderData.left) + ).toString(); + const total = ( + isActive + ? new Decimal(orderData.total) + : new Decimal(orderData.amount).minus(orderData.left).mul(orderData.price) + ).toString(); + + function CurrencyTableData({ + header, + value, + currency, + price, + }: { + header: string; + value: string; + currency: string; + price: string; + }) { + const [textHovered, setTextHovered] = useState(false); + + const displayText = `${value} ${currency}`; + + const needTooltip = displayText.length > 15; + + return ( +
+ ); + } + + return ( + + + + + + + + + + {isActive && ( + + )} + + ); + } + + return ( +
+
+ {header} +

setTextHovered(true)} + onMouseLeave={() => setTextHovered(false)} + > + {displayText} + + ~ ${price} +

+ {needTooltip && ( + + {displayText} + + )} +
+
+
{orderData.type === 'buy' ? 'Buy' : 'Sell'}
+
+
+

+ {toStandardDateString(timestampDate)} +
+ {timestampDate.toLocaleTimeString('eu-EU')} +

+
+ Pair +

+ {firstCurrencyName}/{secondCurrencyName} +

+
+ Side +

{orderData.side === 'limit' ? 'Limit' : 'Market'}

+
+ +
+ + + + + + + + + + {isActive && } + + + + {orders.map((e) => ( + + ))} + +
+ Type + + Date + + Pairs + + Side + + Price + + Amount + + Total +
+ + {!orders.length && ( +
+ +

No orders

+
+ )} +
+ ); +} + +export default OrdersTable; diff --git a/src/pages/dex/orders/index.tsx b/src/pages/dex/orders/index.tsx new file mode 100644 index 0000000..915842a --- /dev/null +++ b/src/pages/dex/orders/index.tsx @@ -0,0 +1,269 @@ +import styles from '@/styles/Orders.module.scss'; +import Header from '@/components/default/Header/Header'; +import Footer from '@/components/default/Footer/Footer'; +import PageTitle from '@/components/default/PageTitle/PageTitle'; +import HorizontalSelect from '@/components/UI/HorizontalSelect/HorizontalSelect'; +import { useEffect, useState } from 'react'; +import Dropdown from '@/components/UI/Dropdown/Dropdown'; +import DateRangeSelector from '@/components/UI/DateRangeSelector/DateRangeSelector'; +import Button from '@/components/UI/Button/Button'; +import { cancelOrder, getUserOrders } from '@/utils/methods'; +import Alert from '@/components/UI/Alert/Alert'; +import AlertType from '@/interfaces/common/AlertType'; +import { UserOrderData } from '@/interfaces/responses/orders/GetUserOrdersRes'; +import PairValue from '@/interfaces/props/pages/dex/orders/PairValue'; +import DateState from '@/interfaces/common/DateState'; +import useUpdateUser from '@/hook/useUpdateUser'; +import OrdersTable from './OrdersTable/OrdersTable'; + +function Orders() { + const fetchUser = useUpdateUser(); + + const ordersCategories = [ + { + name: 'Active orders', + code: 'active-orders', + }, + { + name: 'Finished', + code: 'history', + }, + ]; + + const buySellValues = [ + { + name: 'Buy & Sell', + }, + { + name: 'Buy', + }, + { + name: 'Sell', + }, + ]; + + const [pairsValues, setPairsValues] = useState([{ name: 'All pairs', code: '' }]); + + const [pairDropdownValue, setPairDropdownState] = useState(pairsValues[0]); + + const [buyDropdownValue, setBuyDropdownState] = useState(buySellValues[0]); + + const [categoryState, setCategoryState] = useState(ordersCategories[0]); + + const [alertState, setAlertState] = useState(null); + + const [alertSubtitle, setAlertSubtitle] = useState(''); + + const [dateRange, setDateRange] = useState({ + first: null, + last: null, + }); + + const [orders, setOrders] = useState([]); + + useEffect(() => { + async function getOrders() { + setAlertState('loading'); + setAlertSubtitle('Loading orders data...'); + + const result = await getUserOrders(); + + if (!result.success) { + setAlertState('error'); + setAlertSubtitle('Error loading orders data'); + await new Promise((resolve) => setTimeout(resolve, 2000)); + setAlertState(null); + setAlertSubtitle(''); + return; + } + + fetchUser(); + + setOrders(result.data); + + function getPairsFromOrders(orders: UserOrderData[]) { + const pairs = [ + { + code: '', + name: 'All pairs', + }, + ]; + + for (let i = 0; i < orders.length; i++) { + const pair = { + name: `${orders[i].first_currency.name}/${orders[i].second_currency.name}`, + code: orders[i].pair_id, + }; + + if (!pairs.find((e) => e.code === pair.code)) pairs.push(pair); + } + + return pairs; + } + + const pairs = getPairsFromOrders(result.data); + + setPairsValues(pairs); + setPairDropdownState(pairs[0]); + + setAlertState(null); + setAlertSubtitle(''); + + const { success, data } = await getUserOrders(); + + if (success) { + setOrders(data); + } + } + + getOrders(); + }, []); + + function buySellFilter(e: UserOrderData) { + if (buyDropdownValue.name === 'Buy & Sell') return true; + + if (buyDropdownValue.name === 'Buy') return e.type === 'buy'; + + if (buyDropdownValue.name === 'Sell') return e.type === 'sell'; + } + + function pairFilter(e: UserOrderData) { + if (!pairDropdownValue) return true; + + return !pairDropdownValue.code || e.pair_id === pairDropdownValue.code; + } + + function dateFilter(e: UserOrderData) { + if (!dateRange.first || !dateRange.last) return true; + const firstDate = new Date(dateRange.first); + const lastDate = new Date(dateRange.last); + + const timestamp = parseInt(e.timestamp, 10); + + firstDate.setHours(0, 0, 0, 0); + lastDate.setHours(24, 0, 0, 0); + + if (!dateRange.first && !dateRange.last) return true; + + if (dateRange.first && !dateRange.last) return timestamp >= firstDate.getTime(); + + if (!dateRange.first && dateRange.last) return timestamp <= lastDate.getTime(); + + return timestamp >= firstDate.getTime() && timestamp <= lastDate.getTime(); + } + + function categoryFilter(e: UserOrderData) { + if (categoryState.code === 'active-orders') { + return e.status === 'active'; + } + return e.status === 'finished'; + } + + const activeOrders = orders.filter((e) => e.status === 'active'); + + async function cancelAllOrders() { + setAlertState('loading'); + setAlertSubtitle('Canceling all orders...'); + + const results = await Promise.allSettled( + activeOrders.map(async (e) => { + await cancelOrder(e.id); + }), + ); + + if (results.some((e) => e.status === 'rejected')) { + setAlertState('error'); + setAlertSubtitle('Some of the orders were not canceled'); + } else { + setAlertState('success'); + setAlertSubtitle('All orders canceled'); + } + + setTimeout(() => { + setAlertState(null); + setAlertSubtitle(''); + }, 2000); + + const { success, data } = await getUserOrders(); + + if (success) { + setOrders(data); + } + } + + return ( + <> +
+
+ +
+

My Trade Orders

+

Check all the offers you have

+
+
+
+
+ + +
+
+ { + setPairDropdownState(e); + }} + body={pairsValues} + /> + { + setBuyDropdownState(e); + }} + body={buySellValues} + /> + +
+ + +
+
+ + +
+ {alertState && ( + setAlertState(null)} + /> + )} +
+
+ + ); +} + +export default Orders; diff --git a/src/pages/dex/pairs/PairsCard/PairsCard.module.scss b/src/pages/dex/pairs/PairsCard/PairsCard.module.scss new file mode 100644 index 0000000..a9cefff --- /dev/null +++ b/src/pages/dex/pairs/PairsCard/PairsCard.module.scss @@ -0,0 +1,131 @@ +.card { + display: flex; + flex-direction: column; + + .card__header { + padding: 10px 12px; + display: flex; + flex-direction: row; + gap: 8px; + + border-top-left-radius: 10px; + border-top-right-radius: 10px; + background-color: var(--table-header-bg); + + .currency_name { + display: flex; + align-items: center; + flex-direction: row; + + font-size: 16px; + font-weight: 500; + + span:nth-child(3) { + color: var(--table-header-font-color); + } + } + + > img { + width: 18px; + height: 18px; + background: var(--icon-bg-color); + border-radius: 50%; + } + } + + .card__body { + padding: 10px 12px; + background-color: var(--table-bg-color); + border-bottom-left-radius: 10px; + border-bottom-right-radius: 10px; + + .card__body_wrapper { + display: flex; + flex-direction: row; + gap: 24px; + justify-content: space-between; + } + + .card__body_row { + display: flex; + flex-direction: row; + justify-content: space-between; + gap: 47px; + } + + .card__body_column { + display: flex; + flex-direction: column; + gap: 4px; + + p { + font-size: 12px; + font-weight: 700; + opacity: 0.8; + } + + .card__body_column_content { + display: flex; + flex-direction: column; + gap: 3px; + + .card__body_column_price { + span:nth-child(1) { + font-size: 14px; + font-weight: 400; + color: var(--font-main-color); + } + + span:nth-child(2) { + font-size: 14px; + font-weight: 500; + } + } + + span:nth-child(1) { + font-size: 14px; + font-weight: 400; + color: var(--font-main-color); + } + + span:nth-child(2) { + font-size: 12px; + font-weight: 400; + color: var(--table-header-font-color); + } + } + } + } + + .card__button_wrapper { + display: flex; + align-items: end; + + .card__button { + border-radius: 8px; + background-color: transparent; + transition: background 0.2s; + cursor: pointer; + border: 2px solid rgba(31, 143, 235, 1); + height: 24px; + width: 24px; + display: flex; + align-items: center; + justify-content: center; + + svg:not(.stroked) * { + fill: transparent; + } + + svg { + path { + stroke: var(--font-main-color); + } + } + + &:hover { + background-color: var(--table-button-bg-hover); + } + } + } +} diff --git a/src/pages/dex/pairs/PairsCard/PairsCard.tsx b/src/pages/dex/pairs/PairsCard/PairsCard.tsx new file mode 100644 index 0000000..b226470 --- /dev/null +++ b/src/pages/dex/pairs/PairsCard/PairsCard.tsx @@ -0,0 +1,108 @@ +import { useContext } from 'react'; +import Image from 'next/image'; +import { useRouter } from 'next/router'; +import { ReactComponent as ArrowRight } from '@/assets/images/UI/arrow_right.svg'; +import { Store } from '@/store/store-reducer'; +import PairData from '@/interfaces/common/PairData'; +import { notationToString, roundTo, tradingKnownCurrencies } from '@/utils/utils'; +import styles from './PairsCard.module.scss'; + +interface IProps { + pair: PairData; +} + +export default function PairsCard({ pair }: IProps) { + const router = useRouter(); + const { state } = useContext(Store); + + const firstCurrency = pair.first_currency; + const secondCurrency = pair.second_currency; + + const isFeatured = pair.featured; + + const code = tradingKnownCurrencies.includes(firstCurrency?.code) + ? secondCurrency?.code + : 'tsds'; + + const secondAssetUsdPrice = state.assetsRates.get(secondCurrency.asset_id || '') ?? 0; + + const price = Number(roundTo(notationToString(pair.rate ?? 0))); + const currentPriceUSD = secondAssetUsdPrice ? price : 0; + const priceUSD = currentPriceUSD + ? String(`$${(secondAssetUsdPrice * price).toFixed(2)}`) + : String(`$${(secondAssetUsdPrice * price).toFixed(0)}`); + + const coefficient = pair?.coefficient || 0; + const coefficientOutput = + parseFloat(coefficient?.toFixed(2) || '0') === -100 + ? -99.99 + : parseFloat(coefficient?.toFixed(2) || '0'); + + const volume = Number(roundTo(notationToString(pair.volume ?? 0))); + const currentVolumeUSD = secondAssetUsdPrice ? volume : 0; + const volumeUSD = currentVolumeUSD + ? String(`$${(secondAssetUsdPrice * volume).toFixed(2)}`) + : String(`$${(secondAssetUsdPrice * volume).toFixed(0)}`); + + const handleClick = () => { + router.push(`/dex/trading/${pair.id}`); + }; + + return ( +
+
+ currency +
+ {firstCurrency.name} + / + {secondCurrency.name} +
+ {isFeatured && ( + featured + )} +
+
+
+
+
+

+ {`Price ${secondCurrency.name ? `(${secondCurrency.name})` : ''}`}{' '} +

+
+
+ {price} + = 0 ? '#16D1D6' : '#FF6767' }} + > + {' '} + {coefficient >= 0 ? '+' : ''} + {coefficientOutput}% + +
+ {priceUSD} +
+
+
+

24h Volume

+
+ {volume} + {volumeUSD} +
+
+
+ +
+ +
+
+
+
+ ); +} diff --git a/src/pages/dex/pairs/PairsList/PairsList.module.scss b/src/pages/dex/pairs/PairsList/PairsList.module.scss new file mode 100644 index 0000000..917f0b1 --- /dev/null +++ b/src/pages/dex/pairs/PairsList/PairsList.module.scss @@ -0,0 +1,10 @@ +.list { + display: none; + flex-direction: column; + gap: 15px; + width: 100%; + + @media screen and (max-width: 865px) { + display: flex; + } +} diff --git a/src/pages/dex/pairs/PairsList/PairsList.tsx b/src/pages/dex/pairs/PairsList/PairsList.tsx new file mode 100644 index 0000000..917f4fc --- /dev/null +++ b/src/pages/dex/pairs/PairsList/PairsList.tsx @@ -0,0 +1,18 @@ +import React from 'react'; +import PairData from '@/interfaces/common/PairData'; +import styles from './PairsList.module.scss'; +import PairsCard from '../PairsCard/PairsCard'; + +interface IProps { + data: PairData[]; +} + +export default function PairsList({ data }: IProps) { + return ( +
+ {data.map((pair) => ( + + ))} +
+ ); +} diff --git a/src/pages/dex/pairs/PairsTable/PairsTable.module.scss b/src/pages/dex/pairs/PairsTable/PairsTable.module.scss new file mode 100644 index 0000000..cc53eb1 --- /dev/null +++ b/src/pages/dex/pairs/PairsTable/PairsTable.module.scss @@ -0,0 +1,142 @@ +$table-radius: 10px; + +.table { + width: 100%; + font-size: 14px; + color: white; + border-spacing: 0 1px; + + thead { + background-color: var(--table-header-bg); + } + + @media screen and (max-width: 865px) { + display: none; + } +} + +.header_row { + color: var(--table-header-font-color); + text-align: left; + opacity: 0.8; + user-select: none; + + th { + font-size: 14px; + + &:first-child { + border-top-left-radius: $table-radius; + } + + &:last-child { + border-top-right-radius: $table-radius; + } + } +} + +.header_column_row { + display: flex; + align-items: center; + gap: 8px; + + font-size: 14px; + + svg { + g { + path { + fill-opacity: 0.9; + } + } + } +} + +.header_cell { + padding: 10px 20px; + height: 40px; + border: none; + min-height: 40px; +} + +.body_row { + background-color: var(--table-bg-color); + border-top-right-radius: $table-radius; +} + +.body_cell { + padding: 15px 20px; + border-bottom: 1px solid var(--delimiter-color); +} + +.coefficient_cell { + font-size: 16px; + font-weight: 500; +} + +.pair_cell { + display: flex; + align-items: center; + gap: 8px; + + .currency_name { + display: flex; + align-items: center; + + font-size: 16px; + font-weight: 500; + + max-width: 150px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + display: inline-block; + + span:nth-child(3) { + color: var(--table-header-font-color); + } + } + + > img { + width: 18px; + height: 18px; + background: var(--icon-bg-color); + border-radius: 50%; + } +} + +.price_cell { + display: flex; + flex-direction: column; + gap: '3px'; + + .text { + font-size: 16px; + font-weight: 400; + color: var(--font-main-color); + } + + .sub_text { + font-size: 12px; + font-weight: 400; + color: var(--table-header-font-color); + } +} + +.button_cell { + display: flex; + justify-content: flex-end; + + .trade_button { + background-color: transparent; + color: var(--font-main-color); + padding: 10px 40px; + border-radius: 10px; + transition: background 0.2s; + cursor: pointer; + border: 2px solid rgba(31, 143, 235, 1); + user-select: none; + + &:hover { + background-color: var(--table-button-bg-hover); + } + } +} diff --git a/src/pages/dex/pairs/PairsTable/PairsTable.tsx b/src/pages/dex/pairs/PairsTable/PairsTable.tsx new file mode 100644 index 0000000..7e13a10 --- /dev/null +++ b/src/pages/dex/pairs/PairsTable/PairsTable.tsx @@ -0,0 +1,226 @@ +import { memo, useContext, useMemo } from 'react'; +import { ColumnDef, flexRender, getCoreRowModel, useReactTable } from '@tanstack/react-table'; +import { useRouter } from 'next/router'; +import Image from 'next/image'; +import { ReactComponent as ClockIcon } from '@/assets/images/UI/clock_icon.svg'; +import { Store } from '@/store/store-reducer'; +import PairData from '@/interfaces/common/PairData'; +import { ContextState } from '@/interfaces/common/ContextValue'; +import { tradingKnownCurrencies, roundTo, notationToString } from '@/utils/utils'; +import styles from './PairsTable.module.scss'; + +type Currency = { + code: string; + name: string; + whitelisted?: boolean; + featured?: boolean; +}; + +type Row = { + id: string; + pair: { + base: Currency; + quote: Currency; + }; + price: number; + priceUSD: string; + change: number; + volume: number; + volumeUSD: string; + featured: boolean; + code: string; +}; + +function transformPairsToRows(pairs: PairData[], state: ContextState): Row[] { + return pairs.map((pair) => { + const secondAssetUsdPrice = state.assetsRates.get(pair.second_currency.asset_id || '') ?? 0; + + const price = Number(roundTo(notationToString(pair.rate ?? 0))); + const currentPriceUSD = secondAssetUsdPrice ? price : 0; + const priceUSD = currentPriceUSD + ? String(`$${(secondAssetUsdPrice * price).toFixed(2)}`) + : String(`$${(secondAssetUsdPrice * price).toFixed(0)}`); + + const volume = Number(roundTo(notationToString(pair.volume ?? 0))); + const currentVolumeUSD = secondAssetUsdPrice ? volume : 0; + const volumeUSD = currentVolumeUSD + ? String(`$${(secondAssetUsdPrice * volume).toFixed(2)}`) + : String(`$${(secondAssetUsdPrice * volume).toFixed(0)}`); + + return { + id: pair.id, + pair: { + base: pair.first_currency, + quote: pair.second_currency, + }, + price, + priceUSD, + change: pair?.coefficient || 0, + volume, + volumeUSD, + featured: pair.featured, + code: tradingKnownCurrencies.includes(pair.first_currency?.code) + ? pair.first_currency?.code + : 'tsds', + }; + }); +} + +interface IProps { + data: PairData[]; +} + +function PairsTable({ data }: IProps) { + const router = useRouter(); + const { state } = useContext(Store); + + const columns = useMemo[]>( + () => [ + { + accessorKey: 'pair', + header: 'Trading Pair', + cell: ({ row }) => { + const { + pair: { base, quote }, + code, + featured, + } = row.original; + return ( +
+ currency +
+ {base.name} + / + {quote.name} +
+ + {featured && ( + featured + )} +
+ ); + }, + }, + { + accessorKey: 'price', + header: ({ table }) => { + const row = table.options.data[0] as Row; + const name = row?.pair.quote.name; + + return `Price ${name ? `(${name})` : ''}`; + }, + cell: ({ row }) => ( +
+
+ {roundTo(notationToString(row.original.price))} +
+
{row.original.priceUSD}
+
+ ), + }, + { + accessorKey: 'change', + header: () => ( +
+ + 24h Change +
+ ), + cell: ({ row }) => { + const coefficient = row.original.change; + const coefficientOutput = + parseFloat(coefficient?.toFixed(2) || '0') === -100 + ? -99.99 + : parseFloat(coefficient?.toFixed(2) || '0'); + + return ( + = 0 ? '#16D1D6' : '#FF6767' }} + > + {coefficient >= 0 ? '+' : ''} + {coefficientOutput}% + + ); + }, + }, + { + accessorKey: 'volume', + header: () => ( +
+ + 24h Volume +
+ ), + cell: ({ row }) => ( +
+
+ {roundTo(notationToString(row.original?.volume ?? 0), 8)} +
+
{row.original.volumeUSD}
+
+ ), + }, + { + id: 'action', + header: '', + cell: ({ row }) => ( +
+ +
+ ), + }, + ], + [], + ); + + const table = useReactTable({ + data: transformPairsToRows(data, state), + columns, + getCoreRowModel: getCoreRowModel(), + }); + + return ( + + + {table.getHeaderGroups().map((headerGroup) => ( + + {headerGroup.headers.map((header) => ( + + ))} + + ))} + + + {table.getRowModel().rows.map((row) => ( + + {row.getVisibleCells().map((cell) => ( + + ))} + + ))} + +
+ {flexRender(header.column.columnDef.header, header.getContext())} +
+ {flexRender(cell.column.columnDef.cell, cell.getContext())} +
+ ); +} + +export default memo(PairsTable); diff --git a/src/pages/dex/trading/CandleChart/CandleChart.module.scss b/src/pages/dex/trading/CandleChart/CandleChart.module.scss new file mode 100644 index 0000000..447d07f --- /dev/null +++ b/src/pages/dex/trading/CandleChart/CandleChart.module.scss @@ -0,0 +1,32 @@ +.candle__chart__wrapper { + position: relative; + width: auto; + height: auto; + height: 100%; + + height: 515px; + + > canvas { + width: 100%; + height: 100%; + cursor: crosshair; + } + + h1 { + font-size: 72px; + color: var(--font-dimmed-color); + white-space: nowrap; + position: absolute; + transform: translate(-50%, -50%); + top: 50%; + left: 50%; + + @media screen and (max-width: 600px) { + font-size: 48px; + } + + @media screen and (max-width: 400px) { + font-size: 36px; + } + } +} diff --git a/src/pages/dex/trading/CandleChart/CandleChart.tsx b/src/pages/dex/trading/CandleChart/CandleChart.tsx new file mode 100644 index 0000000..9a261ec --- /dev/null +++ b/src/pages/dex/trading/CandleChart/CandleChart.tsx @@ -0,0 +1,235 @@ +import { useEffect, useState, useRef, useMemo } from 'react'; +import useAdvancedTheme from '@/hook/useTheme'; +import CandleChartProps from '@/interfaces/props/pages/dex/trading/CandleChartProps/CandleChartProps'; +import ReactECharts from 'echarts-for-react'; +import Decimal from 'decimal.js'; +import * as echarts from 'echarts'; +import CandleRow from '@/interfaces/common/CandleRow'; +import testCandles from './testCandles.json'; +import styles from './CandleChart.module.scss'; + +const TESTING_MODE = false; + +function CandleChart(props: CandleChartProps) { + type ResultCandle = [number, number, number, number, number]; + + const { theme } = useAdvancedTheme(); + const chartRef = useRef(null); + const upColor = '#16D1D6cc'; + const upBorderColor = '#16D1D6cc'; + const downColor = '#ff6767cc'; + const downBorderColor = '#ff6767cc'; + + const [candles, setCandles] = useState([]); + const [isLoaded, setIsLoaded] = useState(false); + + function timestampToString(timestamp: string) { + const targetPattern = + new Date(parseInt(timestamp, 10)).toDateString() === new Date().toDateString() + ? 'hh:mm:ss' + : 'hh:mm:ss\ndd-MM-yyyy'; + + return echarts.format.formatTime(targetPattern, parseInt(timestamp, 10)); + } + + function prepareCandles() { + const candles = (TESTING_MODE ? (testCandles as CandleRow[]) : props.candles) + .map((candle) => { + const result = [ + parseInt(candle.timestamp, 10), + candle.shadow_top || 0, + candle.shadow_bottom || 0, + candle.body_first || 0, + candle.body_second || 0, + ]; + + return result as ResultCandle; + }) + .filter((e) => e[0]) + .map((e) => { + const decimals = e.map((el, i) => ({ + value: i !== 0 ? new Decimal(el) : undefined, + index: i, + })); + + for (const decimal of decimals) { + if (decimal.value !== undefined) { + if (decimal.value.lessThan(0.00001)) { + e[decimal.index] = 0; + } + } + } + + return e; + }); + + return candles; + } + + useEffect(() => { + const newCandles = prepareCandles(); + + setCandles(newCandles); + setIsLoaded(true); + }, [props.candles]); + + const option = useMemo(() => { + function splitData(rawData: ResultCandle[]) { + const categoryData = []; + const values = []; + for (let i = 0; i < rawData.length; i++) { + categoryData.push(rawData[i][0]); + values.push(rawData[i].slice(1)); + } + return { + categoryData, + values, + }; + } + + const data0 = splitData(candles); + + const now = new Date().getTime(); + const zoomStartTime = (() => { + const date = +new Date(); + const hr1 = 60 * 60 * 1000; + + const hoursDecrement = 24 * hr1; + const daysDecrement = 7 * 24 * hr1; + const weeksDecrement = 4 * 7 * 24 * hr1; + const monthsDecrement = 52 * 7 * 24 * hr1; + + switch (props.period) { + case '1h': + return date - hoursDecrement; + case '1d': + return date - daysDecrement; + case '1w': + return date - weeksDecrement; + case '1m': + return date - monthsDecrement; + default: + return date - hr1; + } + })(); + + const closestDateToStart = data0.categoryData.reduce((acc, curr) => { + const currDiff = Math.abs(curr - zoomStartTime); + const accDiff = Math.abs(acc - zoomStartTime); + + return currDiff < accDiff ? curr : acc; + }, now); + + const lastDate = data0.categoryData[data0.categoryData.length - 1]; + + const closestDateIndex = data0.categoryData.indexOf(closestDateToStart); + const lastDateIndex = data0.categoryData.indexOf(lastDate); + + return { + grid: { + top: '5%', + left: '10%', + right: '5%', + bottom: '10%', + }, + + xAxis: { + type: 'category', + data: data0.categoryData, + boundaryGap: true, + axisLine: { onZero: false }, + splitLine: { + show: true, + lineStyle: { + color: theme === 'light' ? '#e3e3e8' : '#1f1f4a', + }, + }, + min: 'dataMin', + max: 'dataMax', + axisPointer: { + show: true, + type: 'line', + label: { + formatter: (params: {value: string}) => timestampToString(params.value), + backgroundColor: '#4A90E2', + color: '#ffffff', + }, + }, + axisLabel: { + formatter: timestampToString, + }, + }, + yAxis: { + scale: true, + splitArea: { show: false }, + min: 0, + max: (value: {max: string}) => new Decimal(value.max).mul(1.1).toNumber(), + axisPointer: { + show: true, + type: 'line', + label: { + show: true, + backgroundColor: '#4A90E2', + color: '#ffffff', + }, + }, + splitLine: { + show: true, + lineStyle: { + color: theme === 'light' ? '#e3e3e8' : '#1f1f4a', + }, + }, + }, + dataZoom: [ + { + type: 'inside', + startValue: closestDateIndex, + endValue: lastDateIndex, + }, + ], + series: [ + { + name: 'Candle Chart', + type: 'candlestick', + data: data0.values, + itemStyle: { + color: upColor, + color0: downColor, + borderColor: upBorderColor, + borderColor0: downBorderColor, + }, + barWidth: '75%', + dimensions: ['date', 'highest', 'lowest', 'open', 'close'], + encode: { + x: 'date', + y: ['open', 'close', 'highest', 'lowest'], + }, + large: true, + largeThreshold: 2000000, + }, + ], + }; + }, [candles, theme]); + + return ( +
+ + + {!candles?.length && isLoaded &&

[ Low volume ]

} +
+ ); +} + +export default CandleChart; diff --git a/src/pages/dex/trading/CandleChart/testCandles.json b/src/pages/dex/trading/CandleChart/testCandles.json new file mode 100644 index 0000000..ae80c3e --- /dev/null +++ b/src/pages/dex/trading/CandleChart/testCandles.json @@ -0,0 +1,618 @@ +[ + { + "timestamp": "1358960400000", + "shadow_top": 2320.26, + "shadow_bottom": 2320.26, + "body_first": 2287.3, + "body_second": 2362.94 + }, + { + "timestamp": "1359046800000", + "shadow_top": 2300, + "shadow_bottom": 2291.3, + "body_first": 2288.26, + "body_second": 2308.38 + }, + { + "timestamp": "1359306000000", + "shadow_top": 2295.35, + "shadow_bottom": 2346.5, + "body_first": 2295.35, + "body_second": 2346.92 + }, + { + "timestamp": "1359392400000", + "shadow_top": 2347.22, + "shadow_bottom": 2358.98, + "body_first": 2337.35, + "body_second": 2363.8 + }, + { + "timestamp": "1359478800000", + "shadow_top": 2360.75, + "shadow_bottom": 2382.48, + "body_first": 2347.89, + "body_second": 2383.76 + }, + { + "timestamp": "1359565200000", + "shadow_top": 2383.43, + "shadow_bottom": 2385.42, + "body_first": 2371.23, + "body_second": 2391.82 + }, + { + "timestamp": "1359651600000", + "shadow_top": 2377.41, + "shadow_bottom": 2419.02, + "body_first": 2369.57, + "body_second": 2421.15 + }, + { + "timestamp": "1359910800000", + "shadow_top": 2425.92, + "shadow_bottom": 2428.15, + "body_first": 2417.58, + "body_second": 2440.38 + }, + { + "timestamp": "1359997200000", + "shadow_top": 2411, + "shadow_bottom": 2433.13, + "body_first": 2403.3, + "body_second": 2437.42 + }, + { + "timestamp": "1360083600000", + "shadow_top": 2432.68, + "shadow_bottom": 2434.48, + "body_first": 2427.7, + "body_second": 2441.73 + }, + { + "timestamp": "1360170000000", + "shadow_top": 2430.69, + "shadow_bottom": 2418.53, + "body_first": 2394.22, + "body_second": 2433.89 + }, + { + "timestamp": "1360256400000", + "shadow_top": 2416.62, + "shadow_bottom": 2432.4, + "body_first": 2414.4, + "body_second": 2443.03 + }, + { + "timestamp": "1361120400000", + "shadow_top": 2441.91, + "shadow_bottom": 2421.56, + "body_first": 2415.43, + "body_second": 2444.8 + }, + { + "timestamp": "1361206800000", + "shadow_top": 2420.26, + "shadow_bottom": 2382.91, + "body_first": 2373.53, + "body_second": 2427.07 + }, + { + "timestamp": "1361293200000", + "shadow_top": 2383.49, + "shadow_bottom": 2397.18, + "body_first": 2370.61, + "body_second": 2397.94 + }, + { + "timestamp": "1361379600000", + "shadow_top": 2378.82, + "shadow_bottom": 2325.95, + "body_first": 2309.17, + "body_second": 2378.82 + }, + { + "timestamp": "1361466000000", + "shadow_top": 2322.94, + "shadow_bottom": 2314.16, + "body_first": 2308.76, + "body_second": 2330.88 + }, + { + "timestamp": "1361725200000", + "shadow_top": 2320.62, + "shadow_bottom": 2325.82, + "body_first": 2315.01, + "body_second": 2338.78 + }, + { + "timestamp": "1361811600000", + "shadow_top": 2313.74, + "shadow_bottom": 2293.34, + "body_first": 2289.89, + "body_second": 2340.71 + }, + { + "timestamp": "1361898000000", + "shadow_top": 2297.77, + "shadow_bottom": 2313.22, + "body_first": 2292.03, + "body_second": 2324.63 + }, + { + "timestamp": "1361984400000", + "shadow_top": 2322.32, + "shadow_bottom": 2365.59, + "body_first": 2308.92, + "body_second": 2366.16 + }, + { + "timestamp": "1362070800000", + "shadow_top": 2364.54, + "shadow_bottom": 2359.51, + "body_first": 2330.86, + "body_second": 2369.65 + }, + { + "timestamp": "1362330000000", + "shadow_top": 2332.08, + "shadow_bottom": 2273.4, + "body_first": 2259.25, + "body_second": 2333.54 + }, + { + "timestamp": "1362416400000", + "shadow_top": 2274.81, + "shadow_bottom": 2326.31, + "body_first": 2270.1, + "body_second": 2328.14 + }, + { + "timestamp": "1362502800000", + "shadow_top": 2333.61, + "shadow_bottom": 2347.18, + "body_first": 2321.6, + "body_second": 2351.44 + }, + { + "timestamp": "1362589200000", + "shadow_top": 2340.44, + "shadow_bottom": 2324.29, + "body_first": 2304.27, + "body_second": 2352.02 + }, + { + "timestamp": "1362675600000", + "shadow_top": 2326.42, + "shadow_bottom": 2318.61, + "body_first": 2314.59, + "body_second": 2333.67 + }, + { + "timestamp": "1362934800000", + "shadow_top": 2314.68, + "shadow_bottom": 2310.59, + "body_first": 2296.58, + "body_second": 2320.96 + }, + { + "timestamp": "1363021200000", + "shadow_top": 2309.16, + "shadow_bottom": 2286.6, + "body_first": 2264.83, + "body_second": 2333.29 + }, + { + "timestamp": "1363107600000", + "shadow_top": 2282.17, + "shadow_bottom": 2263.97, + "body_first": 2253.25, + "body_second": 2286.33 + }, + { + "timestamp": "1363194000000", + "shadow_top": 2255.77, + "shadow_bottom": 2270.28, + "body_first": 2253.31, + "body_second": 2276.22 + }, + { + "timestamp": "1363280400000", + "shadow_top": 2269.31, + "shadow_bottom": 2278.4, + "body_first": 2250, + "body_second": 2312.08 + }, + { + "timestamp": "1363539600000", + "shadow_top": 2267.29, + "shadow_bottom": 2240.02, + "body_first": 2239.21, + "body_second": 2276.05 + }, + { + "timestamp": "1363626000000", + "shadow_top": 2244.26, + "shadow_bottom": 2257.43, + "body_first": 2232.02, + "body_second": 2261.31 + }, + { + "timestamp": "1363712400000", + "shadow_top": 2257.74, + "shadow_bottom": 2317.37, + "body_first": 2257.42, + "body_second": 2317.86 + }, + { + "timestamp": "1363798800000", + "shadow_top": 2318.21, + "shadow_bottom": 2324.24, + "body_first": 2311.6, + "body_second": 2330.81 + }, + { + "timestamp": "1363885200000", + "shadow_top": 2321.4, + "shadow_bottom": 2328.28, + "body_first": 2314.97, + "body_second": 2332 + }, + { + "timestamp": "1364144400000", + "shadow_top": 2334.74, + "shadow_bottom": 2326.72, + "body_first": 2319.91, + "body_second": 2344.89 + }, + { + "timestamp": "1364230800000", + "shadow_top": 2318.58, + "shadow_bottom": 2297.67, + "body_first": 2281.12, + "body_second": 2319.99 + }, + { + "timestamp": "1364317200000", + "shadow_top": 2299.38, + "shadow_bottom": 2301.26, + "body_first": 2289, + "body_second": 2323.48 + }, + { + "timestamp": "1364403600000", + "shadow_top": 2273.55, + "shadow_bottom": 2236.3, + "body_first": 2232.91, + "body_second": 2273.55 + }, + { + "timestamp": "1364490000000", + "shadow_top": 2238.49, + "shadow_bottom": 2236.62, + "body_first": 2228.81, + "body_second": 2246.87 + }, + { + "timestamp": "1364749200000", + "shadow_top": 2229.46, + "shadow_bottom": 2234.4, + "body_first": 2227.31, + "body_second": 2243.95 + }, + { + "timestamp": "1364835600000", + "shadow_top": 2234.9, + "shadow_bottom": 2227.74, + "body_first": 2220.44, + "body_second": 2253.42 + }, + { + "timestamp": "1364922000000", + "shadow_top": 2232.69, + "shadow_bottom": 2225.29, + "body_first": 2217.25, + "body_second": 2241.34 + }, + { + "timestamp": "1365354000000", + "shadow_top": 2196.24, + "shadow_bottom": 2211.59, + "body_first": 2180.67, + "body_second": 2212.59 + }, + { + "timestamp": "1365440400000", + "shadow_top": 2215.47, + "shadow_bottom": 2225.77, + "body_first": 2215.47, + "body_second": 2234.73 + }, + { + "timestamp": "1365526800000", + "shadow_top": 2224.93, + "shadow_bottom": 2226.13, + "body_first": 2212.56, + "body_second": 2233.04 + }, + { + "timestamp": "1365613200000", + "shadow_top": 2236.98, + "shadow_bottom": 2219.55, + "body_first": 2217.26, + "body_second": 2242.48 + }, + { + "timestamp": "1365699600000", + "shadow_top": 2218.09, + "shadow_bottom": 2206.78, + "body_first": 2204.44, + "body_second": 2226.26 + }, + { + "timestamp": "1365958800000", + "shadow_top": 2199.91, + "shadow_bottom": 2181.94, + "body_first": 2177.39, + "body_second": 2204.99 + }, + { + "timestamp": "1366045200000", + "shadow_top": 2169.63, + "shadow_bottom": 2194.85, + "body_first": 2165.78, + "body_second": 2196.43 + }, + { + "timestamp": "1366131600000", + "shadow_top": 2195.03, + "shadow_bottom": 2193.8, + "body_first": 2178.47, + "body_second": 2197.51 + }, + { + "timestamp": "1366218000000", + "shadow_top": 2181.82, + "shadow_bottom": 2197.6, + "body_first": 2175.44, + "body_second": 2206.03 + }, + { + "timestamp": "1366304400000", + "shadow_top": 2201.12, + "shadow_bottom": 2244.64, + "body_first": 2200.58, + "body_second": 2250.11 + }, + { + "timestamp": "1366563600000", + "shadow_top": 2236.4, + "shadow_bottom": 2242.17, + "body_first": 2232.26, + "body_second": 2245.12 + }, + { + "timestamp": "1366650000000", + "shadow_top": 2242.62, + "shadow_bottom": 2184.54, + "body_first": 2182.81, + "body_second": 2242.62 + }, + { + "timestamp": "1366736400000", + "shadow_top": 2187.35, + "shadow_bottom": 2218.32, + "body_first": 2184.11, + "body_second": 2226.12 + }, + { + "timestamp": "1366822800000", + "shadow_top": 2213.19, + "shadow_bottom": 2199.31, + "body_first": 2191.85, + "body_second": 2224.63 + }, + { + "timestamp": "1366909200000", + "shadow_top": 2203.89, + "shadow_bottom": 2177.91, + "body_first": 2173.86, + "body_second": 2210.58 + }, + { + "timestamp": "1367427600000", + "shadow_top": 2170.78, + "shadow_bottom": 2174.12, + "body_first": 2161.14, + "body_second": 2179.65 + }, + { + "timestamp": "1367514000000", + "shadow_top": 2179.05, + "shadow_bottom": 2205.5, + "body_first": 2179.05, + "body_second": 2222.81 + }, + { + "timestamp": "1367773200000", + "shadow_top": 2212.5, + "shadow_bottom": 2231.17, + "body_first": 2212.5, + "body_second": 2236.07 + }, + { + "timestamp": "1367859600000", + "shadow_top": 2227.86, + "shadow_bottom": 2235.57, + "body_first": 2219.44, + "body_second": 2240.26 + }, + { + "timestamp": "1367946000000", + "shadow_top": 2242.39, + "shadow_bottom": 2246.3, + "body_first": 2235.42, + "body_second": 2255.21 + }, + { + "timestamp": "1368032400000", + "shadow_top": 2246.96, + "shadow_bottom": 2232.97, + "body_first": 2221.38, + "body_second": 2247.86 + }, + { + "timestamp": "1368118800000", + "shadow_top": 2228.82, + "shadow_bottom": 2246.83, + "body_first": 2225.81, + "body_second": 2247.67 + }, + { + "timestamp": "1368378000000", + "shadow_top": 2247.68, + "shadow_bottom": 2241.92, + "body_first": 2231.36, + "body_second": 2250.85 + }, + { + "timestamp": "1368464400000", + "shadow_top": 2238.9, + "shadow_bottom": 2217.01, + "body_first": 2205.87, + "body_second": 2239.93 + }, + { + "timestamp": "1368550800000", + "shadow_top": 2217.09, + "shadow_bottom": 2224.8, + "body_first": 2213.58, + "body_second": 2225.19 + }, + { + "timestamp": "1368637200000", + "shadow_top": 2221.34, + "shadow_bottom": 2251.81, + "body_first": 2210.77, + "body_second": 2252.87 + }, + { + "timestamp": "1368723600000", + "shadow_top": 2249.81, + "shadow_bottom": 2282.87, + "body_first": 2248.41, + "body_second": 2288.09 + }, + { + "timestamp": "1368982800000", + "shadow_top": 2286.33, + "shadow_bottom": 2299.99, + "body_first": 2281.9, + "body_second": 2309.39 + }, + { + "timestamp": "1369069200000", + "shadow_top": 2297.11, + "shadow_bottom": 2305.11, + "body_first": 2290.12, + "body_second": 2305.3 + }, + { + "timestamp": "1369155600000", + "shadow_top": 2303.75, + "shadow_bottom": 2302.4, + "body_first": 2292.43, + "body_second": 2314.18 + }, + { + "timestamp": "1369242000000", + "shadow_top": 2293.81, + "shadow_bottom": 2275.67, + "body_first": 2274.1, + "body_second": 2304.95 + }, + { + "timestamp": "1369328400000", + "shadow_top": 2281.45, + "shadow_bottom": 2288.53, + "body_first": 2270.25, + "body_second": 2292.59 + }, + { + "timestamp": "1369587600000", + "shadow_top": 2286.66, + "shadow_bottom": 2293.08, + "body_first": 2283.94, + "body_second": 2301.7 + }, + { + "timestamp": "1369674000000", + "shadow_top": 2293.4, + "shadow_bottom": 2321.32, + "body_first": 2281.47, + "body_second": 2322.1 + }, + { + "timestamp": "1369760400000", + "shadow_top": 2323.54, + "shadow_bottom": 2324.02, + "body_first": 2321.17, + "body_second": 2334.33 + }, + { + "timestamp": "1369846800000", + "shadow_top": 2316.25, + "shadow_bottom": 2317.75, + "body_first": 2310.49, + "body_second": 2325.72 + }, + { + "timestamp": "1369933200000", + "shadow_top": 2320.74, + "shadow_bottom": 2300.59, + "body_first": 2299.37, + "body_second": 2325.53 + }, + { + "timestamp": "1370192400000", + "shadow_top": 2300.21, + "shadow_bottom": 2299.25, + "body_first": 2294.11, + "body_second": 2313.43 + }, + { + "timestamp": "1370278800000", + "shadow_top": 2297.1, + "shadow_bottom": 2272.42, + "body_first": 2264.76, + "body_second": 2297.1 + }, + { + "timestamp": "1370365200000", + "shadow_top": 2270.71, + "shadow_bottom": 2270.93, + "body_first": 2260.87, + "body_second": 2276.86 + }, + { + "timestamp": "1370451600000", + "shadow_top": 2264.43, + "shadow_bottom": 2242.11, + "body_first": 2240.07, + "body_second": 2266.69 + }, + { + "timestamp": "1370538000000", + "shadow_top": 2242.26, + "shadow_bottom": 2210.9, + "body_first": 2205.07, + "body_second": 2250.63 + }, + { + "timestamp": "1371056400000", + "shadow_top": 2790.1, + "shadow_bottom": 2148.35, + "body_first": 2126.22, + "body_second": 100.1 + } +] diff --git a/src/pages/dex/trading/InputPanelItem/InputPanelItem.module.scss b/src/pages/dex/trading/InputPanelItem/InputPanelItem.module.scss new file mode 100644 index 0000000..ce93156 --- /dev/null +++ b/src/pages/dex/trading/InputPanelItem/InputPanelItem.module.scss @@ -0,0 +1,218 @@ +.input_panel__item { + width: 100%; + + > div:first-child { + display: flex; + justify-content: space-between; + padding-bottom: 20px; + border-bottom: 1px solid rgba(255, 255, 255, 0.1); + margin-bottom: 20px; + } + + > div:last-child { + display: flex; + flex-direction: column; + gap: 20px; + + > .buy_btn { + background-color: #16d1d6; + + &:hover { + background-color: #45dade; + } + } + + > .sell_btn { + background-color: #ff6767; + + &:hover { + background-color: #ff8585; + } + } + + .input_panel__range { + margin-top: 10px; + } + + .input_panel__expiration { + display: flex; + justify-content: space-between; + gap: 20px; + + h6 { + white-space: nowrap; + } + + .expiration__dropdown { + width: 100%; + } + + > div:first-child { + display: flex; + align-items: center; + gap: 6px; + } + + @media screen and (max-width: 1500px) { + flex-wrap: wrap; + } + + @media screen and (max-width: 1000px) { + flex-wrap: nowrap; + } + + @media screen and (max-width: 530px) { + flex-wrap: wrap; + } + } + + .labeled_input { + display: flex; + flex-direction: column; + gap: 8px; + + h6 { + color: var(--font-dimmed-color); + } + + > div { + width: 100%; + position: relative; + background-color: var(--bordered-input-bg); + border: 1px solid var(--window-border-color); + border-radius: 8px; + display: flex; + overflow: hidden; + + input { + width: 100%; + padding: 16px 15px; + background-color: transparent; + border: none; + } + + .labeled_input__value { + padding-right: 15px; + display: flex; + align-items: center; + + > p { + color: var(--font-dimmed-color); + } + } + + .labeled_input__currency { + min-width: 82px; + max-width: 150px; + padding: 0 15px; + background-color: var(--dex-input-currency); + display: flex; + align-items: center; + justify-content: center; + + > p { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + } + } + + &.labeled_input__invalid > div { + border-color: #ff6767; + } + + @media screen and (max-width: 430px) { + > div { + input, + .labeled_input__value > p, + .labeled_input__currency > p { + font-size: 13px; + } + + input { + padding: 19px 15px; + } + + .labeled_input__currency { + min-width: 70px; + } + } + } + } + + .input_panel__fees { + display: flex; + justify-content: space-between; + + p { + color: var(--font-dimmed-color); + } + } + } +} + +.buy-sell-switch { + padding: 3px; + height: 30px; + display: flex; + align-items: center; + border-radius: 100px; + border: 1px solid var(--dex-buy-sell-border); + + .buy-sell-switch__item { + width: 50px; + height: 100%; + background-color: transparent; + cursor: pointer; + font-size: 14px; + font-weight: 600; + border-radius: 100px; + + &.item_selected-buy { + background-color: #16d1d6; + color: #ffffff; + } + + &.item_selected-sell { + background-color: #ff6767; + color: #ffffff; + } + } +} + +.apply__alert { + display: flex; + gap: 20px; + align-items: center; + + &__content { + display: flex; + flex-direction: column; + gap: 10px; + } + + &__button { + max-width: 125px; + background-color: var(--alert-btn-bg); + color: #1f8feb; + padding: 7px 32px; + font-size: 12px; + font-weight: 500; + + &:hover { + background-color: var(--alert-btn-hover); + } + } + + h2 { + font-size: 16px; + font-weight: 600; + } + + p { + font-size: 14px; + opacity: 0.7; + margin-bottom: 5px; + } +} \ No newline at end of file diff --git a/src/pages/dex/trading/InputPanelItem/InputPanelItem.tsx b/src/pages/dex/trading/InputPanelItem/InputPanelItem.tsx new file mode 100644 index 0000000..9314e0c --- /dev/null +++ b/src/pages/dex/trading/InputPanelItem/InputPanelItem.tsx @@ -0,0 +1,272 @@ +import { Store } from '@/store/store-reducer'; +import { createOrder } from '@/utils/methods'; +import { ChangeEvent, useContext, useRef, useState } from 'react'; +import Input from '@/components/UI/Input/Input'; +import RangeInput from '@/components/UI/RangeInput/RangeInput'; +import ConnectButton from '@/components/UI/ConnectButton/ConnectButton'; +import Button from '@/components/UI/Button/Button'; +import { useRouter } from 'next/router'; +import { classes, formatDollarValue } from '@/utils/utils'; +import InputPanelItemProps from '@/interfaces/props/pages/dex/trading/InputPanelItem/InputPanelItemProps'; +import LabeledInputProps from '@/interfaces/props/pages/dex/trading/InputPanelItem/LabeledInputProps'; +import CreateOrderData from '@/interfaces/fetch-data/create-order/CreateOrderData'; +import Decimal from 'decimal.js'; +import HorizontalSelectProps from '@/interfaces/props/components/UI/HorizontalSelect/HorizontalSelectProps'; +import SelectValue from '@/interfaces/states/pages/dex/trading/InputPanelItem/SelectValue'; +import { nanoid } from 'nanoid'; +import Alert from '@/components/UI/Alert/Alert'; +import infoIcon from '@/assets/images/UI/info_alert_icon.svg'; +import Image from 'next/image'; +import styles from './InputPanelItem.module.scss'; + +function DexBuySellSwitch({ body, value, setValue }: HorizontalSelectProps) { + return ( +
+ {body.map((e) => { + let itemClass = styles['buy-sell-switch__item']; + + if (value.code === e.code) { + itemClass += + e.code === 'buy' + ? ` ${styles['item_selected-buy']}` + : ` ${styles['item_selected-sell']}`; + } + + return ( + + ); + })} +
+ ); +} + +function InputPanelItem(props: InputPanelItemProps) { + const { state } = useContext(Store); + + const router = useRouter(); + + const { + priceState = '', + amountState = '', + totalState = '', + buySellValues, + buySellState = buySellValues[0], + setBuySellState, + setPriceFunction, + setAmountFunction, + setAlertState, + setAlertSubtitle, + setRangeInputValue, + rangeInputValue = '50', + firstCurrencyName = '', + secondCurrencyName = '', + balance = 0, + amountValid, + priceValid, + totalValid, + totalUsd, + scrollToOrderList, + } = props; + + const [creatingState, setCreatingState] = useState(false); + + const [hasImmediateMatch, setHasImmediateMatch] = useState(false); + + function LabeledInput(props: LabeledInputProps) { + const labelRef = useRef(null); + const { + label = '', + placeholder = '', + currency = '', + value, + readonly, + usd, + setValue, + invalid, + } = props; + + const handleInput = (e: React.FormEvent) => { + if (!readonly && setValue) { + setValue(e.currentTarget.value); + } + }; + + return ( +
+
{label}
+
+ + {usd && ( +
+

~${formatDollarValue(usd)}

+
+ )} +
+

{currency}

+
+
+
+ ); + } + + const isBuy = buySellState?.code === 'buy'; + + async function postOrder() { + const price = new Decimal(priceState); + const amount = new Decimal(amountState); + + const isFull = + price.greaterThan(0) && + price.lessThan(1000000000) && + amount.greaterThan(0) && + amount.lessThan(1000000000); + + if (!isFull) return; + + const orderData: CreateOrderData = { + type: isBuy ? 'buy' : 'sell', + side: 'limit', + price: price.toString(), + amount: amount.toString(), + pairId: typeof router.query.id === 'string' ? router.query.id : '', + }; + + setCreatingState(true); + const result = await createOrder(orderData); + setCreatingState(false); + + if (result.success) { + if (result.data?.immediateMatch) { + setHasImmediateMatch(true); + } + } else { + setAlertState('error'); + if (result.data === 'Same order') { + setAlertSubtitle('Order already exists'); + } else { + setAlertSubtitle('Failed to create order'); + } + + setTimeout(() => { + setAlertState(null); + setAlertSubtitle(''); + }, 3000); + } + } + + function onRangeInput(e: ChangeEvent) { + setRangeInputValue(e.target.value); + if (balance) { + const rangeValue = new Decimal(e.target.value || '0'); + const balanceDecimal = new Decimal(balance || '0'); + const calculatedAmount = balanceDecimal.mul(rangeValue.div(100)).toString(); + setAmountFunction(calculatedAmount || ''); + } + } + + let buttonText; + + if (creatingState) { + buttonText = 'Creating...'; + } else if (isBuy) { + buttonText = 'Buy'; + } else { + buttonText = 'Sell'; + } + + return ( +
+ {hasImmediateMatch && ( + + success +
+

Apply the order

+

You have to apply the order

+ +
+
+ } + close={() => setHasImmediateMatch(false)} + /> + )} + +
+
New order
+ +
+ +
+ {LabeledInput({ + value: priceState, + setValue: setPriceFunction, + currency: secondCurrencyName, + placeholder: '0.00', + label: 'Price', + invalid: !!priceState && !priceValid, + })} + {LabeledInput({ + value: amountState, + setValue: setAmountFunction, + currency: firstCurrencyName, + placeholder: '0.00', + label: 'Amount', + invalid: !!amountState && !amountValid, + })} + + {LabeledInput({ + value: totalState, + setValue: () => undefined, + currency: secondCurrencyName, + placeholder: '0.00', + label: 'Total', + readonly: true, + invalid: !!totalState && !totalValid, + usd: totalUsd, + })} + {state.wallet?.connected ? ( + + ) : ( + + )} +
+

+ Fee: 0.01 Zano +

+
+
+
+ ); +} + +export default InputPanelItem; diff --git a/src/pages/dex/trading/OrdersBuySellSwitch/OrdersBuySellSwitch.module.scss b/src/pages/dex/trading/OrdersBuySellSwitch/OrdersBuySellSwitch.module.scss new file mode 100644 index 0000000..aac0fd1 --- /dev/null +++ b/src/pages/dex/trading/OrdersBuySellSwitch/OrdersBuySellSwitch.module.scss @@ -0,0 +1,31 @@ +.orders-buy-sell-switch { + display: flex; + align-items: center; + gap: 8px; + background-color: transparent !important; + cursor: pointer; + + &:hover { + opacity: 0.7; + } + + > p { + font-size: 16px; + font-weight: 600; + color: #16d1d6; + } + + > svg > * { + fill: transparent; + } + + &.orders-buy-sell-switch_sell { + > p { + color: #ff6767; + } + + > svg > * { + stroke: #ff6767; + } + } +} diff --git a/src/pages/dex/trading/OrdersBuySellSwitch/OrdersBuySellSwitch.tsx b/src/pages/dex/trading/OrdersBuySellSwitch/OrdersBuySellSwitch.tsx new file mode 100644 index 0000000..fbe8d93 --- /dev/null +++ b/src/pages/dex/trading/OrdersBuySellSwitch/OrdersBuySellSwitch.tsx @@ -0,0 +1,33 @@ +import HorizontalSelectProps from '@/interfaces/props/components/UI/HorizontalSelect/HorizontalSelectProps'; +import { ReactComponent as ArrowIcon } from '@/assets/images/UI/trade_arrow.svg'; +import SelectValue from '@/interfaces/states/pages/dex/trading/InputPanelItem/SelectValue'; +import { classes } from '@/utils/utils'; +import styles from './OrdersBuySellSwitch.module.scss'; + +export default function OrdersBuySellSwitch({ + body, + value, + setValue, + className, +}: HorizontalSelectProps) { + const defaultValue = body[0]; + + const buyValue = body.find((e) => e.code === 'buy'); + const sellValue = body.find((e) => e.code === 'sell'); + + const isBuy = value.code === 'buy'; + + return ( + + ); +} diff --git a/src/pages/dex/trading/TimeLeft/TimeLeft.tsx b/src/pages/dex/trading/TimeLeft/TimeLeft.tsx new file mode 100644 index 0000000..da7dbf5 --- /dev/null +++ b/src/pages/dex/trading/TimeLeft/TimeLeft.tsx @@ -0,0 +1,22 @@ +import { localeTimeLeft } from '@/utils/utils'; +import { useEffect, useState } from 'react'; + +function TimeLeft(props: { timestamp: string }) { + const [now, setNow] = useState(null); + + useEffect(() => { + setNow(Date.now()); + + const id = setInterval(() => { + setNow(Date.now()); + }, 1000); + + return () => { + clearInterval(id); + }; + }, []); + + return

{localeTimeLeft(now, parseInt(props.timestamp, 10))}

; +} + +export default TimeLeft; diff --git a/src/pages/dex/trading/[id].tsx b/src/pages/dex/trading/[id].tsx new file mode 100644 index 0000000..facc6e1 --- /dev/null +++ b/src/pages/dex/trading/[id].tsx @@ -0,0 +1,1411 @@ +import styles from '@/styles/Trading.module.scss'; +import Footer from '@/components/default/Footer/Footer'; +import Header from '@/components/default/Header/Header'; +import PageTitle from '@/components/default/PageTitle/PageTitle'; +import { ReactComponent as ClockIcon } from '@/assets/images/UI/clock_icon.svg'; +import { ReactComponent as UpIcon } from '@/assets/images/UI/up_icon.svg'; +import { ReactComponent as DownIcon } from '@/assets/images/UI/down_icon.svg'; +import { ReactComponent as VolumeIcon } from '@/assets/images/UI/volume_icon.svg'; +import { ReactComponent as NoOffersIcon } from '@/assets/images/UI/no_offers.svg'; +import { ReactComponent as ArrowRight } from '@/assets/images/UI/arrow-outlined-right.svg'; +import Dropdown from '@/components/UI/Dropdown/Dropdown'; +import HorizontalSelect from '@/components/UI/HorizontalSelect/HorizontalSelect'; +import { useContext, useEffect, useRef, useState } from 'react'; +import { Store } from '@/store/store-reducer'; +import { useRouter } from 'next/router'; +import { + applyOrder, + cancelOrder, + getOrdersPage, + confirmTransaction, + getPair, + getPairStats, + getUserOrdersPage, + getCandles, +} from '@/utils/methods'; +import ContentPreloader from '@/components/UI/ContentPreloader/ContentPreloader'; +import Link from 'next/link'; +import { nanoid } from 'nanoid'; +import { + cutAddress, + formatDollarValue, + isPositiveFloatStr, + notationToString, + roundTo, + shortenAddress, + tradingKnownCurrencies, +} from '@/utils/utils'; +import Alert from '@/components/UI/Alert/Alert'; +import socket from '@/utils/socket'; +import SelectValue from '@/interfaces/states/pages/dex/trading/InputPanelItem/SelectValue'; +import AlertType from '@/interfaces/common/AlertType'; +import PeriodState from '@/interfaces/states/pages/dex/trading/InputPanelItem/PeriodState'; +import OrderRow from '@/interfaces/common/OrderRow'; +import ApplyTip from '@/interfaces/common/ApplyTip'; +import { PageOrderData } from '@/interfaces/responses/orders/GetOrdersPageRes'; +import { PairStats } from '@/interfaces/responses/orders/GetPairStatsRes'; +import PairData from '@/interfaces/common/PairData'; +import CandleRow from '@/interfaces/common/CandleRow'; +import StatItemProps from '@/interfaces/props/pages/dex/trading/StatItemProps'; +import { confirmIonicSwap, ionicSwap } from '@/utils/wallet'; +import Decimal from 'decimal.js'; +import Tooltip from '@/components/UI/Tooltip/Tooltip'; +import { updateAutoClosedNotification } from '@/store/actions'; +import useUpdateUser from '@/hook/useUpdateUser'; +import LightningImg from '@/assets/images/UI/lightning.png'; +import RocketImg from '@/assets/images/UI/rocket.png'; +import { ReactComponent as ConnectionIcon } from '@/assets/images/UI/connection.svg'; +import Image from 'next/image'; +import CandleChart from './CandleChart/CandleChart'; +import OrdersBuySellSwitch from './OrdersBuySellSwitch/OrdersBuySellSwitch'; +import InputPanelItem from './InputPanelItem/InputPanelItem'; +import { validateTokensInput } from '../../../../shared/utils'; + +function BadgeStatus({ type = 'instant' }: { type?: 'instant' | 'high' }) { + return ( +
+ badge image + {type === 'instant' ? 'instant' : 'high volume'} +
+ ); +} + +function Trading() { + const router = useRouter(); + const fetchUser = useUpdateUser(); + + const [ordersHistory, setOrdersHistory] = useState([]); + + const orderFormRef = useRef(null); + const orderListRef = useRef(null); + + const pairId = typeof router.query.id === 'string' ? router.query.id : ''; + + const periods: PeriodState[] = [ + { + name: '1H', + code: '1h', + }, + { + name: '1D', + code: '1d', + }, + { + name: '1W', + code: '1w', + }, + { + name: '1M', + code: '1m', + }, + ]; + + const buySellValues: SelectValue[] = [ + { + name: 'Buy', + code: 'buy', + }, + { + name: 'Sell', + code: 'sell', + }, + ]; + + const { state, dispatch } = useContext(Store); + + const [userOrders, setUserOrders] = useState([]); + + const [periodsState, setPeriodsState] = useState(periods[0]); + + const [pairData, setPairData] = useState(null); + + const [candles, setCandles] = useState([]); + + const [candlesLoaded, setCandlesLoaded] = useState(false); + + const [ordersLoading, setOrdersLoading] = useState(true); + + const [myOrdersLoading, setMyOrdersLoading] = useState(true); + + const [ordersBuySell, setOrdersBuySell] = useState(buySellValues[0]); + + const [pairStats, setPairStats] = useState(null); + + const [applyTips, setApplyTips] = useState([]); + + const [alertState, setAlertState] = useState(null); + + const [alertSubtitle, setAlertSubtitle] = useState(''); + + const [matrixAddresses, setMatrixAddresses] = useState([]); + + async function updateOrders() { + setOrdersLoading(true); + const result = await getOrdersPage(pairId); + if (!result.success) return; + setOrdersHistory(result?.data || []); + setOrdersLoading(false); + } + + async function socketUpdateOrders() { + const result = await getUserOrdersPage(pairId); + + if (result.success) { + setUserOrders(result?.data?.orders || []); + setApplyTips(result?.data?.applyTips || []); + } + } + + useEffect(() => { + socket.emit('in-trading', { id: router.query.id }); + + return () => { + socket.emit('out-trading', { id: router.query.id }); + }; + }, []); + + useEffect(() => { + socket.on('new-order', async (data) => { + setOrdersHistory([data.orderData, ...ordersHistory]); + await socketUpdateOrders(); + }); + + socket.on('delete-order', async () => { + await updateOrders(); + await socketUpdateOrders(); + }); + + return () => { + socket.off('new-order'); + socket.off('delete-order'); + }; + }, [ordersHistory]); + + useEffect(() => { + function onUpdateStats({ pairStats }: { pairStats: PairStats }) { + setPairStats(pairStats); + } + + socket.on('update-pair-stats', onUpdateStats); + + return () => { + socket.off('update-pair-stats', onUpdateStats); + }; + }, []); + + useEffect(() => { + socket.on('update-orders', async () => { + await socketUpdateOrders(); + }); + + return () => { + socket.off('update-orders'); + }; + }, []); + + // Detect registered addresses + const hasConnection = (address: string) => + matrixAddresses.some( + (item: { address: string; registered: boolean }) => + item.address === address && item.registered, + ); + + const filteredOrdersHistory = ordersHistory + ?.filter((e) => e.type === ordersBuySell.code) + ?.filter((e) => e.user.address !== state.wallet?.address) + ?.sort((a, b) => { + if (ordersBuySell.code === 'buy') { + return parseFloat(b.price.toString()) - parseFloat(a.price.toString()); + } + return parseFloat(a.price.toString()) - parseFloat(b.price.toString()); + }); + + // Get registered addresses from matrix + useEffect(() => { + const fetchConnections = async () => { + const filteredAddresses = ordersHistory?.map((e) => e?.user?.address); + if (!filteredAddresses.length) return; + const response = await fetch('https://messenger.zano.org/api/get-addresses', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + addresses: filteredAddresses, + }), + }); + + const data = await response.json(); + setMatrixAddresses(data.addresses); + }; + + fetchConnections(); + }, [ordersHistory]); + + const firstCurrencyName = pairData?.first_currency?.name || ''; + const secondCurrencyName = pairData?.second_currency?.name || ''; + + const firstAssetId = pairData ? pairData.first_currency?.asset_id : undefined; + const secondAssetId = pairData ? pairData.second_currency?.asset_id : undefined; + const firstAssetLink = firstAssetId + ? `https://explorer.zano.org/assets?asset_id=${encodeURIComponent(firstAssetId)}` + : undefined; + const secondAssetLink = secondAssetId + ? `https://explorer.zano.org/assets?asset_id=${encodeURIComponent(secondAssetId)}` + : undefined; + + const secondAssetUsdPrice = state.assetsRates.get(secondAssetId || ''); + + useEffect(() => { + async function fetchPairStats() { + const result = await getPairStats(pairId); + if (!result.success) return; + setPairStats(result.data); + } + + fetchPairStats(); + }, []); + + useEffect(() => { + async function fetchCandles() { + setCandlesLoaded(false); + setCandles([]); + const result = await getCandles(pairId, periodsState.code); + if (result.success) { + setCandles(result.data); + } else { + setCandles([]); + } + setCandlesLoaded(true); + } + + fetchCandles(); + }, [periodsState]); + + useEffect(() => { + async function getPairData() { + const result = await getPair(pairId); + if (!result.success) { + router.push('/404'); + return; + } + setPairData(result.data); + } + + getPairData(); + }, []); + + async function updateUserOrders() { + setMyOrdersLoading(true); + const result = await getUserOrdersPage(pairId); + console.log('result getuserorderspage', result); + await fetchUser(); + + if (!result.success) return; + setUserOrders(result?.data?.orders || []); + setApplyTips(result?.data?.applyTips || []); + setMyOrdersLoading(false); + } + + const loggedIn = !!state.wallet?.connected; + + useEffect(() => { + if (!loggedIn) return; + setUserOrders([]); + updateUserOrders(); + }, [state.wallet?.connected && state.wallet?.address]); + + useEffect(() => { + updateOrders(); + }, []); + + // useEffect(() => { + // socket.on + // }, []); + + const [priceState, setPriceState] = useState(''); + const [amountState, setAmountState] = useState(''); + const [totalState, setTotalState] = useState(''); + + const [totalUsd, setTotalUsd] = useState(undefined); + + const [priceValid, setPriceValid] = useState(false); + const [amountValid, setAmountValid] = useState(false); + const [totalValid, setTotalValid] = useState(false); + + const [buySellState, setBuySellState] = useState(buySellValues[0]); + + const [rangeInputValue, setRangeInputValue] = useState('50'); + + useEffect(() => { + let totalDecimal: Decimal | undefined; + + try { + totalDecimal = new Decimal(totalState); + } catch (err) { + console.log(err); + } + + const zanoPrice = state.assetsRates.get(pairData?.second_currency?.asset_id || ''); + + setTotalUsd(zanoPrice && totalDecimal ? totalDecimal.mul(zanoPrice).toFixed(2) : undefined); + }, [totalState, state.assetsRates, pairData?.second_currency?.asset_id]); + + function setPriceFunction(inputValue: string) { + if (inputValue !== '' && !isPositiveFloatStr(inputValue)) { + return; + } + + try { + const value = new Decimal(inputValue || NaN); + + if (value.toString().replace('.', '').length > 18) { + console.log('TOO MANY DECIMALS'); + return; + } + } catch (error) { + console.log(error); + } + + setPriceState(inputValue); + + if (!inputValue) { + setTotalState(''); + setTotalValid(false); + setPriceValid(false); + return; + } + + const valueDecimal = new Decimal(inputValue || NaN); + const amountDecimal = new Decimal(amountState || NaN); + + const secondCurrencyDP = pairData?.second_currency.asset_info?.decimal_point || 12; + + const validationResult = validateTokensInput(inputValue, secondCurrencyDP); + + if (!validationResult.valid) { + setTotalState(''); + setTotalValid(false); + setPriceValid(false); + return; + } + + setPriceValid(true); + + if (!valueDecimal.isNaN() && !amountDecimal.isNaN() && amountState !== '') { + const total = valueDecimal.mul(amountDecimal).toFixed(); + setTotalState(total); + + const totalValidationResult = validateTokensInput(total, secondCurrencyDP); + + setTotalValid(totalValidationResult.valid); + } else { + setTotalState(''); + setTotalValid(false); + } + } + + const assets = state.wallet?.connected ? state.wallet?.assets || [] : []; + + const balance = assets.find((e) => e.ticker === firstCurrencyName)?.balance; + + function setAmountFunction(inputValue: string) { + if (inputValue !== '' && !isPositiveFloatStr(inputValue)) { + return; + } + + try { + const value = new Decimal(inputValue || NaN); + + if (value.toString().replace('.', '').length > 18) { + console.log('TOO MANY DECIMALS'); + return; + } + } catch (error) { + console.log(error); + } + + setAmountState(inputValue); + + if (!inputValue) { + setTotalState(''); + setTotalValid(false); + setAmountValid(false); + return; + } + + const value = new Decimal(inputValue || NaN); + const price = new Decimal(priceState || NaN); + + const validationResult = validateTokensInput( + inputValue, + pairData?.first_currency.asset_info?.decimal_point || 12, + ); + console.log(validationResult); + + if (!validationResult.valid) { + setTotalState(''); + setTotalValid(false); + setAmountValid(false); + return; + } + + setAmountValid(true); + + if (balance) setRangeInputValue(value.div(balance).mul(100).toFixed()); + + if (!price.isNaN() && !value.isNaN() && priceState !== '') { + const total = value.mul(price).toFixed(); + setTotalState(total); + + const totalValidationResult = validateTokensInput( + total, + pairData?.second_currency.asset_info?.decimal_point || 12, + ); + + setTotalValid(totalValidationResult.valid); + } else { + setTotalState(''); + setTotalValid(false); + } + } + + function setCorrespondingOrder(price: number, amount: number) { + const priceDecimal = new Decimal(price || 0); + const amountDecimal = new Decimal(amount || 0); + const totalDecimal = priceDecimal.mul(amountDecimal); + + setPriceFunction(notationToString(priceDecimal.toString()) || ''); + setAmountFunction(notationToString(amountDecimal.toString()) || ''); + setTotalState(notationToString(totalDecimal.toString()) || ''); + + if (balance) { + const balanceDecimal = new Decimal(balance); + + const percentageDecimal = amountDecimal.div(balanceDecimal).mul(100); + setRangeInputValue(percentageDecimal.toFixed() || ''); + } + + const total = priceDecimal.mul(amountDecimal).toFixed(); + + const totalValidationResult = validateTokensInput( + total, + pairData?.second_currency.asset_info?.decimal_point || 12, + ); + + setTotalValid(totalValidationResult.valid); + } + + function StatItem(props: StatItemProps) { + const { Img } = props; + + return ( +
+
+ +

{props.title}

+
+
+

{props.value}

+ {props.coefficient !== undefined && ( +

= 0 + ? styles.coefficient__green + : styles.coefficient__red + } + > + {props.coefficient >= 0 ? '+' : ''} + {props.coefficient?.toFixed(2)}% +

+ )} +
+
+ ); + } + + function takeOrderClick( + event: React.MouseEvent, + e: PageOrderData, + ) { + event.preventDefault(); + setCorrespondingOrder(e.price, e.amount); + setBuySellState( + buySellValues.find((e) => e.code !== ordersBuySell.code) || buySellValues[0], + ); + + if (!orderFormRef.current) return; + + orderFormRef.current.scrollIntoView({ behavior: 'smooth' }); + } + + //* * FOR USAGE IN THIS PAGE TABLES ONLY */ + function OrderRowTooltipCell({ + style, + children, + sideText, + sideTextColor, + }: { + style?: React.CSSProperties; + children: string; + sideText?: string; + sideTextColor?: string; + }) { + const [showTooltip, setShowTooltip] = useState(false); + + const tooltipText = `${children}${sideText ? ` ~${sideText}` : ''}`; + + const isLongContent = tooltipText.length > 14; + + return ( + +

setShowTooltip(true)} + onMouseLeave={() => setShowTooltip(false)} + > + {children} + {sideText && ( + + {sideText} + + )} +

+ {isLongContent && ( + + {tooltipText} + + )} + + ); + } + + function MatrixConnectionBadge({ + userAdress, + userAlias, + }: { + userAdress?: string; + userAlias?: string; + }) { + const [connectionTooltip, setConnectionTooltip] = useState(false); + return userAdress && hasConnection(userAdress) ? ( + <> + setConnectionTooltip(true)} + onMouseLeave={() => setConnectionTooltip(false)} + style={{ marginTop: '4px', cursor: 'pointer', position: 'relative' }} + > + + + + Matrix connection + + + ) : ( + <> + ); + } + + function OrdersRow(props: { orderData: PageOrderData; percentage: number }) { + const e = props?.orderData || {}; + const percentage = props?.percentage; + + const totalDecimal = new Decimal(e.left).mul(new Decimal(e.price)); + const totalValue = secondAssetUsdPrice + ? totalDecimal.mul(secondAssetUsdPrice).toFixed(2) + : undefined; + + const [showTooltip, setShowTooltip] = useState(false); + + let sideText: string; + + if (!secondAssetUsdPrice) { + sideText = 'undefined'; + } else { + const value = secondAssetUsdPrice * e.price; + sideText = e.price < 0.9 ? `$${value.toFixed(5)}` : `$${value.toFixed(2)}`; + } + + return ( + + +

setShowTooltip(true)} + onMouseLeave={() => setShowTooltip(false)} + > + @{cutAddress(e.user?.alias || 'no alias', 12)} + +

+ {e.isInstant && } + {/* High volume */} + {/* */} + + {e.user?.alias.length > 12 && ( + + {e.user?.alias} + + )} + + + {notationToString(e.price)} + + {notationToString(e.amount)} + {notationToString(e.left)} + + {notationToString(totalDecimal.toString())} + + {/*

{localeTimeLeft(now, parseInt(e.expiration_timestamp, 10))}

*/} + + takeOrderClick(event, e)} + style={{ + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + width: '18px', + height: '18px', + }} + > + + + +
+ + + ); + } + + function MyOrdersRow(props: { orderData: OrderRow }) { + const e = props?.orderData || {}; + const [cancellingState, setCancellingState] = useState(false); + + const totalDecimal = new Decimal(e.left).mul(new Decimal(e.price)); + const totalValue = secondAssetUsdPrice + ? totalDecimal.mul(secondAssetUsdPrice).toFixed(2) + : undefined; + + const [showTooltip, setShowTooltip] = useState(false); + + async function cancelClick(event: React.MouseEvent) { + event.preventDefault(); + + setCancellingState(true); + const result = await cancelOrder(e.id); + + setCancellingState(false); + + if (!result.success) { + setAlertState('error'); + setAlertSubtitle('Error while cancelling order'); + setTimeout(() => { + setAlertState(null); + setAlertSubtitle(''); + }, 3000); + return; + } + + await updateOrders(); + await updateUserOrders(); + await fetchUser(); + } + + return ( + + +

setShowTooltip(true)} + onMouseLeave={() => setShowTooltip(false)} + > + @ + {cutAddress( + state.wallet?.connected && state.wallet?.alias + ? state.wallet.alias + : 'no alias', + 12, + )} + +

+ {e.isInstant && } + {(state.wallet?.connected && state.wallet?.alias ? state.wallet?.alias : '') + ?.length > 12 && ( + + {state.wallet?.connected && state.wallet?.alias} + + )} + {/* High volume */} + {/* */} + + + {notationToString(e.price)} + + {notationToString(e.amount)} + {notationToString(e.left)} + + {notationToString(totalDecimal.toString())} + + {/* {localeTimeLeft(now, parseInt(e.expiration_timestamp, 10))} */} + +

+ {applyTips?.filter((tip) => tip.connected_order_id === e.id)?.length || 0} +

+ + + + {cancellingState ? 'Process' : 'Cancel'} + + + + ); + } + + function MyOrdersApplyRow(props: { orderData: ApplyTip }) { + const e = props?.orderData || {}; + + const [applyingState, setApplyingState] = useState(false); + + const connectedOrder = userOrders.find((order) => order.id === e.connected_order_id); + + const totalDecimal = new Decimal(e.left).mul(new Decimal(e.price)); + const totalValue = secondAssetUsdPrice + ? totalDecimal.mul(secondAssetUsdPrice).toFixed(2) + : undefined; + + const [showTooltip, setShowTooltip] = useState(false); + + async function applyClick(event: React.MouseEvent) { + event.preventDefault(); + + if (e.id) { + updateAutoClosedNotification(dispatch, [ + ...state.closed_notifications, + parseInt(e.id, 10), + ]); + } + + function alertErr(subtitle: string) { + setAlertState('error'); + setAlertSubtitle(subtitle); + setTimeout(() => { + setAlertState(null); + setAlertSubtitle(''); + }, 3000); + } + + setApplyingState(true); + interface SwapOperationResult { + success: boolean; + message?: string; + errorCode?: number; + data?: unknown; + } + + let result: SwapOperationResult | null = null; + + await (async () => { + if (e.transaction) { + if (!e.hex_raw_proposal) { + alertErr('Invalid transaction data received'); + return; + } + + console.log(e.hex_raw_proposal); + + const confirmSwapResult = await confirmIonicSwap(e.hex_raw_proposal); + + console.log(confirmSwapResult); + + if (confirmSwapResult.data?.error?.code === -7) { + alertErr('Insufficient funds'); + return; + } + if (!confirmSwapResult.data?.result) { + alertErr('Companion responded with an error'); + return; + } + + result = await confirmTransaction(e.id); + } else { + const firstCurrencyId = pairData?.first_currency.asset_id; + const secondCurrencyId = pairData?.second_currency.asset_id; + + console.log(firstCurrencyId, secondCurrencyId); + + if (!(firstCurrencyId && secondCurrencyId)) { + alertErr('Invalid transaction data received'); + return; + } + + if (!connectedOrder) return; + + const leftDecimal = new Decimal(e.left); + const priceDecimal = new Decimal(e.price); + + const params = { + destinationAssetID: e.type === 'buy' ? secondCurrencyId : firstCurrencyId, + destinationAssetAmount: notationToString( + e.type === 'buy' + ? leftDecimal.mul(priceDecimal).toString() + : leftDecimal.toString(), + ), + currentAssetID: e.type === 'buy' ? firstCurrencyId : secondCurrencyId, + currentAssetAmount: notationToString( + e.type === 'buy' + ? leftDecimal.toString() + : leftDecimal.mul(priceDecimal).toString(), + ), + + destinationAddress: e.user.address, + }; + + console.log(params); + + const createSwapResult = await ionicSwap(params); + + console.log(createSwapResult); + + const hex = createSwapResult?.data?.result?.hex_raw_proposal; + + if (createSwapResult?.data?.error?.code === -7) { + alertErr('Insufficient funds'); + return; + } + if (!hex) { + alertErr('Companion responded with an error'); + return; + } + + result = await applyOrder({ + ...e, + hex_raw_proposal: hex, + }); + } + })(); + + setApplyingState(false); + + if (!result) { + return; + } + + if (!(result as { success: boolean }).success) { + alertErr('Server responded with an error'); + return; + } + + await updateOrders(); + await updateUserOrders(); + await fetchUser(); + } + + return ( + + +

setShowTooltip(true)} + onMouseLeave={() => setShowTooltip(false)} + > + @{cutAddress(e.user.alias, 12) || 'no alias'} + +

+ {(e.isInstant || e.transaction) && } + + {e.user?.alias.length > 12 && ( + + {e.user?.alias} + + )} + {/* High volume */} + {/* */} + + + + {notationToString(e.price)} + + {notationToString(e.left)} + + + {notationToString(totalDecimal.toString())} + + {/* {localeTimeLeft(now, parseInt(e.expiration_timestamp, 10))} */} + + + + {applyingState ? 'Process' : 'Apply'} + + + + ); + } + + const imgCode = + pairData && tradingKnownCurrencies.includes(pairData.first_currency?.code) + ? pairData.first_currency?.code + : 'tsds'; + + const coefficient = pairStats?.coefficient || 0; + const coefficientOutput = + parseFloat(coefficient?.toFixed(2) || '0') === -100 + ? -99.99 + : parseFloat(coefficient?.toFixed(2) || '0'); + + const ordersIsBuy = ordersBuySell.code === 'buy'; + const shownOrdersAmount = filteredOrdersHistory.filter( + (e) => (e.type === 'buy') === ordersIsBuy, + ).length; + + const ordersSummaryFunds = filteredOrdersHistory + .reduce( + (acc, e) => acc.add(new Decimal(e.left).mul(new Decimal(e.price)).toNumber()), + new Decimal(0), + ) + .toDP(5) + .toFixed(); + + const pairRateUsd = + pairStats?.rate !== undefined && secondAssetUsdPrice !== undefined + ? new Decimal(pairStats.rate) + .mul(secondAssetUsdPrice) + .toFixed(pairStats.rate < 0.1 ? 6 : 2) + : undefined; + + const scrollToOrderList = () => { + if (!orderListRef.current) return; + + orderListRef.current.scrollIntoView({ behavior: 'smooth' }); + }; + + return ( + <> +
+
+
+ +
+
+
+ currency +
+
+

+ {!( + pairData && + pairData.first_currency?.name && + pairData.second_currency?.name + ) ? ( + '...' + ) : ( + <> + {firstCurrencyName} + /{secondCurrencyName} + + )} +

+
+

+ {notationToString(pairStats?.rate || 0)}{' '} + {secondCurrencyName} +

+ {pairRateUsd && ( + <> +
+

+ ${pairRateUsd} +

+ + )} +
+
+
+ {pairData && firstAssetLink && secondAssetLink && ( +
+

+ {firstCurrencyName}:{' '} + + {shortenAddress(firstAssetId || '')} + +

+

+ {secondCurrencyName}:{' '} + + {shortenAddress(secondAssetId || '')} + +

+
+ )} +
+ +
+ + + + +
+
+ +
+
+ {InputPanelItem({ + priceState, + amountState, + totalState, + buySellValues, + buySellState, + setBuySellState, + setPriceFunction, + setAmountFunction, + setAlertState, + setAlertSubtitle, + setRangeInputValue, + rangeInputValue, + firstCurrencyName, + secondCurrencyName, + balance: Number(balance), + priceValid, + amountValid, + totalValid, + totalUsd, + scrollToOrderList, + })} +
+
+
+ + undefined} + /> +
+ + {candlesLoaded ? ( + + ) : ( + + )} +
+
+ +
+
+
+
+
+
+ {ordersBuySell.code === 'buy' ? 'Buy' : 'Sell'} Orders + {/* {firstCurrencyName && secondCurrencyName ? " - " + firstCurrencyName + "/" + secondCurrencyName : ""} */} +
+
+

+ {firstCurrencyName && secondCurrencyName + ? `${firstCurrencyName}/${secondCurrencyName}` + : ''} +

+
+ +
+
+

+ {shownOrdersAmount}{' '} + {shownOrdersAmount === 1 ? 'order' : 'orders'} +

+
+
+

+ {ordersSummaryFunds} {secondCurrencyName} +

+
+
+
+ {/* */} + +
+ +
+ + + + + + + + + + + + {!ordersLoading && !!filteredOrdersHistory.length && ( + + {filteredOrdersHistory?.map((e) => { + const maxValue = Math.max( + ...filteredOrdersHistory.map((order) => + parseFloat(String(order.left)), + ), + ); + const percentage = ( + (parseFloat(String(e.left)) / maxValue) * + 100 + ).toFixed(2); + + return ( + + ); + })} + + )} +
Alias + Price
({secondCurrencyName}) +
+ Amount
({firstCurrencyName}) +
+ Remaining
({firstCurrencyName}) +
+ {' '} + Total
({secondCurrencyName}) +
+ + {!filteredOrdersHistory.length && !ordersLoading && ( +
+ +
No orders
+
+ )} + {ordersLoading && ( + + )} +
+
+
+
+
My Orders
+ +
+

+ {applyTips?.length || 0} Offer + {(applyTips?.length || 0) === 1 ? '' : 's'} +

+
+
+ +
+ + + + + + + + + + + + +
Alias + Price
({secondCurrencyName}) +
+ Amount
({firstCurrencyName}) +
+ Remaining
({firstCurrencyName}) +
+ Total
({secondCurrencyName}) +
Offers
+ {!myOrdersLoading && loggedIn && !!userOrders.length && ( +
+ + + {userOrders.map((e) => ( + + ))} + +
+ {!!applyTips.length && ( + + + {applyTips.map((e) => ( + + ))} + +
+ )} +
+ )} + + {myOrdersLoading && loggedIn && ( + + )} + + {!loggedIn && ( +
+ +
Connect wallet to see your orders
+
+ )} + + {loggedIn && !userOrders.length && !myOrdersLoading && ( +
+ +
No orders
+
+ )} +
+
+
+ + {alertState && ( + setAlertState(null)} + /> + )} +
+