commit 6e179191d8208d1658421cf1212db1432df273bc Author: James Jia - Test Date: Thu Aug 17 15:52:35 2023 -0700 Initial commit diff --git a/.env b/.env new file mode 100644 index 0000000..acb3efa --- /dev/null +++ b/.env @@ -0,0 +1,18 @@ +VITE_BASE_URL=https://v4.testnet.dydx.exchange + +VITE_ALCHEMY_API_KEY=FP275q327Yh7qswtZWenbPXdZZdnAFmC + +VITE_FAUCET_URL_DEV=https://faucet.v4dev.dydx.exchange/ +VITE_FAUCET_URL_STAGE=https://faucet.v4staging.dydx.exchange/ +VITE_FAUCET_URL_TESTNET2=https://faucet.v4testnet2.dydx.exchange/ + +VITE_VALIDATOR_URL_DEV=http://52.192.187.113:26657/ +VITE_VALIDATOR_URL_STAGE=https://validator.v4staging.dydx.exchange/ +VITE_VALIDATOR_URL_TESTNET2=https://validator.v4testnet2.dydx.exchange/ + +VITE_INDEXER_URL_DEV=http://dev-indexer-apne1-lb-public-890774175.ap-northeast-1.elb.amazonaws.com +VITE_INDEXER_URL_STAGE=https://indexer.v4staging.dydx.exchange +VITE_INDEXER_URL_TESTNET2=https://indexer.v4testnet2.dydx.exchange + +VITE_WALLETCONNECT1_BRIDGE=wss://api.dydx.exchange/wc/ +VITE_WALLETCONNECT2_PROJECT_ID=fbe94eaa691fa8d929561f8567062b32 diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..0a69401 --- /dev/null +++ b/.env.example @@ -0,0 +1,17 @@ +VITE_BASE_URL= + +VITE_ALCHEMY_API_KEY= +VITE_PK_ENCRYPTION_KEY= +VITE_WALLETCONNECT2_PROJECT_ID= + +VITE_FAUCET_URL_DEV= +VITE_FAUCET_URL_STAGE= +VITE_FAUCET_URL_TESTNET2= + +VITE_VALIDATOR_URL_DEV= +VITE_VALIDATOR_URL_STAGE= +VITE_VALIDATOR_URL_TESTNET2= + +VITE_INDEXER_URL_DEV= +VITE_INDEXER_URL_STAGE= +VITE_INDEXER_URL_TESTNET2= diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..1dd398d --- /dev/null +++ b/.eslintignore @@ -0,0 +1,19 @@ +/node_modules +vite-env.d.ts +polyfills.ts +vite.config.ts + +# Temporarily ignore, we will slowly remove each directory as we fix files to follow ESLint rules +/src/components +/src/dialogs +/src/forms +/src/hooks +/src/history.ts +/src/icons +/src/lib +/src/main.tsx +/src/menus +/src/pages +/src/state +/src/styles +/src/views diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..ae7f722 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,97 @@ +{ + "env": { + "browser": true, + "es2021": true + }, + "extends": [ + "airbnb", + "airbnb-typescript", + "plugin:prettier/recommended", + "plugin:react/recommended", + "plugin:react-hooks/recommended", + "prettier" + ], + "overrides": [], + "parserOptions": { + "project": "./tsconfig.json", + "ecmaVersion": "latest", + "sourceType": "module" + }, + "plugins": ["react", "prettier"], + "parser": "@typescript-eslint/parser", + "rules": { + "class-methods-use-this": "off", + "import/extensions": "off", + "import/no-extraneous-dependencies": [ + "error", + { + "devDependencies": ["./scripts/*.js"] + } + ], + "import/no-named-as-default": "off", + "import/prefer-default-export": "off", + "jsx-a11y/anchor-is-valid": "off", + "jsx-a11y/click-events-have-key-events": "off", + "no-continue": "off", + "no-console": [ + "error", + { + "devDependencies": ["./scripts/*.js"] + } + ], + "no-lonely-if": "off", + "no-nested-ternary": "off", + "no-return-assign": "off", + "no-return-await": "off", + "no-underscore-dangle": "off", + "no-use-before-define": "off", + "prefer-destructuring": "off", + "prettier/prettier": "error", + "react/forbid-prop-types": "off", + "react/function-component-definition": [ + "error", + { "namedComponents": "arrow-function", "unnamedComponents": "arrow-function" } + ], + "react/jsx-curly-newline": "off", + "react/jsx-filename-extension": ["error", { "extensions": [".js", ".jsx", ".ts", ".tsx"] }], + "react/jsx-fragments": "off", + "react/jsx-one-expression-per-line": "off", + "react/jsx-props-no-spreading": "off", + "react/jsx-wrap-multilines": "off", + "react/jsx-indent": "off", + "react/no-danger": "off", + "react/react-in-jsx-scope": "off", + "react/require-default-props": "off", + "react/sort-comp": "off", + "@typescript-eslint/no-use-before-define": "off", + "@typescript-eslint/comma-dangle": "off", + "@typescript-eslint/member-delimiter-style": [ + "error", + { + "multiline": { + "delimiter": "semi", + "requireLast": true + }, + "singleline": { + "delimiter": "semi", + "requireLast": false + }, + "multilineDetection": "brackets" + } + ], + "@typescript-eslint/semi": "off" + }, + "globals": { + "fetch": true, + "window": true, + "document": true, + "globalThis": true + }, + "settings": { + "import/resolver": { + "typescript": { + "project": "./tsconfig.json" + } + } + } +} diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..de27fed --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,79 @@ + + + + +--- + + + +## Views + +* New: `` + * + * + +* `` + * + * New: `` + * Rename: `` → `` + * + +## Components + +* New: `` + * + * + +* `` + * + * New: `` + * Rename: `` → `` + * + +## Styles/Mixins + +* `styles/_____` + * + * New: `` + * Rename: `` → `` + * + +## Constants/Types + +* `constants/_____` + * + * + +## Functions + +* `lib/_____` + * + * + +## Hooks + +* `hooks/_____` + * + * + +## State + +* `state/_____` + * + * + +## Packages + +* `package-name` + * + * updated: v__ -> v__ + +## Workflows + +* `workflow-name.yml` + * + * + +--- + + diff --git a/.github/workflows/deploy-staging.yml b/.github/workflows/deploy-staging.yml new file mode 100644 index 0000000..8bb757e --- /dev/null +++ b/.github/workflows/deploy-staging.yml @@ -0,0 +1,41 @@ +name: Deploy to v4.stage.dydx.exchange + +on: + workflow_dispatch: + +jobs: + deploy: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Set up pnpm + uses: dydxprotocol/setup-pnpm@v1 + + - name: Set up Node + uses: actions/setup-node@v3 + with: + node-version: 18 + registry-url: https://registry.npmjs.org/ + cache: pnpm + + - name: Install dependencies + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + run: | + pnpm install --loglevel warn + + - name: Build + env: + NODE_OPTIONS: '--max-old-space-size=4096' + run: | + pnpm run build --mode staging + + - name: Upload to IPFS via web3.storage + uses: dydxprotocol/add-to-web3@v1 + id: web3storage + with: + web3_token: ${{ secrets.WEB3_STORAGE_TOKEN }} + path_to_add: 'dist' \ No newline at end of file diff --git a/.github/workflows/deploy-testnet.yml b/.github/workflows/deploy-testnet.yml new file mode 100644 index 0000000..8aef558 --- /dev/null +++ b/.github/workflows/deploy-testnet.yml @@ -0,0 +1,55 @@ +name: Deploy to v4.testnet.dydx.exchange + +on: + workflow_dispatch: + +jobs: + deploy: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Set up pnpm + uses: dydxprotocol/setup-pnpm@v1 + + - name: Set up Node + uses: actions/setup-node@v3 + with: + node-version: 18 + registry-url: https://registry.npmjs.org/ + cache: pnpm + + - name: Install dependencies + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + run: | + pnpm install --loglevel warn + + - name: Build + env: + NODE_OPTIONS: '--max-old-space-size=4096' + AMPLITUDE_API_KEY: ${{ secrets.AMPLITUDE_API_KEY }} + BUGSNAG_API_KEY: ${{ secrets.BUGSNAG_API_KEY }} + STATUS_PAGE_SCRIPT_URI: ${{ secrets.STATUS_PAGE_SCRIPT_URI }} + run: | + pnpm run build + pnpm run build:inject-amplitude + pnpm run build:inject-bugsnag + pnpm run build:inject-statuspage + + - name: Upload to IPFS via web3.storage + uses: dydxprotocol/add-to-web3@v1 + id: web3storage + with: + web3_token: ${{ secrets.WEB3_STORAGE_TOKEN }} + path_to_add: 'dist' + + - name: Update IPNS record via web3name + id: web3name + env: + WEB3NAME_SIGNING_KEY: ${{ secrets.WEB3NAME_SIGNING_KEY }} + run: | + echo $WEB3NAME_SIGNING_KEY | base64 -d > .web3name.key + pnpm run deploy:update-ipns --cid=${{ steps.web3storage.outputs.cid }} --key=.web3name.key diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..384dab7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,31 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +build +node_modules +dist +dist-ssr +*.local +*.key + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +!.vscode/settings.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Charting Library +public/tradingview +public/datafeed diff --git a/.ladle/components.tsx b/.ladle/components.tsx new file mode 100644 index 0000000..40cade6 --- /dev/null +++ b/.ladle/components.tsx @@ -0,0 +1,92 @@ +import '@/polyfills'; +import { useEffect, useState } from 'react'; +import { Provider } from 'react-redux'; +import styled from 'styled-components'; + +import { store } from '@/state/_store'; + +import { SelectMenu, SelectItem } from '@/components/SelectMenu'; + +import { setLocaleLoaded } from '@/state/localization'; + +import '@/index.css'; +import './ladle.css'; + +export const StoryWrapper: React.FC<{ children: React.ReactNode }> = ({ children }) => { + const [theme, setTheme] = useState('Default theme'); + + useEffect(() => { + switch (theme) { + case 'Dark theme': { + document?.documentElement?.classList.remove('theme-light'); + document?.documentElement?.classList.add('theme-dark'); + break; + } + case 'Light theme': { + document?.documentElement?.classList.remove('theme-dark'); + document?.documentElement?.classList.add('theme-light'); + break; + } + default: { + document?.documentElement?.classList.remove('theme-dark', 'theme-light'); + break; + } + } + }, [theme]); + + useEffect(() => { + store.dispatch(setLocaleLoaded(true)); + }, []); + + return ( + + +

Active Theme:

+ + {[ + { + value: 'Default theme', + label: 'Default theme', + }, + { + value: 'Dark theme', + label: 'Dark theme', + }, + { + value: 'Light theme', + label: 'Light theme', + }, + ].map(({ value, label }) => ( + + ))} + +
+
+ {children} +
+ ); +}; + +const StoryHeader = styled.div` + display: flex; + flex-direction: row; + align-items: center; + gap: 8px; +`; + +const StoryContent = styled.div` + --default-border-width: 1px; + --border-width: var(--default-border-width); + + display: flex; + align-items: center; + justify-content: center; + height: 100%; +`; diff --git a/.ladle/ladle.css b/.ladle/ladle.css new file mode 100644 index 0000000..fdcddfc --- /dev/null +++ b/.ladle/ladle.css @@ -0,0 +1,7 @@ +:root { + --ladle-bg-color-primary: transparent; +} + +#ladle-root { + height: 100vh; +} \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..c2658d7 --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +node_modules/ diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..ab7b778 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,6 @@ +{ + "printWidth": 100, + "singleQuote": true, + "trailingComma": "es5", + "jsxBracketSameLine": false +} diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..9634540 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode", + "styled-components.vscode-styled-components" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..d42566a --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "explorer.sortOrder": "mixed" +} \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..5bb9f6a --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,34 @@ +# Contributing to Trader-Fe +We love your input! We want to make contributing to this project as easy and transparent as possible, whether it's: + +- Reporting a bug +- Discussing the current state of the code +- Submitting a fix +- Proposing new features + +## We Develop with Github +We use github to host code, to track issues and feature requests, as well as accept pull requests. + +## We Use [Github Flow](https://guides.github.com/introduction/flow/index.html), So All Code Changes Happen Through Pull Requests +Pull requests are the best way to propose changes to the codebase (we use [Github Flow](https://guides.github.com/introduction/flow/index.html)). We actively welcome your pull requests: + +1. Fork the repo and create your branch from `master`. +2. If you've added code, thoroughly test your code locally. +3. Make sure your code lints. +4. Issue that pull request! + +## Any contributions you make will be under the same License +When you submit code changes, your submissions are understood to be under the same [License](https://github.com/dydxprotocol/trader-fe/blob/master/LICENSE) that covers the project. + +## Report bugs using Github's [issues](https://github.com/dydxprotocol/trader-fe/issues) +Report a bug by [opening a new issue](https://github.com/dydxprotocol/trader-fe/issues/new). + +**Great Bug Reports** tend to have: + +- A quick summary and/or background +- Steps to reproduce + - Be specific! + - Attach screenshots or videos +- What you expected would happen +- What actually happens +- Notes (possibly including why you think this might be happening, or stuff you tried that didn't work) diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..1e62cfb --- /dev/null +++ b/LICENSE @@ -0,0 +1,11 @@ +Proprietary License © 2023 dYdX Trading Inc. + +dYdX Trading Inc. ("dYdX") hereby grants you the right to access, copy and use the code in this repository (the "Licensed Code") solely for purposes of evaluating the Licensed Code and evaluating interoperability of the Licensed Code with your products and services. + +You agree not to (a) access, copy or use the Licensed Code for any purpose other than as expressly licensed above, (b) provide, disclose or distribute the Licensed Code to any third party, or (c) modify or creative derivative works of the Licensed Code. Any violation of these terms will automatically terminate your rights under these terms. + +All copies of the Licensed Code are subject to these terms. You must conspicuously display these terms on each copy of the Licensed Code. + +dYdX intends to make the Licensed Code available under an open source license in the near term. The terms of this license apply unless and until the Licensed Code is made available by dYdX under an open source license. + +These terms do not grant you any right in any trademarks, service marks or logos of dYdX or its affiliates. TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED CODE IS PROVIDED "AS IS". DYDX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT AND TITLE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..e627075 --- /dev/null +++ b/README.md @@ -0,0 +1,85 @@ +# v4 Web App + +## Prerequisites + +- Node.js version 18 and `pnpm` installed on your system + +For deploying to IPFS, choose one of the following: + +- **Option 1:** A free [web3.storage](https://web3.storage/) account +- **Option 2:** An IPFS client such as [IPFS Kubo](https://docs.ipfs.tech/install/command-line/) + +For web3.storage, sign up for an account and generate an API token on the [API tokens page](https://web3.storage/manage/tokens). web3.storage offers an easy-to-use interface for storing and retrieving content on IPFS. + +Alternatively, follow the [IPFS Kubo installation guide](https://docs.ipfs.tech/install/command-line/) to download the IPFS command-line tool. + +## Part 1: Setting up your local environment + +### Step 1: Clone the repo + +Clone the repository and navigate to its directory: + +```bash +git clone https://github.com/dydxprotocol/trader-fe.git +cd trader-fe +``` + +### Step 2: Install pnpm and dependencies + +Install pnpm and the project dependencies: + +```bash +npm i -g pnpm +pnpm i +``` + +## Part 2: Running the project locally + +Run the following command in the project directory to start the development server: + +```bash +pnpm dev +``` + +The development server will be running at `http://localhost:5173` (or the port number displayed in the terminal). Visit this URL to interact with the web app and see your changes in real-time. + +To view component stories: + +```bash +pnpm ladle +``` + +This will automatically open your default browser at `http://localhost:61000`. + +## Part 3: Deploying to IPFS + +### web3.storage: deploy to IPFS via web3.storage using the provided script + +Export the API token as an environment variable (replace `your_token` with the generated token), and run the script to build and deploy to IPFS: + +```bash +export WEB3_STORAGE_TOKEN=your_token +pnpm run deploy:ipfs +``` + +Save the URL provided in the output, as it is the link to your deployed content on IPFS. + +### IPFS client: deploy with the command-line tool + +To use the IPFS command-line tool, run: + +```bash +ipfs add -r dist +``` + +Save the CID provided in the output. + +## Part 4: Accessing your content on IPFS + +To access your content on IPFS: + +1. **Native IPFS support in a browser:** Use a browser with native IPFS support, such as Brave or Opera. Enable a local IPFS node and visit the URL directly using the IPNS protocol, like `ipfs://your_cid`. + +2. **Public IPFS gateway:** Access your content via a public IPFS gateway, such as [https://dweb.link](https://dweb.link/) or [https://w3s.link/](https://w3s.link/). Use the gateway URL with your CID appended, like `https://dweb.link/ipfs/your_cid`. + +Replace `your_cid` with the actual CID. \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..bcb21eb --- /dev/null +++ b/index.html @@ -0,0 +1,26 @@ + + + + + + + + dYdX + + + + + + + + + + + + + + +
+ + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..88420c0 --- /dev/null +++ b/package.json @@ -0,0 +1,151 @@ +{ + "name": "dydx-chain-web", + "private": true, + "version": "0.0.1", + "type": "module", + "engines": { + "node": ">=18" + }, + "scripts": { + "dev": "vite", + "build": "vite build", + "build:inject-amplitude": "node scripts/inject-amplitude.js", + "build:inject-bugsnag": "node scripts/inject-bugsnag.js", + "build:inject-statuspage": "node scripts/inject-statuspage.js", + "deploy:ipfs": "node scripts/upload-ipfs.js --verbose", + "deploy:update-ipns": "node scripts/update-ipns.js", + "deploy:update-dnslink": "node scripts/update-dnslink.js", + "coverage": "vitest run --coverage", + "clean-install": "rm -rf node_modules/ && pnpm i", + "preview": "vite preview", + "ladle": "ladle serve", + "ladle-b": "ladle build", + "ladle-p": "ladle preview", + "lint": "eslint --ext .ts,.tsx src/", + "fix-lint": "eslint --fix --ext .ts,.tsx src/", + "test": "vitest", + "tsc": "tsc", + "postinstall": "tar -xzC public -f tradingview/tradingview.tgz" + }, + "packageManager": "pnpm@8.6.6", + "dependencies": { + "@0xsquid/sdk": "^1.7.2", + "@cosmjs/amino": "^0.31.0", + "@cosmjs/crypto": "^0.31.0", + "@cosmjs/encoding": "^0.31.0", + "@cosmjs/proto-signing": "^0.31.0", + "@cosmjs/stargate": "^0.31.0", + "@dydxprotocol/abacus": "^0.2.28", + "@cosmjs/tendermint-rpc": "^0.31.0", + "@dydxprotocol/v4-client": "^0.29.0", + "@ethersproject/providers": "^5.7.2", + "@js-joda/core": "^5.5.3", + "@radix-ui/react-collapsible": "^1.0.3", + "@radix-ui/react-dialog": "^1.0.4", + "@radix-ui/react-dropdown-menu": "^2.0.5", + "@radix-ui/react-navigation-menu": "^1.1.3", + "@radix-ui/react-popover": "^1.0.6", + "@radix-ui/react-radio-group": "^1.1.3", + "@radix-ui/react-select": "^1.2.2", + "@radix-ui/react-separator": "^1.0.3", + "@radix-ui/react-slider": "^1.1.2", + "@radix-ui/react-switch": "^1.0.3", + "@radix-ui/react-tabs": "^1.0.4", + "@radix-ui/react-toast": "^1.1.4", + "@radix-ui/react-toggle": "^1.0.3", + "@radix-ui/react-toggle-group": "^1.0.4", + "@radix-ui/react-toolbar": "^1.0.4", + "@radix-ui/react-tooltip": "^1.0.6", + "@radix-ui/react-use-rect": "^1.0.1", + "@react-spring/web": "^9.7.2", + "@react-stately/table": "^3.9.1", + "@react-types/grid": "^3.1.8", + "@react-types/shared": "^3.18.1", + "@react-types/table": "^3.6.1", + "@reduxjs/toolkit": "^1.9.5", + "@scure/bip32": "^1.3.0", + "@scure/bip39": "^1.2.0", + "@types/lodash": "^4.14.195", + "@types/styled-components": "^5.1.26", + "@visx/axis": "^3.1.0", + "@visx/curve": "^3.0.0", + "@visx/event": "^3.0.1", + "@visx/gradient": "^3.0.0", + "@visx/group": "^3.0.0", + "@visx/point": "^3.0.1", + "@visx/react-spring": "^3.1.0", + "@visx/responsive": "^3.0.0", + "@visx/scale": "^3.0.0", + "@visx/shape": "^3.0.0", + "@visx/text": "^3.0.0", + "@visx/threshold": "^3.0.0", + "@visx/tooltip": "^3.1.2", + "@visx/xychart": "^3.1.2", + "bignumber.js": "^9.1.1", + "buffer": "^6.0.3", + "cmdk": "^0.2.0", + "color": "^4.2.3", + "crypto-js": "^4.1.1", + "ethers": "^6.6.1", + "graz": "^0.0.43", + "lodash": "^4.17.21", + "long": "^5.2.3", + "luxon": "^3.3.0", + "qr-code-styling": "1.6.0-rc.1", + "react": "^18.2.0", + "react-aria": "^3.25.0", + "react-dom": "^18.2.0", + "react-number-format": "^5.2.2", + "react-query": "^3.39.3", + "react-redux": "^8.1.1", + "react-router-dom": "^6.14.0", + "react-stately": "^3.23.0", + "reselect": "^4.1.8", + "styled-components": "^5.3.11", + "use-latest": "^1.2.1", + "viem": "^1.1.6", + "wagmi": "^1.3.7" + }, + "devDependencies": { + "@babel/core": "^7.22.5", + "@ladle/react": "^2.15.0", + "@types/color": "^3.0.3", + "@types/crypto-js": "^4.1.1", + "@types/luxon": "^3.3.0", + "@types/node": "^20.3.1", + "@types/react": "^18.2.14", + "@types/react-dom": "^18.2.6", + "@typescript-eslint/eslint-plugin": "^5.60.0", + "@typescript-eslint/parser": "^5.60.0", + "@vitejs/plugin-react": "^4.0.1", + "assert": "^2.0.0", + "babel-loader": "^9.1.2", + "babel-plugin-styled-components": "^2.1.4", + "browserify-zlib": "^0.2.0", + "eslint": "^8.43.0", + "eslint-config-airbnb": "^19.0.4", + "eslint-config-airbnb-typescript": "^17.0.0", + "eslint-config-prettier": "^8.8.0", + "eslint-config-standard-with-typescript": "^35.0.0", + "eslint-import-resolver-typescript": "^3.5.5", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-n": "^16.0.0", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "^7.32.2", + "eslint-plugin-react-hooks": "^4.6.0", + "minimist": "^1.2.8", + "node-fetch": "^3.3.1", + "pnpm": "^8.6.6", + "prettier": "^2.8.8", + "typescript": "^5.1.3", + "url-polyfill": "^1.1.12", + "util": "^0.12.5", + "vite": "^4.3.9", + "vite-plugin-svgr": "^3.2.0", + "vitest": "^0.32.2", + "w3name": "^1.0.8", + "web3.storage": "^4.5.4" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..83de3b2 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,15857 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@0xsquid/sdk': + specifier: ^1.7.2 + version: 1.7.2 + '@cosmjs/amino': + specifier: ^0.31.0 + version: 0.31.0 + '@cosmjs/crypto': + specifier: ^0.31.0 + version: 0.31.0 + '@cosmjs/encoding': + specifier: ^0.31.0 + version: 0.31.0 + '@cosmjs/proto-signing': + specifier: ^0.31.0 + version: 0.31.0 + '@cosmjs/stargate': + specifier: ^0.31.0 + version: 0.31.0 + '@cosmjs/tendermint-rpc': + specifier: ^0.31.0 + version: 0.31.0 + '@dydxprotocol/abacus': + specifier: ^0.2.28 + version: 0.2.28 + '@dydxprotocol/v4-client': + specifier: ^0.29.0 + version: 0.29.0 + '@ethersproject/providers': + specifier: ^5.7.2 + version: 5.7.2 + '@js-joda/core': + specifier: ^5.5.3 + version: 5.5.3 + '@radix-ui/react-collapsible': + specifier: ^1.0.3 + version: 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-dialog': + specifier: ^1.0.4 + version: 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-dropdown-menu': + specifier: ^2.0.5 + version: 2.0.5(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-navigation-menu': + specifier: ^1.1.3 + version: 1.1.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-popover': + specifier: ^1.0.6 + version: 1.0.6(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-radio-group': + specifier: ^1.1.3 + version: 1.1.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-select': + specifier: ^1.2.2 + version: 1.2.2(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-separator': + specifier: ^1.0.3 + version: 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slider': + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-switch': + specifier: ^1.0.3 + version: 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-tabs': + specifier: ^1.0.4 + version: 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-toast': + specifier: ^1.1.4 + version: 1.1.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-toggle': + specifier: ^1.0.3 + version: 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-toggle-group': + specifier: ^1.0.4 + version: 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-toolbar': + specifier: ^1.0.4 + version: 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-tooltip': + specifier: ^1.0.6 + version: 1.0.6(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-rect': + specifier: ^1.0.1 + version: 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@react-spring/web': + specifier: ^9.7.2 + version: 9.7.2(react-dom@18.2.0)(react@18.2.0) + '@react-stately/table': + specifier: ^3.9.1 + version: 3.9.1(react@18.2.0) + '@react-types/grid': + specifier: ^3.1.8 + version: 3.1.8(react@18.2.0) + '@react-types/shared': + specifier: ^3.18.1 + version: 3.18.1(react@18.2.0) + '@react-types/table': + specifier: ^3.6.1 + version: 3.6.1(react@18.2.0) + '@reduxjs/toolkit': + specifier: ^1.9.5 + version: 1.9.5(react-redux@8.1.1)(react@18.2.0) + '@scure/bip32': + specifier: ^1.3.0 + version: 1.3.0 + '@scure/bip39': + specifier: ^1.2.0 + version: 1.2.0 + '@types/lodash': + specifier: ^4.14.195 + version: 4.14.195 + '@types/styled-components': + specifier: ^5.1.26 + version: 5.1.26 + '@visx/axis': + specifier: ^3.1.0 + version: 3.1.0(react@18.2.0) + '@visx/curve': + specifier: ^3.0.0 + version: 3.0.0 + '@visx/event': + specifier: ^3.0.1 + version: 3.0.1 + '@visx/gradient': + specifier: ^3.0.0 + version: 3.0.0(react@18.2.0) + '@visx/group': + specifier: ^3.0.0 + version: 3.0.0(react@18.2.0) + '@visx/point': + specifier: ^3.0.1 + version: 3.0.1 + '@visx/react-spring': + specifier: ^3.1.0 + version: 3.1.0(@react-spring/web@9.7.2)(react@18.2.0) + '@visx/responsive': + specifier: ^3.0.0 + version: 3.0.0(react@18.2.0) + '@visx/scale': + specifier: ^3.0.0 + version: 3.0.0 + '@visx/shape': + specifier: ^3.0.0 + version: 3.0.0(react@18.2.0) + '@visx/text': + specifier: ^3.0.0 + version: 3.0.0(react@18.2.0) + '@visx/threshold': + specifier: ^3.0.0 + version: 3.0.0(react@18.2.0) + '@visx/tooltip': + specifier: ^3.1.2 + version: 3.1.2(react-dom@18.2.0)(react@18.2.0) + '@visx/xychart': + specifier: ^3.1.2 + version: 3.1.2(@react-spring/web@9.7.2)(react-dom@18.2.0)(react@18.2.0) + bignumber.js: + specifier: ^9.1.1 + version: 9.1.1 + buffer: + specifier: ^6.0.3 + version: 6.0.3 + cmdk: + specifier: ^0.2.0 + version: 0.2.0(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + color: + specifier: ^4.2.3 + version: 4.2.3 + crypto-js: + specifier: ^4.1.1 + version: 4.1.1 + ethers: + specifier: ^6.6.1 + version: 6.6.1 + graz: + specifier: ^0.0.43 + version: 0.0.43(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + lodash: + specifier: ^4.17.21 + version: 4.17.21 + long: + specifier: ^5.2.3 + version: 5.2.3 + luxon: + specifier: ^3.3.0 + version: 3.3.0 + qr-code-styling: + specifier: 1.6.0-rc.1 + version: 1.6.0-rc.1 + react: + specifier: ^18.2.0 + version: 18.2.0 + react-aria: + specifier: ^3.25.0 + version: 3.25.0(react-dom@18.2.0)(react@18.2.0) + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + react-number-format: + specifier: ^5.2.2 + version: 5.2.2(react-dom@18.2.0)(react@18.2.0) + react-query: + specifier: ^3.39.3 + version: 3.39.3(react-dom@18.2.0)(react@18.2.0) + react-redux: + specifier: ^8.1.1 + version: 8.1.1(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0)(redux@4.2.1) + react-router-dom: + specifier: ^6.14.0 + version: 6.14.0(react-dom@18.2.0)(react@18.2.0) + react-stately: + specifier: ^3.23.0 + version: 3.23.0(react@18.2.0) + reselect: + specifier: ^4.1.8 + version: 4.1.8 + styled-components: + specifier: ^5.3.11 + version: 5.3.11(@babel/core@7.22.5)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) + use-latest: + specifier: ^1.2.1 + version: 1.2.1(@types/react@18.2.14)(react@18.2.0) + viem: + specifier: ^1.1.6 + version: 1.1.6(typescript@5.1.3) + wagmi: + specifier: ^1.3.7 + version: 1.3.7(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3)(viem@1.1.6) + +devDependencies: + '@babel/core': + specifier: ^7.22.5 + version: 7.22.5 + '@ladle/react': + specifier: ^2.15.0 + version: 2.15.0(@types/node@20.3.1)(react-dom@18.2.0)(react@18.2.0) + '@types/color': + specifier: ^3.0.3 + version: 3.0.3 + '@types/crypto-js': + specifier: ^4.1.1 + version: 4.1.1 + '@types/luxon': + specifier: ^3.3.0 + version: 3.3.0 + '@types/node': + specifier: ^20.3.1 + version: 20.3.1 + '@types/react': + specifier: ^18.2.14 + version: 18.2.14 + '@types/react-dom': + specifier: ^18.2.6 + version: 18.2.6 + '@typescript-eslint/eslint-plugin': + specifier: ^5.60.0 + version: 5.60.0(@typescript-eslint/parser@5.60.0)(eslint@8.43.0)(typescript@5.1.3) + '@typescript-eslint/parser': + specifier: ^5.60.0 + version: 5.60.0(eslint@8.43.0)(typescript@5.1.3) + '@vitejs/plugin-react': + specifier: ^4.0.1 + version: 4.0.1(vite@4.3.9) + assert: + specifier: ^2.0.0 + version: 2.0.0 + babel-loader: + specifier: ^9.1.2 + version: 9.1.2(@babel/core@7.22.5)(webpack@5.88.2) + babel-plugin-styled-components: + specifier: ^2.1.4 + version: 2.1.4(@babel/core@7.22.5)(styled-components@5.3.11) + browserify-zlib: + specifier: ^0.2.0 + version: 0.2.0 + eslint: + specifier: ^8.43.0 + version: 8.43.0 + eslint-config-airbnb: + specifier: ^19.0.4 + version: 19.0.4(eslint-plugin-import@2.27.5)(eslint-plugin-jsx-a11y@6.7.1)(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react@7.32.2)(eslint@8.43.0) + eslint-config-airbnb-typescript: + specifier: ^17.0.0 + version: 17.0.0(@typescript-eslint/eslint-plugin@5.60.0)(@typescript-eslint/parser@5.60.0)(eslint-plugin-import@2.27.5)(eslint@8.43.0) + eslint-config-prettier: + specifier: ^8.8.0 + version: 8.8.0(eslint@8.43.0) + eslint-config-standard-with-typescript: + specifier: ^35.0.0 + version: 35.0.0(@typescript-eslint/eslint-plugin@5.60.0)(eslint-plugin-import@2.27.5)(eslint-plugin-n@16.0.0)(eslint-plugin-promise@6.1.1)(eslint@8.43.0)(typescript@5.1.3) + eslint-import-resolver-typescript: + specifier: ^3.5.5 + version: 3.5.5(@typescript-eslint/parser@5.60.0)(eslint-plugin-import@2.27.5)(eslint@8.43.0) + eslint-plugin-import: + specifier: ^2.27.5 + version: 2.27.5(@typescript-eslint/parser@5.60.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.43.0) + eslint-plugin-jsx-a11y: + specifier: ^6.7.1 + version: 6.7.1(eslint@8.43.0) + eslint-plugin-n: + specifier: ^16.0.0 + version: 16.0.0(eslint@8.43.0) + eslint-plugin-prettier: + specifier: ^4.2.1 + version: 4.2.1(eslint-config-prettier@8.8.0)(eslint@8.43.0)(prettier@2.8.8) + eslint-plugin-promise: + specifier: ^6.1.1 + version: 6.1.1(eslint@8.43.0) + eslint-plugin-react: + specifier: ^7.32.2 + version: 7.32.2(eslint@8.43.0) + eslint-plugin-react-hooks: + specifier: ^4.6.0 + version: 4.6.0(eslint@8.43.0) + minimist: + specifier: ^1.2.8 + version: 1.2.8 + node-fetch: + specifier: ^3.3.1 + version: 3.3.1 + pnpm: + specifier: ^8.6.6 + version: 8.6.6 + prettier: + specifier: ^2.8.8 + version: 2.8.8 + typescript: + specifier: ^5.1.3 + version: 5.1.3 + url-polyfill: + specifier: ^1.1.12 + version: 1.1.12 + util: + specifier: ^0.12.5 + version: 0.12.5 + vite: + specifier: ^4.3.9 + version: 4.3.9(@types/node@20.3.1) + vite-plugin-svgr: + specifier: ^3.2.0 + version: 3.2.0(vite@4.3.9) + vitest: + specifier: ^0.32.2 + version: 0.32.2 + w3name: + specifier: ^1.0.8 + version: 1.0.8 + web3.storage: + specifier: ^4.5.4 + version: 4.5.4(node-fetch@3.3.1) + +packages: + + /@0xsquid/sdk@1.7.2: + resolution: {integrity: sha512-yoNUSG3fUUo4k2l3eKM8mPmP96xHb8BgoukuGneBLq3NrzJ3uP7E+I9C5+9noJBWFjs26HW25iCyNNp5WlBlAA==} + dependencies: + '@release-it/conventional-changelog': github.com/release-it/conventional-changelog/a4acfeac76369937a6566d698a5ae9180eceb413(release-it@15.11.0) + axios: 0.27.2 + ethers: 5.7.2 + release-it: 15.11.0 + transitivePeerDependencies: + - bufferutil + - debug + - encoding + - supports-color + - utf-8-validate + dev: false + + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + + /@adraffy/ens-normalize@1.9.0: + resolution: {integrity: sha512-iowxq3U30sghZotgl4s/oJRci6WPBfNO5YYgk2cIOMCHr3LeGPcsZjCEr+33Q4N+oV3OABDAtA+pyvWjbvBifQ==} + dev: false + + /@adraffy/ens-normalize@1.9.2: + resolution: {integrity: sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg==} + dev: false + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + + /@assemblyscript/loader@0.9.4: + resolution: {integrity: sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA==} + dev: true + + /@babel/code-frame@7.22.10: + resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.10 + chalk: 2.4.2 + + /@babel/compat-data@7.22.9: + resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} + engines: {node: '>=6.9.0'} + + /@babel/core@7.22.5: + resolution: {integrity: sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.10 + '@babel/generator': 7.22.10 + '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.5) + '@babel/helpers': 7.22.10 + '@babel/parser': 7.22.10 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.10(supports-color@5.5.0) + '@babel/types': 7.22.10 + convert-source-map: 1.9.0 + debug: 4.3.4(supports-color@5.5.0) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /@babel/generator@7.22.10: + resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.10 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + jsesc: 2.5.2 + + /@babel/helper-annotate-as-pure@7.22.5: + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.10 + + /@babel/helper-compilation-targets@7.22.10: + resolution: {integrity: sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.22.9 + '@babel/helper-validator-option': 7.22.5 + browserslist: 4.21.10 + lru-cache: 5.1.1 + semver: 6.3.1 + + /@babel/helper-environment-visitor@7.22.5: + resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} + engines: {node: '>=6.9.0'} + + /@babel/helper-function-name@7.22.5: + resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.5 + '@babel/types': 7.22.10 + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.10 + + /@babel/helper-module-imports@7.22.5: + resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.10 + + /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.5): + resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-module-imports': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.5 + + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.10 + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.10 + + /@babel/helper-string-parser@7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier@7.22.5: + resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option@7.22.5: + resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} + engines: {node: '>=6.9.0'} + + /@babel/helpers@7.22.10: + resolution: {integrity: sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.10(supports-color@5.5.0) + '@babel/types': 7.22.10 + transitivePeerDependencies: + - supports-color + + /@babel/highlight@7.22.10: + resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + + /@babel/parser@7.22.10: + resolution: {integrity: sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.22.10 + + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.5): + resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.22.5): + resolution: {integrity: sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.22.5): + resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/runtime@7.22.10: + resolution: {integrity: sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.0 + + /@babel/template@7.22.5: + resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.10 + '@babel/parser': 7.22.10 + '@babel/types': 7.22.10 + + /@babel/traverse@7.22.10(supports-color@5.5.0): + resolution: {integrity: sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.10 + '@babel/generator': 7.22.10 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.22.10 + '@babel/types': 7.22.10 + debug: 4.3.4(supports-color@5.5.0) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + /@babel/types@7.22.10: + resolution: {integrity: sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 + to-fast-properties: 2.0.0 + + /@bufbuild/buf-darwin-arm64@1.19.0-1: + resolution: {integrity: sha512-HsWPii21wm3QSyuxrNq9+Yf8iAgpnC4rNCy4x3d6P1fd/LmgE1NPzQW0ghEZvl9dgAQKkL/4S5bKhlm7kbUdmQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@bufbuild/buf-darwin-x64@1.19.0-1: + resolution: {integrity: sha512-2+Ig7ylYpVh4kms/OeJJVY+X0KX4awPA6hYr7L7aZOIcHwZEM8lWtSTO/se5pQc7dc8FXNiC4YUqHC8yfxxX6Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@bufbuild/buf-linux-aarch64@1.19.0-1: + resolution: {integrity: sha512-g/Vxg3WiBr3nhsxsRr2Q81xXJD+0ktHIO3ZJggTG2Sbbl3dh8kyg1iKM6MjJiMP7su5RKCylLigzoEJzVTShyA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@bufbuild/buf-linux-x64@1.19.0-1: + resolution: {integrity: sha512-anYuGx8k/2kp8GPX3eHNUf3IY/01Zpnyw0HaLPXK1Btqyy6XkapVywrDqg7YUzMd1ySFEp1wD9UqRNdEFNCQ4A==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@bufbuild/buf-win32-arm64@1.19.0-1: + resolution: {integrity: sha512-xXgF1qYnCfRKbGx1FqvPbpZ6ajh4ddxpXhSxI3VCeb3MsMBuIbiLqX4fQAL3ls/Zwz8tVIITuSwOhYmSEGcpBA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@bufbuild/buf-win32-x64@1.19.0-1: + resolution: {integrity: sha512-futmqgpMQCR1lcAzZJEGjPr7ECw1gYTPIV8crm5SY+iCJ7sOeStOBNt7q5hV4LKmmeWmvm03XIMZPjhQzjH5NQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@bufbuild/buf@1.19.0-1: + resolution: {integrity: sha512-TIsLTTQUntr/Xq/IMSULv3dlC3/ZsVwQtWgxmJ++IzSuOW79TFQfq59vFeTWrPa6+QXFMz5t6jkMyD4ghzO5nw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@bufbuild/buf-darwin-arm64': 1.19.0-1 + '@bufbuild/buf-darwin-x64': 1.19.0-1 + '@bufbuild/buf-linux-aarch64': 1.19.0-1 + '@bufbuild/buf-linux-x64': 1.19.0-1 + '@bufbuild/buf-win32-arm64': 1.19.0-1 + '@bufbuild/buf-win32-x64': 1.19.0-1 + dev: false + + /@coinbase/wallet-sdk@3.7.1: + resolution: {integrity: sha512-LjyoDCB+7p0waQXfK+fUgcAs3Ezk6S6e+LYaoFjpJ6c9VTop3NyZF40Pi7df4z7QJohCwzuIDjz0Rhtig6Y7Pg==} + engines: {node: '>= 10.0.0'} + dependencies: + '@metamask/safe-event-emitter': 2.0.0 + '@solana/web3.js': 1.78.4 + bind-decorator: 1.0.11 + bn.js: 5.2.1 + buffer: 6.0.3 + clsx: 1.2.1 + eth-block-tracker: 6.1.0 + eth-json-rpc-filters: 5.1.0 + eth-rpc-errors: 4.0.2 + json-rpc-engine: 6.1.0 + keccak: 3.0.3 + preact: 10.17.0 + qs: 6.11.2 + rxjs: 6.6.7 + sha.js: 2.4.11 + stream-browserify: 3.0.0 + util: 0.12.5 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: false + + /@confio/ics23@0.6.8: + resolution: {integrity: sha512-wB6uo+3A50m0sW/EWcU64xpV/8wShZ6bMTa7pF8eYsTrSkQA7oLUIJcs/wb8g4y2Oyq701BaGiO6n/ak5WXO1w==} + dependencies: + '@noble/hashes': 1.3.1 + protobufjs: 6.11.4 + dev: false + + /@cosmjs/amino@0.27.1: + resolution: {integrity: sha512-w56ar/nK9+qlvWDpBPRmD0Blk2wfkkLqRi1COs1x7Ll1LF0AtkIBUjbRKplENLbNovK0T3h+w8bHiFm+GBGQOA==} + dependencies: + '@cosmjs/crypto': 0.27.1 + '@cosmjs/encoding': 0.27.1 + '@cosmjs/math': 0.27.1 + '@cosmjs/utils': 0.27.1 + dev: false + + /@cosmjs/amino@0.29.3: + resolution: {integrity: sha512-BFz1++ERerIggiFc7iGHhGe1CeV3rCv8BvkoBQTBN/ZwzHOaKvqQj8smDlRGlQxX3HWlTwgiLN2A+OB5yX4ZRw==} + dependencies: + '@cosmjs/crypto': 0.29.5 + '@cosmjs/encoding': 0.29.5 + '@cosmjs/math': 0.29.5 + '@cosmjs/utils': 0.29.5 + dev: false + + /@cosmjs/amino@0.30.1: + resolution: {integrity: sha512-yNHnzmvAlkETDYIpeCTdVqgvrdt1qgkOXwuRVi8s27UKI5hfqyE9fJ/fuunXE6ZZPnKkjIecDznmuUOMrMvw4w==} + dependencies: + '@cosmjs/crypto': 0.30.1 + '@cosmjs/encoding': 0.30.1 + '@cosmjs/math': 0.30.1 + '@cosmjs/utils': 0.30.1 + dev: false + + /@cosmjs/amino@0.31.0: + resolution: {integrity: sha512-xJ5CCEK7H79FTpOuEmlpSzVI+ZeYESTVvO3wHDgbnceIyAne3C68SvyaKqLUR4uJB0Z4q4+DZHbqW6itUiv4lA==} + dependencies: + '@cosmjs/crypto': 0.31.0 + '@cosmjs/encoding': 0.31.0 + '@cosmjs/math': 0.31.0 + '@cosmjs/utils': 0.31.0 + dev: false + + /@cosmjs/cosmwasm-stargate@0.30.1: + resolution: {integrity: sha512-W/6SLUCJAJGBN+sJLXouLZikVgmqDd9LCdlMzQaxczcCHTWeJAmRvOiZGSZaSy3shw/JN1qc6g6PKpvTVgj10A==} + dependencies: + '@cosmjs/amino': 0.30.1 + '@cosmjs/crypto': 0.30.1 + '@cosmjs/encoding': 0.30.1 + '@cosmjs/math': 0.30.1 + '@cosmjs/proto-signing': 0.30.1 + '@cosmjs/stargate': 0.30.1 + '@cosmjs/tendermint-rpc': 0.30.1 + '@cosmjs/utils': 0.30.1 + cosmjs-types: 0.7.2 + long: 4.0.0 + pako: 2.1.0 + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + dev: false + + /@cosmjs/crypto@0.27.1: + resolution: {integrity: sha512-vbcxwSt99tIYJg8Spp00wc3zx72qx+pY3ozGuBN8gAvySnagK9dQ/jHwtWQWdammmdD6oW+75WfIHZ+gNa+Ybg==} + dependencies: + '@cosmjs/encoding': 0.27.1 + '@cosmjs/math': 0.27.1 + '@cosmjs/utils': 0.27.1 + bip39: 3.1.0 + bn.js: 5.2.1 + elliptic: 6.5.4 + js-sha3: 0.8.0 + libsodium-wrappers: 0.7.11 + ripemd160: 2.0.2 + sha.js: 2.4.11 + dev: false + + /@cosmjs/crypto@0.29.5: + resolution: {integrity: sha512-2bKkaLGictaNL0UipQCL6C1afaisv6k8Wr/GCLx9FqiyFkh9ZgRHDyetD64ZsjnWV/N/D44s/esI+k6oPREaiQ==} + dependencies: + '@cosmjs/encoding': 0.29.5 + '@cosmjs/math': 0.29.5 + '@cosmjs/utils': 0.29.5 + '@noble/hashes': 1.3.1 + bn.js: 5.2.1 + elliptic: 6.5.4 + libsodium-wrappers: 0.7.11 + dev: false + + /@cosmjs/crypto@0.30.1: + resolution: {integrity: sha512-rAljUlake3MSXs9xAm87mu34GfBLN0h/1uPPV6jEwClWjNkAMotzjC0ab9MARy5FFAvYHL3lWb57bhkbt2GtzQ==} + dependencies: + '@cosmjs/encoding': 0.30.1 + '@cosmjs/math': 0.30.1 + '@cosmjs/utils': 0.30.1 + '@noble/hashes': 1.3.1 + bn.js: 5.2.1 + elliptic: 6.5.4 + libsodium-wrappers: 0.7.11 + dev: false + + /@cosmjs/crypto@0.31.0: + resolution: {integrity: sha512-UaqCe6Tgh0pe1QlZ66E13t6FlIF86QrnBXXq+EN7Xe1Rouza3fJ1ojGlPleJZkBoq3tAyYVIOOqdZIxtVj/sIQ==} + dependencies: + '@cosmjs/encoding': 0.31.0 + '@cosmjs/math': 0.31.0 + '@cosmjs/utils': 0.31.0 + '@noble/hashes': 1.3.1 + bn.js: 5.2.1 + elliptic: 6.5.4 + libsodium-wrappers-sumo: 0.7.11 + dev: false + + /@cosmjs/encoding@0.27.1: + resolution: {integrity: sha512-rayLsA0ojHeniaRfWWcqSsrE/T1rl1gl0OXVNtXlPwLJifKBeLEefGbOUiAQaT0wgJ8VNGBazVtAZBpJidfDhw==} + dependencies: + base64-js: 1.5.1 + bech32: 1.1.4 + readonly-date: 1.0.0 + dev: false + + /@cosmjs/encoding@0.29.5: + resolution: {integrity: sha512-G4rGl/Jg4dMCw5u6PEZHZcoHnUBlukZODHbm/wcL4Uu91fkn5jVo5cXXZcvs4VCkArVGrEj/52eUgTZCmOBGWQ==} + dependencies: + base64-js: 1.5.1 + bech32: 1.1.4 + readonly-date: 1.0.0 + dev: false + + /@cosmjs/encoding@0.30.1: + resolution: {integrity: sha512-rXmrTbgqwihORwJ3xYhIgQFfMSrwLu1s43RIK9I8EBudPx3KmnmyAKzMOVsRDo9edLFNuZ9GIvysUCwQfq3WlQ==} + dependencies: + base64-js: 1.5.1 + bech32: 1.1.4 + readonly-date: 1.0.0 + dev: false + + /@cosmjs/encoding@0.31.0: + resolution: {integrity: sha512-NYGQDRxT7MIRSlcbAezwxK0FqnaSPKCH7O32cmfpHNWorFxhy9lwmBoCvoe59Kd0HmArI4h+NGzLEfX3OLnA4Q==} + dependencies: + base64-js: 1.5.1 + bech32: 1.1.4 + readonly-date: 1.0.0 + dev: false + + /@cosmjs/json-rpc@0.29.5: + resolution: {integrity: sha512-C78+X06l+r9xwdM1yFWIpGl03LhB9NdM1xvZpQHwgCOl0Ir/WV8pw48y3Ez2awAoUBRfTeejPe4KvrE6NoIi/w==} + dependencies: + '@cosmjs/stream': 0.29.5 + xstream: 11.14.0 + dev: false + + /@cosmjs/json-rpc@0.30.1: + resolution: {integrity: sha512-pitfC/2YN9t+kXZCbNuyrZ6M8abnCC2n62m+JtU9vQUfaEtVsgy+1Fk4TRQ175+pIWSdBMFi2wT8FWVEE4RhxQ==} + dependencies: + '@cosmjs/stream': 0.30.1 + xstream: 11.14.0 + dev: false + + /@cosmjs/json-rpc@0.31.0: + resolution: {integrity: sha512-Ix2Cil2qysiLNrX+E0w3vtwCrqxGVq8jklpLA7B2vtMrw7tru/rS65fdFSy8ep0wUNLL6Ud32VXa5K0YObDOMA==} + dependencies: + '@cosmjs/stream': 0.31.0 + xstream: 11.14.0 + dev: false + + /@cosmjs/launchpad@0.27.1: + resolution: {integrity: sha512-DcFwGD/z5PK8CzO2sojDxa+Be9EIEtRZb2YawgVnw2Ht/p5FlNv+OVo8qlishpBdalXEN7FvQ1dVeDFEe9TuJw==} + dependencies: + '@cosmjs/amino': 0.27.1 + '@cosmjs/crypto': 0.27.1 + '@cosmjs/encoding': 0.27.1 + '@cosmjs/math': 0.27.1 + '@cosmjs/utils': 0.27.1 + axios: 0.21.4 + fast-deep-equal: 3.1.3 + transitivePeerDependencies: + - debug + dev: false + + /@cosmjs/math@0.27.1: + resolution: {integrity: sha512-cHWVjmfIjtRc7f80n7x+J5k8pe+vTVTQ0lA82tIxUgqUvgS6rogPP/TmGtTiZ4+NxWxd11DUISY6gVpr18/VNQ==} + dependencies: + bn.js: 5.2.1 + dev: false + + /@cosmjs/math@0.29.5: + resolution: {integrity: sha512-2GjKcv+A9f86MAWYLUkjhw1/WpRl2R1BTb3m9qPG7lzMA7ioYff9jY5SPCfafKdxM4TIQGxXQlYGewQL16O68Q==} + dependencies: + bn.js: 5.2.1 + dev: false + + /@cosmjs/math@0.30.1: + resolution: {integrity: sha512-yaoeI23pin9ZiPHIisa6qqLngfnBR/25tSaWpkTm8Cy10MX70UF5oN4+/t1heLaM6SSmRrhk3psRkV4+7mH51Q==} + dependencies: + bn.js: 5.2.1 + dev: false + + /@cosmjs/math@0.31.0: + resolution: {integrity: sha512-Sb/8Ry/+gKJaYiV6X8q45kxXC9FoV98XCY1WXtu0JQwOi61VCG2VXsURQnVvZ/EhR/CuT/swOlNKrqEs3da0fw==} + dependencies: + bn.js: 5.2.1 + dev: false + + /@cosmjs/proto-signing@0.29.3: + resolution: {integrity: sha512-Ai3l9THjMOrLJ4Ebn1Dgptwg6W5ZIRJqtnJjijHhGwTVC1WT0WdYU3aMZ7+PwubcA/cA1rH4ZTK7jrfYbra63g==} + dependencies: + '@cosmjs/amino': 0.29.3 + '@cosmjs/crypto': 0.29.5 + '@cosmjs/encoding': 0.29.5 + '@cosmjs/math': 0.29.5 + '@cosmjs/utils': 0.29.5 + cosmjs-types: 0.5.2 + long: 4.0.0 + dev: false + + /@cosmjs/proto-signing@0.30.1: + resolution: {integrity: sha512-tXh8pPYXV4aiJVhTKHGyeZekjj+K9s2KKojMB93Gcob2DxUjfKapFYBMJSgfKPuWUPEmyr8Q9km2hplI38ILgQ==} + dependencies: + '@cosmjs/amino': 0.30.1 + '@cosmjs/crypto': 0.30.1 + '@cosmjs/encoding': 0.30.1 + '@cosmjs/math': 0.30.1 + '@cosmjs/utils': 0.30.1 + cosmjs-types: 0.7.2 + long: 4.0.0 + dev: false + + /@cosmjs/proto-signing@0.31.0: + resolution: {integrity: sha512-JNlyOJRkn8EKB9mCthkjr6lVX6eyVQ09PFdmB4/DR874E62dFTvQ+YvyKMAgN7K7Dcjj26dVlAD3f6Xs7YOGDg==} + dependencies: + '@cosmjs/amino': 0.31.0 + '@cosmjs/crypto': 0.31.0 + '@cosmjs/encoding': 0.31.0 + '@cosmjs/math': 0.31.0 + '@cosmjs/utils': 0.31.0 + cosmjs-types: 0.8.0 + long: 4.0.0 + dev: false + + /@cosmjs/socket@0.29.5: + resolution: {integrity: sha512-5VYDupIWbIXq3ftPV1LkS5Ya/T7Ol/AzWVhNxZ79hPe/mBfv1bGau/LqIYOm2zxGlgm9hBHOTmWGqNYDwr9LNQ==} + dependencies: + '@cosmjs/stream': 0.29.5 + isomorphic-ws: 4.0.1(ws@7.5.9) + ws: 7.5.9 + xstream: 11.14.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@cosmjs/socket@0.30.1: + resolution: {integrity: sha512-r6MpDL+9N+qOS/D5VaxnPaMJ3flwQ36G+vPvYJsXArj93BjgyFB7BwWwXCQDzZ+23cfChPUfhbINOenr8N2Kow==} + dependencies: + '@cosmjs/stream': 0.30.1 + isomorphic-ws: 4.0.1(ws@7.5.9) + ws: 7.5.9 + xstream: 11.14.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@cosmjs/socket@0.31.0: + resolution: {integrity: sha512-WDh9gTyiP3OCXvSAJJn33+Ef3XqMWag+bpR1TdMBxTmlTxuvU+kPy4cf6P2OF+jkkUBEA5Se2EAju0eFbJMT+w==} + dependencies: + '@cosmjs/stream': 0.31.0 + isomorphic-ws: 4.0.1(ws@7.5.9) + ws: 7.5.9 + xstream: 11.14.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@cosmjs/stargate@0.29.3: + resolution: {integrity: sha512-455TgXStCi6E8KDjnhDAM8wt6aLSjobH4Dixvd7Up1DfCH6UB9NkC/G0fMJANNcNXMaM4wSX14niTXwD1d31BA==} + dependencies: + '@confio/ics23': 0.6.8 + '@cosmjs/amino': 0.29.3 + '@cosmjs/encoding': 0.29.5 + '@cosmjs/math': 0.29.5 + '@cosmjs/proto-signing': 0.29.3 + '@cosmjs/stream': 0.29.5 + '@cosmjs/tendermint-rpc': 0.29.5 + '@cosmjs/utils': 0.29.5 + cosmjs-types: 0.5.2 + long: 4.0.0 + protobufjs: 6.11.4 + xstream: 11.14.0 + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + dev: false + + /@cosmjs/stargate@0.30.1: + resolution: {integrity: sha512-RdbYKZCGOH8gWebO7r6WvNnQMxHrNXInY/gPHPzMjbQF6UatA6fNM2G2tdgS5j5u7FTqlCI10stNXrknaNdzog==} + dependencies: + '@confio/ics23': 0.6.8 + '@cosmjs/amino': 0.30.1 + '@cosmjs/encoding': 0.30.1 + '@cosmjs/math': 0.30.1 + '@cosmjs/proto-signing': 0.30.1 + '@cosmjs/stream': 0.30.1 + '@cosmjs/tendermint-rpc': 0.30.1 + '@cosmjs/utils': 0.30.1 + cosmjs-types: 0.7.2 + long: 4.0.0 + protobufjs: 6.11.4 + xstream: 11.14.0 + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + dev: false + + /@cosmjs/stargate@0.31.0: + resolution: {integrity: sha512-GYhk9lzZPj/QmYHC0VV/4AMoRzVcOP+EnB1YZCoWlBdLuVmpBYKRagJqWIrIwdk1E0gF2ZoESd2TYfdh1fqIpg==} + dependencies: + '@confio/ics23': 0.6.8 + '@cosmjs/amino': 0.31.0 + '@cosmjs/encoding': 0.31.0 + '@cosmjs/math': 0.31.0 + '@cosmjs/proto-signing': 0.31.0 + '@cosmjs/stream': 0.31.0 + '@cosmjs/tendermint-rpc': 0.31.0 + '@cosmjs/utils': 0.31.0 + cosmjs-types: 0.8.0 + long: 4.0.0 + protobufjs: 6.11.4 + xstream: 11.14.0 + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + dev: false + + /@cosmjs/stream@0.29.5: + resolution: {integrity: sha512-TToTDWyH1p05GBtF0Y8jFw2C+4783ueDCmDyxOMM6EU82IqpmIbfwcdMOCAm0JhnyMh+ocdebbFvnX/sGKzRAA==} + dependencies: + xstream: 11.14.0 + dev: false + + /@cosmjs/stream@0.30.1: + resolution: {integrity: sha512-Fg0pWz1zXQdoxQZpdHRMGvUH5RqS6tPv+j9Eh7Q953UjMlrwZVo0YFLC8OTf/HKVf10E4i0u6aM8D69Q6cNkgQ==} + dependencies: + xstream: 11.14.0 + dev: false + + /@cosmjs/stream@0.31.0: + resolution: {integrity: sha512-Y+aSHwhHkLGIaQOdqRob+yga2zr9ifl9gZDKD+B7+R5pdWN5f2TTDhYWxA6YZcZ6xRmfr7u8a7tDh7iYLC/zKA==} + dependencies: + xstream: 11.14.0 + dev: false + + /@cosmjs/tendermint-rpc@0.29.5: + resolution: {integrity: sha512-ar80twieuAxsy0x2za/aO3kBr2DFPAXDmk2ikDbmkda+qqfXgl35l9CVAAjKRqd9d+cRvbQyb5M4wy6XQpEV6w==} + dependencies: + '@cosmjs/crypto': 0.29.5 + '@cosmjs/encoding': 0.29.5 + '@cosmjs/json-rpc': 0.29.5 + '@cosmjs/math': 0.29.5 + '@cosmjs/socket': 0.29.5 + '@cosmjs/stream': 0.29.5 + '@cosmjs/utils': 0.29.5 + axios: 0.21.4 + readonly-date: 1.0.0 + xstream: 11.14.0 + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + dev: false + + /@cosmjs/tendermint-rpc@0.30.1: + resolution: {integrity: sha512-Z3nCwhXSbPZJ++v85zHObeUggrEHVfm1u18ZRwXxFE9ZMl5mXTybnwYhczuYOl7KRskgwlB+rID0WYACxj4wdQ==} + dependencies: + '@cosmjs/crypto': 0.30.1 + '@cosmjs/encoding': 0.30.1 + '@cosmjs/json-rpc': 0.30.1 + '@cosmjs/math': 0.30.1 + '@cosmjs/socket': 0.30.1 + '@cosmjs/stream': 0.30.1 + '@cosmjs/utils': 0.30.1 + axios: 0.21.4 + readonly-date: 1.0.0 + xstream: 11.14.0 + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + dev: false + + /@cosmjs/tendermint-rpc@0.31.0: + resolution: {integrity: sha512-yo9xbeuI6UoEKIhFZ9g0dvUKLqnBzwdpEc/uldQygQc51j38gQVwFko+6sjmhieJqRYYvrYumcbJMiV6GFM9aA==} + dependencies: + '@cosmjs/crypto': 0.31.0 + '@cosmjs/encoding': 0.31.0 + '@cosmjs/json-rpc': 0.31.0 + '@cosmjs/math': 0.31.0 + '@cosmjs/socket': 0.31.0 + '@cosmjs/stream': 0.31.0 + '@cosmjs/utils': 0.31.0 + axios: 0.21.4 + readonly-date: 1.0.0 + xstream: 11.14.0 + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + dev: false + + /@cosmjs/utils@0.27.1: + resolution: {integrity: sha512-VG7QPDiMUzVPxRdJahDV8PXxVdnuAHiIuG56hldV4yPnOz/si/DLNd7VAUUA5923b6jS1Hhev0Hr6AhEkcxBMg==} + dev: false + + /@cosmjs/utils@0.29.5: + resolution: {integrity: sha512-m7h+RXDUxOzEOGt4P+3OVPX7PuakZT3GBmaM/Y2u+abN3xZkziykD/NvedYFvvCCdQo714XcGl33bwifS9FZPQ==} + dev: false + + /@cosmjs/utils@0.30.1: + resolution: {integrity: sha512-KvvX58MGMWh7xA+N+deCfunkA/ZNDvFLw4YbOmX3f/XBIkqrVY7qlotfy2aNb1kgp6h4B6Yc8YawJPDTfvWX7g==} + dev: false + + /@cosmjs/utils@0.31.0: + resolution: {integrity: sha512-nNcycZWUYLNJlrIXgpcgVRqdl6BXjF4YlXdxobQWpW9Tikk61bEGeAFhDYtC0PwHlokCNw0KxWiHGJL4nL7Q5A==} + dev: false + + /@cush/relative@1.0.0: + resolution: {integrity: sha512-RpfLEtTlyIxeNPGKcokS+p3BZII/Q3bYxryFRglh5H3A3T8q9fsLYm72VYAMEOOIBLEa8o93kFLiBDUWKrwXZA==} + dev: true + + /@dydxprotocol/abacus@0.2.28: + resolution: {integrity: sha512-mGmhwQM8aiV/cD+d3lvW76ysoPN7uVsDyAiVcRdzGqgj+gbM0IIJDYXG14xHruOTi+gK1Aga5MUz2pdvmPDhYA==} + dev: false + + /@dydxprotocol/dydxjs@0.3.0: + resolution: {integrity: sha512-ygNeBs0f3H7sJk1qLUjfNwaXgc5TmjD+qZf7BFDbi7+boHJI9xuOWrGpjfBo7OTUZxS6O5jZG323CgU5XqMSPw==} + dependencies: + '@babel/runtime': 7.22.10 + '@bufbuild/buf': 1.19.0-1 + '@cosmjs/amino': 0.30.1 + '@cosmjs/proto-signing': 0.30.1 + '@cosmjs/stargate': 0.30.1 + '@cosmjs/tendermint-rpc': 0.30.1 + osmojs: 15.5.0 + protobufjs: 6.11.4 + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + dev: false + + /@dydxprotocol/v4-client@0.29.0: + resolution: {integrity: sha512-BMgm6e91LFGKB0l3lC2/0aIgayejgBa7qCwCUxr05265tggZsI3l3Cui8LNDHeb8IAQ4KPcfAJ29c96lx+rLlw==} + dependencies: + '@cosmjs/amino': 0.30.1 + '@cosmjs/proto-signing': 0.30.1 + '@cosmjs/stargate': 0.30.1 + '@cosmjs/tendermint-rpc': 0.30.1 + '@dydxprotocol/dydxjs': 0.3.0 + '@osmonauts/lcd': 0.6.0 + '@scure/bip32': 1.3.1 + '@scure/bip39': 1.2.1 + axios: 1.1.3 + bech32: 1.1.4 + bignumber.js: 9.1.1 + ethereum-cryptography: 2.1.2 + long: 4.0.0 + ws: 8.13.0(bufferutil@4.0.7)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + dev: false + + /@emotion/is-prop-valid@1.2.1: + resolution: {integrity: sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==} + dependencies: + '@emotion/memoize': 0.8.1 + + /@emotion/memoize@0.8.1: + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + + /@emotion/stylis@0.8.5: + resolution: {integrity: sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==} + + /@emotion/unitless@0.7.5: + resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} + + /@esbuild/android-arm64@0.17.19: + resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.17.19: + resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.17.19: + resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.17.19: + resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.17.19: + resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.17.19: + resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.17.19: + resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.17.19: + resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.17.19: + resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.17.19: + resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.17.19: + resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.17.19: + resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.17.19: + resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.17.19: + resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.17.19: + resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.17.19: + resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.17.19: + resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.17.19: + resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.17.19: + resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.17.19: + resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.17.19: + resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.17.19: + resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.43.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.43.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.6.2: + resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.2: + resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4(supports-color@5.5.0) + espree: 9.6.1 + globals: 13.21.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.43.0: + resolution: {integrity: sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@ethersproject/abi@5.7.0: + resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: false + + /@ethersproject/abstract-provider@5.7.0: + resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 + dev: false + + /@ethersproject/abstract-signer@5.7.0: + resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + dev: false + + /@ethersproject/address@5.7.0: + resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/rlp': 5.7.0 + dev: false + + /@ethersproject/base64@5.7.0: + resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} + dependencies: + '@ethersproject/bytes': 5.7.0 + dev: false + + /@ethersproject/basex@5.7.0: + resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/properties': 5.7.0 + dev: false + + /@ethersproject/bignumber@5.7.0: + resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + bn.js: 5.2.1 + dev: false + + /@ethersproject/bytes@5.7.0: + resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} + dependencies: + '@ethersproject/logger': 5.7.0 + dev: false + + /@ethersproject/constants@5.7.0: + resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + dev: false + + /@ethersproject/contracts@5.7.0: + resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 + dev: false + + /@ethersproject/hash@5.7.0: + resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: false + + /@ethersproject/hdnode@5.7.0: + resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 + dev: false + + /@ethersproject/json-wallets@5.7.0: + resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + aes-js: 3.0.0 + scrypt-js: 3.0.1 + dev: false + + /@ethersproject/keccak256@5.7.0: + resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} + dependencies: + '@ethersproject/bytes': 5.7.0 + js-sha3: 0.8.0 + dev: false + + /@ethersproject/logger@5.7.0: + resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} + dev: false + + /@ethersproject/networks@5.7.1: + resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} + dependencies: + '@ethersproject/logger': 5.7.0 + dev: false + + /@ethersproject/pbkdf2@5.7.0: + resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/sha2': 5.7.0 + dev: false + + /@ethersproject/properties@5.7.0: + resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} + dependencies: + '@ethersproject/logger': 5.7.0 + dev: false + + /@ethersproject/providers@5.7.2: + resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 + bech32: 1.1.4 + ws: 7.4.6 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@ethersproject/random@5.7.0: + resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + dev: false + + /@ethersproject/rlp@5.7.0: + resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + dev: false + + /@ethersproject/sha2@5.7.0: + resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + hash.js: 1.1.7 + dev: false + + /@ethersproject/signing-key@5.7.0: + resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + bn.js: 5.2.1 + elliptic: 6.5.4 + hash.js: 1.1.7 + dev: false + + /@ethersproject/solidity@5.7.0: + resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: false + + /@ethersproject/strings@5.7.0: + resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + dev: false + + /@ethersproject/transactions@5.7.0: + resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + dev: false + + /@ethersproject/units@5.7.0: + resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + dev: false + + /@ethersproject/wallet@5.7.0: + resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/json-wallets': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 + dev: false + + /@ethersproject/web@5.7.1: + resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} + dependencies: + '@ethersproject/base64': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: false + + /@ethersproject/wordlists@5.7.0: + resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: false + + /@floating-ui/core@1.4.1: + resolution: {integrity: sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==} + dependencies: + '@floating-ui/utils': 0.1.1 + dev: false + + /@floating-ui/dom@1.5.1: + resolution: {integrity: sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==} + dependencies: + '@floating-ui/core': 1.4.1 + '@floating-ui/utils': 0.1.1 + dev: false + + /@floating-ui/react-dom@2.0.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-rZtAmSht4Lry6gdhAJDrCp/6rKN7++JnL1/Anbr/DdeyYXQPxvg/ivrbYvJulbRf4vL8b212suwMM2lxbv+RQA==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@floating-ui/dom': 1.5.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@floating-ui/utils@0.1.1: + resolution: {integrity: sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==} + dev: false + + /@formatjs/ecma402-abstract@1.17.0: + resolution: {integrity: sha512-6ueQTeJZtwKjmh23bdkq/DMqH4l4bmfvtQH98blOSbiXv/OUiyijSW6jU22IT8BNM1ujCaEvJfTtyCYVH38EMQ==} + dependencies: + '@formatjs/intl-localematcher': 0.4.0 + tslib: 2.6.1 + dev: false + + /@formatjs/fast-memoize@2.2.0: + resolution: {integrity: sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==} + dependencies: + tslib: 2.6.1 + dev: false + + /@formatjs/icu-messageformat-parser@2.6.0: + resolution: {integrity: sha512-yT6at0qc0DANw9qM/TU8RZaCtfDXtj4pZM/IC2WnVU80yAcliS3KVDiuUt4jSQAeFL9JS5bc2hARnFmjPdA6qw==} + dependencies: + '@formatjs/ecma402-abstract': 1.17.0 + '@formatjs/icu-skeleton-parser': 1.6.0 + tslib: 2.6.1 + dev: false + + /@formatjs/icu-skeleton-parser@1.6.0: + resolution: {integrity: sha512-eMmxNpoX/J1IPUjPGSZwo0Wh+7CEvdEMddP2Jxg1gQJXfGfht/FdW2D5XDFj3VMbOTUQlDIdZJY7uC6O6gjPoA==} + dependencies: + '@formatjs/ecma402-abstract': 1.17.0 + tslib: 2.6.1 + dev: false + + /@formatjs/intl-localematcher@0.4.0: + resolution: {integrity: sha512-bRTd+rKomvfdS4QDlVJ6TA/Jx1F2h/TBVO5LjvhQ7QPPHp19oPNMIum7W2CMEReq/zPxpmCeB31F9+5gl/qtvw==} + dependencies: + tslib: 2.6.1 + dev: false + + /@humanwhocodes/config-array@0.11.10: + resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4(supports-color@5.5.0) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: true + + /@hutson/parse-repository-url@3.0.2: + resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} + engines: {node: '>=6.9.0'} + dev: false + + /@iarna/toml@2.2.5: + resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} + dev: false + + /@internationalized/date@3.4.0: + resolution: {integrity: sha512-QUDSGCsvrEVITVf+kv9VSAraAmCgjQmU5CiXtesUBBhBe374NmnEIIaOFBZ72t29dfGMBP0zF+v6toVnbcc6jg==} + dependencies: + '@swc/helpers': 0.5.1 + dev: false + + /@internationalized/message@3.1.1: + resolution: {integrity: sha512-ZgHxf5HAPIaR0th+w0RUD62yF6vxitjlprSxmLJ1tam7FOekqRSDELMg4Cr/DdszG5YLsp5BG3FgHgqquQZbqw==} + dependencies: + '@swc/helpers': 0.5.1 + intl-messageformat: 10.5.0 + dev: false + + /@internationalized/number@3.2.1: + resolution: {integrity: sha512-hK30sfBlmB1aIe3/OwAPg9Ey0DjjXvHEiGVhNaOiBJl31G0B6wMaX8BN3ibzdlpyRNE9p7X+3EBONmxtJO9Yfg==} + dependencies: + '@swc/helpers': 0.5.1 + dev: false + + /@internationalized/string@3.1.1: + resolution: {integrity: sha512-fvSr6YRoVPgONiVIUhgCmIAlifMVCeej/snPZVzbzRPxGpHl3o1GRe+d/qh92D8KhgOciruDUH8I5mjdfdjzfA==} + dependencies: + '@swc/helpers': 0.5.1 + dev: false + + /@ipld/car@3.2.4: + resolution: {integrity: sha512-rezKd+jk8AsTGOoJKqzfjLJ3WVft7NZNH95f0pfPbicROvzTyvHCNy567HzSUd6gRXZ9im29z5ZEv9Hw49jSYw==} + dependencies: + '@ipld/dag-cbor': 7.0.3 + multiformats: 9.9.0 + varint: 6.0.0 + dev: true + + /@ipld/dag-cbor@6.0.15: + resolution: {integrity: sha512-Vm3VTSTwlmGV92a3C5aeY+r2A18zbH2amehNhsX8PBa3muXICaWrN8Uri85A5hLH7D7ElhE8PdjxD6kNqUmTZA==} + dependencies: + cborg: 1.10.2 + multiformats: 9.9.0 + dev: true + + /@ipld/dag-cbor@7.0.3: + resolution: {integrity: sha512-1VVh2huHsuohdXC1bGJNE8WR72slZ9XE2T3wbBBq31dm7ZBatmKLLxrB+XAqafxfRFjv08RZmj/W/ZqaM13AuA==} + dependencies: + cborg: 1.10.2 + multiformats: 9.9.0 + dev: true + + /@ipld/dag-pb@2.1.18: + resolution: {integrity: sha512-ZBnf2fuX9y3KccADURG5vb9FaOeMjFkCrNysB0PtftME/4iCTjxfaLoNq/IAh5fTqUOMXvryN6Jyka4ZGuMLIg==} + dependencies: + multiformats: 9.9.0 + dev: true + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.19 + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + + /@jridgewell/source-map@0.3.5: + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping@0.3.19: + resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + + /@js-joda/core@5.5.3: + resolution: {integrity: sha512-7dqNYwG8gCt4hfg5PKgM7xLEcgSBcx/UgC92OMnhMmvAnq11QzDFPrxUkNR/u5kn17WWLZ8beZ4A3Qrz4pZcmQ==} + dev: false + + /@keplr-wallet/common@0.11.64: + resolution: {integrity: sha512-kEnv6K+TxH+BBwwqUgiTcIXuRLBn6PaZMO4jwJbE1O8C8Qh/2j1QtkMLAMgl3Nj9qQkHgJ/dvA5oIqOIdLVMwg==} + dependencies: + '@keplr-wallet/crypto': 0.11.64 + buffer: 6.0.3 + delay: 4.4.1 + dev: false + + /@keplr-wallet/cosmos@0.11.64: + resolution: {integrity: sha512-S6pLRaDKOyOFPfry7Km+Bgwr087gwHI4n3fp8NLGHtL75mLnOdeGvSEVW5LXJEWc5EyYgngM2CeS7xNHz+vjHg==} + dependencies: + '@ethersproject/address': 5.7.0 + '@keplr-wallet/common': 0.11.64 + '@keplr-wallet/crypto': 0.11.64 + '@keplr-wallet/proto-types': 0.11.64 + '@keplr-wallet/types': 0.11.64 + '@keplr-wallet/unit': 0.11.64 + axios: 0.27.2 + bech32: 1.1.4 + buffer: 6.0.3 + long: 4.0.0 + protobufjs: 6.11.4 + transitivePeerDependencies: + - debug + dev: false + + /@keplr-wallet/crypto@0.11.64: + resolution: {integrity: sha512-DMeGhs+UUBpvefYa/0pF8h8D0lVS1T/eTGNKrn7SIO5CBMp1qfght+k1Se0pHGLr4CAtxFSXTDvYm3mr+ovKhg==} + dependencies: + '@ethersproject/keccak256': 5.7.0 + bip32: 2.0.6 + bip39: 3.1.0 + bs58check: 2.1.2 + buffer: 6.0.3 + crypto-js: 4.1.1 + elliptic: 6.5.4 + sha.js: 2.4.11 + dev: false + + /@keplr-wallet/proto-types@0.11.64: + resolution: {integrity: sha512-3oxfD1+zHPPuyKz41wt5A/gVhf2FQbA/L2u/4TxnmnITkY3IENirvMDrZUDJF0pWyGgZuXjhoVVFN2hMWI++PQ==} + dependencies: + long: 4.0.0 + protobufjs: 6.11.4 + dev: false + + /@keplr-wallet/types@0.11.64: + resolution: {integrity: sha512-GgzeLDHHfZFyne3O7UIfFHj/uYqVbxAZI31RbBwt460OBbvwQzjrlZwvJW3vieWRAgxKSITjzEDBl2WneFTQdQ==} + dependencies: + axios: 0.27.2 + long: 4.0.0 + transitivePeerDependencies: + - debug + dev: false + + /@keplr-wallet/unit@0.11.64: + resolution: {integrity: sha512-BKTaDYI17QgEcBBCP5ZqsHsfNH29P6VMRxjR4nOXcJfhsuwvdJxa/p88VwQYbpVBw0oXcDOwudNiu7Bgf8w6QQ==} + dependencies: + '@keplr-wallet/types': 0.11.64 + big-integer: 1.6.51 + utility-types: 3.10.0 + transitivePeerDependencies: + - debug + dev: false + + /@ladle/react-context@1.0.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-xVQ8siyOEQG6e4Knibes1uA3PTyXnqiMmfSmd5pIbkzeDty8NCBtYHhTXSlfmcDNEsw/G8OzNWo4VbyQAVDl2A==} + peerDependencies: + react: '>=16.14.0' + react-dom: '>=16.14.0' + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /@ladle/react@2.15.0(@types/node@20.3.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-rEl5WU1f0YQO+oXFV9fh2FQUHdXR/k4waLxHBnVyJoQvNvZKZJiKSXkzi7kNIxQazK5iVla12pbhlvDe2jR/Yw==} + engines: {node: '>=16.0.0'} + hasBin: true + peerDependencies: + react: '>=16.14.0' + react-dom: '>=16.14.0' + dependencies: + '@babel/code-frame': 7.22.10 + '@babel/core': 7.22.5 + '@babel/generator': 7.22.10 + '@babel/parser': 7.22.10 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.10(supports-color@5.5.0) + '@babel/types': 7.22.10 + '@ladle/react-context': 1.0.1(react-dom@18.2.0)(react@18.2.0) + '@mdx-js/mdx': 2.3.0 + '@mdx-js/react': 2.3.0(react@18.2.0) + '@vitejs/plugin-react': 3.1.0(vite@4.3.9) + '@vitejs/plugin-react-swc': 3.1.0(vite@4.3.9) + axe-core: 4.7.2 + boxen: 7.1.1 + chokidar: 3.5.3 + classnames: 2.3.2 + commander: 10.0.1 + cross-spawn: 7.0.3 + debug: 4.3.4(supports-color@5.5.0) + get-port: 6.1.2 + globby: 13.2.2 + history: 5.3.0 + koa: 2.14.2 + koa-connect: 2.1.0 + lodash.merge: 4.6.2 + open: 9.1.0 + prism-react-renderer: 1.3.5(react@18.2.0) + prop-types: 15.8.1 + query-string: 8.1.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-frame-component: 5.2.4(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0) + react-inspector: 6.0.2(react@18.2.0) + rehype-raw: 6.1.1 + remark-gfm: 3.0.1 + source-map: 0.7.4 + vfile: 5.3.7 + vite: 4.3.9(@types/node@20.3.1) + vite-tsconfig-paths: 3.6.0(vite@4.3.9) + transitivePeerDependencies: + - '@swc/helpers' + - '@types/node' + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /@ledgerhq/connect-kit-loader@1.1.2: + resolution: {integrity: sha512-mscwGroSJQrCTjtNGBu+18FQbZYA4+q6Tyx6K7CXHl6AwgZKbWfZYdgP2F+fyZcRUdGRsMX8QtvU61VcGGtO1A==} + dev: false + + /@lit-labs/ssr-dom-shim@1.1.1: + resolution: {integrity: sha512-kXOeFbfCm4fFf2A3WwVEeQj55tMZa8c8/f9AKHMobQMkzNUfUj+antR3fRPaZJawsa1aZiP/Da3ndpZrwEe4rQ==} + dev: false + + /@lit/reactive-element@1.6.3: + resolution: {integrity: sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==} + dependencies: + '@lit-labs/ssr-dom-shim': 1.1.1 + dev: false + + /@mdx-js/mdx@2.3.0: + resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/mdx': 2.0.6 + estree-util-build-jsx: 2.2.2 + estree-util-is-identifier-name: 2.1.0 + estree-util-to-js: 1.2.0 + estree-walker: 3.0.3 + hast-util-to-estree: 2.3.3 + markdown-extensions: 1.1.1 + periscopic: 3.1.0 + remark-mdx: 2.3.0 + remark-parse: 10.0.2 + remark-rehype: 10.1.0 + unified: 10.1.2 + unist-util-position-from-estree: 1.1.2 + unist-util-stringify-position: 3.0.3 + unist-util-visit: 4.1.2 + vfile: 5.3.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@mdx-js/react@2.3.0(react@18.2.0): + resolution: {integrity: sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==} + peerDependencies: + react: '>=16' + dependencies: + '@types/mdx': 2.0.6 + '@types/react': 18.2.14 + react: 18.2.0 + dev: true + + /@metamask/safe-event-emitter@2.0.0: + resolution: {integrity: sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q==} + dev: false + + /@metamask/utils@3.6.0: + resolution: {integrity: sha512-9cIRrfkWvHblSiNDVXsjivqa9Ak0RYo/1H6tqTqTbAx+oBK2Sva0lWDHxGchOqA7bySGUJKAWSNJvH6gdHZ0gQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@types/debug': 4.1.8 + debug: 4.3.4(supports-color@5.5.0) + semver: 7.5.4 + superstruct: 1.0.3 + transitivePeerDependencies: + - supports-color + dev: false + + /@motionone/animation@10.15.1: + resolution: {integrity: sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ==} + dependencies: + '@motionone/easing': 10.15.1 + '@motionone/types': 10.15.1 + '@motionone/utils': 10.15.1 + tslib: 2.6.1 + dev: false + + /@motionone/dom@10.16.2: + resolution: {integrity: sha512-bnuHdNbge1FutZXv+k7xub9oPWcF0hsu8y1HTH/qg6av58YI0VufZ3ngfC7p2xhMJMnoh0LXFma2EGTgPeCkeg==} + dependencies: + '@motionone/animation': 10.15.1 + '@motionone/generators': 10.15.1 + '@motionone/types': 10.15.1 + '@motionone/utils': 10.15.1 + hey-listen: 1.0.8 + tslib: 2.6.1 + dev: false + + /@motionone/easing@10.15.1: + resolution: {integrity: sha512-6hIHBSV+ZVehf9dcKZLT7p5PEKHGhDwky2k8RKkmOvUoYP3S+dXsKupyZpqx5apjd9f+php4vXk4LuS+ADsrWw==} + dependencies: + '@motionone/utils': 10.15.1 + tslib: 2.6.1 + dev: false + + /@motionone/generators@10.15.1: + resolution: {integrity: sha512-67HLsvHJbw6cIbLA/o+gsm7h+6D4Sn7AUrB/GPxvujse1cGZ38F5H7DzoH7PhX+sjvtDnt2IhFYF2Zp1QTMKWQ==} + dependencies: + '@motionone/types': 10.15.1 + '@motionone/utils': 10.15.1 + tslib: 2.6.1 + dev: false + + /@motionone/svelte@10.16.2: + resolution: {integrity: sha512-38xsroKrfK+aHYhuQlE6eFcGy0EwrB43Q7RGjF73j/kRUTcLNu/LAaKiLLsN5lyqVzCgTBVt4TMT/ShWbTbc5Q==} + dependencies: + '@motionone/dom': 10.16.2 + tslib: 2.6.1 + dev: false + + /@motionone/types@10.15.1: + resolution: {integrity: sha512-iIUd/EgUsRZGrvW0jqdst8st7zKTzS9EsKkP+6c6n4MPZoQHwiHuVtTQLD6Kp0bsBLhNzKIBlHXponn/SDT4hA==} + dev: false + + /@motionone/utils@10.15.1: + resolution: {integrity: sha512-p0YncgU+iklvYr/Dq4NobTRdAPv9PveRDUXabPEeOjBLSO/1FNB2phNTZxOxpi1/GZwYpAoECEa0Wam+nsmhSw==} + dependencies: + '@motionone/types': 10.15.1 + hey-listen: 1.0.8 + tslib: 2.6.1 + dev: false + + /@motionone/vue@10.16.2: + resolution: {integrity: sha512-7/dEK/nWQXOkJ70bqb2KyNfSWbNvWqKKq1C8juj+0Mg/AorgD8O5wE3naddK0G+aXuNMqRuc4jlsYHHWHtIzVw==} + dependencies: + '@motionone/dom': 10.16.2 + tslib: 2.6.1 + dev: false + + /@multiformats/murmur3@1.1.3: + resolution: {integrity: sha512-wAPLUErGR8g6Lt+bAZn6218k9YQPym+sjszsXL6o4zfxbA22P+gxWZuuD9wDbwL55xrKO5idpcuQUX7/E3oHcw==} + dependencies: + multiformats: 9.9.0 + murmurhash3js-revisited: 3.0.0 + dev: true + + /@noble/curves@1.0.0: + resolution: {integrity: sha512-2upgEu0iLiDVDZkNLeFV2+ht0BAVgQnEmCk6JsOch9Rp8xfkMCbvbAZlA2pBHQc73dbl+vFOXfqkf4uemdn0bw==} + dependencies: + '@noble/hashes': 1.3.0 + dev: false + + /@noble/curves@1.1.0: + resolution: {integrity: sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==} + dependencies: + '@noble/hashes': 1.3.1 + dev: false + + /@noble/ed25519@1.7.3: + resolution: {integrity: sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ==} + dev: true + + /@noble/hashes@1.1.2: + resolution: {integrity: sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==} + dev: false + + /@noble/hashes@1.3.0: + resolution: {integrity: sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg==} + dev: false + + /@noble/hashes@1.3.1: + resolution: {integrity: sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==} + engines: {node: '>= 16'} + dev: false + + /@noble/secp256k1@1.7.1: + resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + + /@octokit/auth-token@3.0.4: + resolution: {integrity: sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==} + engines: {node: '>= 14'} + dev: false + + /@octokit/core@4.2.4: + resolution: {integrity: sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==} + engines: {node: '>= 14'} + dependencies: + '@octokit/auth-token': 3.0.4 + '@octokit/graphql': 5.0.6 + '@octokit/request': 6.2.8 + '@octokit/request-error': 3.0.3 + '@octokit/types': 9.3.2 + before-after-hook: 2.2.3 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: false + + /@octokit/endpoint@7.0.6: + resolution: {integrity: sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==} + engines: {node: '>= 14'} + dependencies: + '@octokit/types': 9.3.2 + is-plain-object: 5.0.0 + universal-user-agent: 6.0.0 + dev: false + + /@octokit/graphql@5.0.6: + resolution: {integrity: sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==} + engines: {node: '>= 14'} + dependencies: + '@octokit/request': 6.2.8 + '@octokit/types': 9.3.2 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: false + + /@octokit/openapi-types@18.0.0: + resolution: {integrity: sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==} + dev: false + + /@octokit/plugin-paginate-rest@6.1.2(@octokit/core@4.2.4): + resolution: {integrity: sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==} + engines: {node: '>= 14'} + peerDependencies: + '@octokit/core': '>=4' + dependencies: + '@octokit/core': 4.2.4 + '@octokit/tsconfig': 1.0.2 + '@octokit/types': 9.3.2 + dev: false + + /@octokit/plugin-request-log@1.0.4(@octokit/core@4.2.4): + resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 4.2.4 + dev: false + + /@octokit/plugin-rest-endpoint-methods@7.2.3(@octokit/core@4.2.4): + resolution: {integrity: sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==} + engines: {node: '>= 14'} + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 4.2.4 + '@octokit/types': 10.0.0 + dev: false + + /@octokit/request-error@3.0.3: + resolution: {integrity: sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==} + engines: {node: '>= 14'} + dependencies: + '@octokit/types': 9.3.2 + deprecation: 2.3.1 + once: 1.4.0 + dev: false + + /@octokit/request@6.2.8: + resolution: {integrity: sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==} + engines: {node: '>= 14'} + dependencies: + '@octokit/endpoint': 7.0.6 + '@octokit/request-error': 3.0.3 + '@octokit/types': 9.3.2 + is-plain-object: 5.0.0 + node-fetch: 2.6.12 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: false + + /@octokit/rest@19.0.11: + resolution: {integrity: sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw==} + engines: {node: '>= 14'} + dependencies: + '@octokit/core': 4.2.4 + '@octokit/plugin-paginate-rest': 6.1.2(@octokit/core@4.2.4) + '@octokit/plugin-request-log': 1.0.4(@octokit/core@4.2.4) + '@octokit/plugin-rest-endpoint-methods': 7.2.3(@octokit/core@4.2.4) + transitivePeerDependencies: + - encoding + dev: false + + /@octokit/tsconfig@1.0.2: + resolution: {integrity: sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==} + dev: false + + /@octokit/types@10.0.0: + resolution: {integrity: sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==} + dependencies: + '@octokit/openapi-types': 18.0.0 + dev: false + + /@octokit/types@9.3.2: + resolution: {integrity: sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==} + dependencies: + '@octokit/openapi-types': 18.0.0 + dev: false + + /@osmonauts/lcd@0.10.0: + resolution: {integrity: sha512-PzmXk9x9MHyLn2fUztpAqWqvDmMiEJaQv/JcAoAOE8VdHrD9Hf/KWnE1RZtamuS2ngQRqvQPD0xotCGXW7eTxA==} + dependencies: + '@babel/runtime': 7.22.10 + axios: 0.27.2 + transitivePeerDependencies: + - debug + dev: false + + /@osmonauts/lcd@0.6.0: + resolution: {integrity: sha512-vz9VavXrEfxZoXbSAfNfk90MLpn34XtBYPV3L9YilE+s56AhqYxUh83nne9J5somnTRfGnyR3oeV8C+lHkqiuA==} + dependencies: + '@babel/runtime': 7.22.10 + axios: 0.27.2 + transitivePeerDependencies: + - debug + dev: false + + /@pkgr/utils@2.4.2: + resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + dependencies: + cross-spawn: 7.0.3 + fast-glob: 3.3.1 + is-glob: 4.0.3 + open: 9.1.0 + picocolors: 1.0.0 + tslib: 2.6.1 + dev: true + + /@pnpm/config.env-replace@1.1.0: + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + dev: false + + /@pnpm/network.ca-file@1.0.2: + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + dependencies: + graceful-fs: 4.2.10 + dev: false + + /@pnpm/npm-conf@2.2.2: + resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==} + engines: {node: '>=12'} + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + dev: false + + /@protobufjs/aspromise@1.1.2: + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + /@protobufjs/base64@1.1.2: + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + /@protobufjs/codegen@2.0.4: + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + /@protobufjs/eventemitter@1.1.0: + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + /@protobufjs/fetch@1.1.0: + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + + /@protobufjs/float@1.0.2: + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + /@protobufjs/inquire@1.1.0: + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + /@protobufjs/path@1.1.2: + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + /@protobufjs/pool@1.1.0: + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + /@protobufjs/utf8@1.1.0: + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + + /@radix-ui/number@1.0.1: + resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==} + dependencies: + '@babel/runtime': 7.22.10 + dev: false + + /@radix-ui/primitive@1.0.0: + resolution: {integrity: sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==} + dependencies: + '@babel/runtime': 7.22.10 + dev: false + + /@radix-ui/primitive@1.0.1: + resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} + dependencies: + '@babel/runtime': 7.22.10 + dev: false + + /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-compose-refs@1.0.0(react@18.2.0): + resolution: {integrity: sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.22.10 + react: 18.2.0 + dev: false + + /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@types/react': 18.2.14 + react: 18.2.0 + dev: false + + /@radix-ui/react-context@1.0.0(react@18.2.0): + resolution: {integrity: sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.22.10 + react: 18.2.0 + dev: false + + /@radix-ui/react-context@1.0.1(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@types/react': 18.2.14 + react: 18.2.0 + dev: false + + /@radix-ui/react-dialog@1.0.0(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Yn9YU+QlHYLWwV1XfKiqnGVpWYWk6MeBVM6x/bcoyPvxgjQGoeT35482viLPctTMWoMw0PoHgqfSox7Ig+957Q==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.0 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) + '@radix-ui/react-context': 1.0.0(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.0(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.0(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.0(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.0(react@18.2.0) + '@radix-ui/react-portal': 1.0.0(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.0(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.0(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.0(react@18.2.0) + aria-hidden: 1.2.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.4(@types/react@18.2.14)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + dev: false + + /@radix-ui/react-dialog@1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-hJtRy/jPULGQZceSAP2Re6/4NpKo8im6V8P2hUqZsdFiSL8l35kYsw3qbRI6Ay5mQd2+wlLqje770eq+RJ3yZg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + aria-hidden: 1.2.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.14)(react@18.2.0) + dev: false + + /@radix-ui/react-direction@1.0.1(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@types/react': 18.2.14 + react: 18.2.0 + dev: false + + /@radix-ui/react-dismissable-layer@1.0.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-n7kDRfx+LB1zLueRDvZ1Pd0bxdJWDUZNQ/GWoxDn2prnuJKRdxsjulejX/ePkOsLi2tTm6P24mDqlMSgQpsT6g==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.0 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) + '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) + '@radix-ui/react-use-escape-keydown': 1.0.0(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-dropdown-menu@2.0.5(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-xdOrZzOTocqqkCkYo8yRPCib5OkTkqN7lqNCdxwPOdE466DOaNl4N8PkUIlsXthQvW5Wwkd+aEmWpfWlBoDPEw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-menu': 2.0.5(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-focus-guards@1.0.0(react@18.2.0): + resolution: {integrity: sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.22.10 + react: 18.2.0 + dev: false + + /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@types/react': 18.2.14 + react: 18.2.0 + dev: false + + /@radix-ui/react-focus-scope@1.0.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) + '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-id@1.0.0(react@18.2.0): + resolution: {integrity: sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@radix-ui/react-id@1.0.1(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + react: 18.2.0 + dev: false + + /@radix-ui/react-menu@2.0.5(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Gw4f9pwdH+w5w+49k0gLjN0PfRDHvxmAgG16AbyJZ7zhwZ6PBHKtWohvnSwfusfnK3L68dpBREHpVkj8wEM7ZA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + aria-hidden: 1.2.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.14)(react@18.2.0) + dev: false + + /@radix-ui/react-navigation-menu@1.1.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-x4Uv0N47ABx3/frJazYXxvMpZeKJe0qmRIgQ2o3lhTqnTVg+CaZfVVO4nQLn3QJcDkTz8icElKffhFng47XIBA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-popover@1.0.6(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-cZ4defGpkZ0qTRtlIBzJLSzL6ht7ofhhW4i1+pkemjV1IKXm0wgCRnee154qlV6r9Ttunmh2TNZhMfV2bavUyA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + aria-hidden: 1.2.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.14)(react@18.2.0) + dev: false + + /@radix-ui/react-popper@1.1.2(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@floating-ui/react-dom': 2.0.1(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/rect': 1.0.1 + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-portal@1.0.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-portal@1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-presence@1.0.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-primitive@1.0.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-slot': 1.0.0(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-radio-group@1.1.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-x+yELayyefNeKeTx4fjK6j99Fs6c4qKm3aY38G3swQVTN6xMpsrbigC0uHs2L//g8q4qR7qOcww8430jJmi2ag==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-select@1.2.2(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/number': 1.0.1 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + aria-hidden: 1.2.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.14)(react@18.2.0) + dev: false + + /@radix-ui/react-separator@1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-slider@1.1.2(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-NKs15MJylfzVsCagVSWKhGGLNR1W9qWs+HtgbmjjVUB3B9+lb3PYoXxVju3kOrpf0VKyVCtZp+iTwVoqpa1Chw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/number': 1.0.1 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-slot@1.0.0(react@18.2.0): + resolution: {integrity: sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@radix-ui/react-slot@1.0.2(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + react: 18.2.0 + dev: false + + /@radix-ui/react-switch@1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-mxm87F88HyHztsI7N+ZUmEoARGkC22YVW5CaC+Byc+HRpuvCrOBPTAnXgf+tZ/7i0Sg/eOePGdMhUKhPaQEqow==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-tabs@1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-egZfYY/+wRNCflXNHx+dePvnz9FbmssDTJBtgRfDY7e8SE5oIo3Py2eCB1ckAbh1Q7cQ/6yJZThJ++sgbxibog==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-toast@1.1.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-wf+fc8DOywrpRK3jlPlWVe+ELYGHdKDaaARJZNuUTWyWYq7+ANCFLp4rTjZ/mcGkJJQ/vZ949Zis9xxEpfq9OA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-toggle-group@1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Uaj/M/cMyiyT9Bx6fOZO0SAG4Cls0GptBWiBmBxofmDbNVnYYoyRWj/2M/6VCi/7qcXFWnHhRUfdfZFvvkuu8A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-toggle': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-toggle@1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Pkqg3+Bc98ftZGsl60CLANXQBBQ4W3mTFS9EJvNxKMZ7magklKV69/id1mlAlOFDDfHvlCms0fx8fA4CMKDJHg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-toolbar@1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-tBgmM/O7a07xbaEkYJWYTXkIdU/1pW4/KZORR43toC/4XWyBCURK0ei9kMUdp+gTPPKBgYLxXmRSH1EVcIDp8Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-separator': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-toggle-group': 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-tooltip@1.0.6(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-DmNFOiwEc2UDigsYj6clJENma58OelxD24O4IODoZ+3sQc3Zb+L8w1EP+y9laTuKCLAysPw4fD6/v0j4KNV8rg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-use-callback-ref@1.0.0(react@18.2.0): + resolution: {integrity: sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.22.10 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@types/react': 18.2.14 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-controllable-state@1.0.0(react@18.2.0): + resolution: {integrity: sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-escape-keydown@1.0.0(react@18.2.0): + resolution: {integrity: sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-layout-effect@1.0.0(react@18.2.0): + resolution: {integrity: sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.22.10 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@types/react': 18.2.14 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-previous@1.0.1(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@types/react': 18.2.14 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/rect': 1.0.1 + '@types/react': 18.2.14 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-size@1.0.1(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.14)(react@18.2.0) + '@types/react': 18.2.14 + react: 18.2.0 + dev: false + + /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/rect@1.0.1: + resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} + dependencies: + '@babel/runtime': 7.22.10 + dev: false + + /@react-aria/breadcrumbs@3.5.4(react@18.2.0): + resolution: {integrity: sha512-CtBAL7xDDHXpZvmglhEYbNAXeoXNl4Ke+Rwn2WTHVr9blry3P17IL4Elou5QAkyzI2GNHnXUs9K6lzX/uLv+kQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/link': 3.5.3(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/breadcrumbs': 3.6.1(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/button@3.8.1(react@18.2.0): + resolution: {integrity: sha512-igxZ871An3Clpmpw+beN8F792NfEnEaLRAZ4jITtC/FdzwQwRM7eCu/ZEaqpNtbUtruAmYhafnG/2uCkKhTpTw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/toggle': 3.6.1(react@18.2.0) + '@react-types/button': 3.7.4(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/calendar@3.4.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-mXz4v0iSPtPX9SR6LaIzSAE5n2blCujaQ+EiM6G91TM3S7BsHqyELiJcV/ucDD7ncr6ovJpm1JsLFOOAn44YTQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@internationalized/date': 3.4.0 + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/live-announcer': 3.3.1 + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/calendar': 3.3.1(react@18.2.0) + '@react-types/button': 3.7.4(react@18.2.0) + '@react-types/calendar': 3.3.1(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@react-aria/checkbox@3.10.0(react@18.2.0): + resolution: {integrity: sha512-1s5jkmag+41Fa2BwoOoM5cRRadDh3N8khgsziuGzD0NqvZLRCtHgDetNlileezFHwOeOWK6zCqDOrYLJhcMi8g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/label': 3.6.1(react@18.2.0) + '@react-aria/toggle': 3.7.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/checkbox': 3.4.4(react@18.2.0) + '@react-stately/toggle': 3.6.1(react@18.2.0) + '@react-types/checkbox': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/combobox@3.6.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-zry8Jh//BrGZ7+qJP3iiFZeb3+EuOjjy6MTmDT3zg60YwGgDArsaSA5s0gopF0fuiOKqlDRCDZ+T3CLyoeOomA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/listbox': 3.10.1(react@18.2.0) + '@react-aria/live-announcer': 3.3.1 + '@react-aria/menu': 3.10.1(react-dom@18.2.0)(react@18.2.0) + '@react-aria/overlays': 3.16.0(react-dom@18.2.0)(react@18.2.0) + '@react-aria/selection': 3.16.1(react@18.2.0) + '@react-aria/textfield': 3.11.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/combobox': 3.6.0(react@18.2.0) + '@react-stately/layout': 3.13.0(react@18.2.0) + '@react-types/button': 3.7.4(react@18.2.0) + '@react-types/combobox': 3.7.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@react-aria/datepicker@3.6.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-b6LThZJSF9mboFeATUMboTIxSGgW7MjH2vnDZ7UdRQ/ZHZVNX+fjzQ5uOQQ30wJRP44t273jfvxc9OXEMD9CPQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@internationalized/date': 3.4.0 + '@internationalized/number': 3.2.1 + '@internationalized/string': 3.1.1 + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/label': 3.6.1(react@18.2.0) + '@react-aria/spinbutton': 3.5.1(react-dom@18.2.0)(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/datepicker': 3.6.0(react@18.2.0) + '@react-types/button': 3.7.4(react@18.2.0) + '@react-types/calendar': 3.3.1(react@18.2.0) + '@react-types/datepicker': 3.5.0(react@18.2.0) + '@react-types/dialog': 3.5.4(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@react-aria/dialog@3.5.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-+YGjX5ygYvFvnRGDy7LVTL2uRCH5VYosMNKn0vyel99SiwHH9d8fdnnJjVvSJ3u8kvoXk22+OnRE2/vEX+G1EA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/overlays': 3.16.0(react-dom@18.2.0)(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/overlays': 3.6.1(react@18.2.0) + '@react-types/dialog': 3.5.4(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + transitivePeerDependencies: + - react-dom + dev: false + + /@react-aria/dnd@3.4.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-4KxdC2FXPL/+ZAsv7RVrZ+kC35dxU4yBowdtmZuagTasLSgfuS3SSyY/VRVgQ+Uq8lUgb55u62+km6xc47n7zA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@internationalized/string': 3.1.1 + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/live-announcer': 3.3.1 + '@react-aria/overlays': 3.16.0(react-dom@18.2.0)(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-aria/visually-hidden': 3.8.3(react@18.2.0) + '@react-stately/dnd': 3.2.3(react@18.2.0) + '@react-types/button': 3.7.4(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@react-aria/focus@3.14.0(react@18.2.0): + resolution: {integrity: sha512-Xw7PxLT0Cqcz22OVtTZ8+HvurDogn9/xntzoIbVjpRFWzhlYe5WHnZL+2+gIiKf7EZ18Ma9/QsCnrVnvrky/Kw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + clsx: 1.2.1 + react: 18.2.0 + dev: false + + /@react-aria/grid@3.8.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-J/k7i2ZnMgTv3csMIQrIanbb0mWzlokT86QfKDgQpKxIvrPGbdrVJTx99tzJxEzYeXN9w11Jjwjal65rZCs4rQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/live-announcer': 3.3.1 + '@react-aria/selection': 3.16.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/grid': 3.8.0(react@18.2.0) + '@react-stately/selection': 3.13.3(react@18.2.0) + '@react-stately/virtualizer': 3.6.1(react@18.2.0) + '@react-types/checkbox': 3.5.0(react@18.2.0) + '@react-types/grid': 3.2.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@react-aria/gridlist@3.5.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-VEyEgOKov3lKizoqHpEUIZD+JzyyH8TK0WzWFo/f6lNvmzbYhnW2ciFmqD5DS3bHxLkoXMFdaiA0/MLofRYbHQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/grid': 3.8.1(react-dom@18.2.0)(react@18.2.0) + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/selection': 3.16.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/list': 3.9.1(react@18.2.0) + '@react-types/checkbox': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + transitivePeerDependencies: + - react-dom + dev: false + + /@react-aria/i18n@3.8.1(react@18.2.0): + resolution: {integrity: sha512-ftH3saJlhWaHoHEDb/YjYqP8I4/9t4Ksf0D0kvPDRfRcL98DKUSHZD77+EmbjsmzJInzm76qDeEV0FYl4oj7gg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@internationalized/date': 3.4.0 + '@internationalized/message': 3.1.1 + '@internationalized/number': 3.2.1 + '@internationalized/string': 3.1.1 + '@react-aria/ssr': 3.7.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/interactions@3.17.0(react@18.2.0): + resolution: {integrity: sha512-v4BI5Nd8gi8s297fHpgjDDXOyufX+FPHJ31rkMwY6X1nR5gtI0+2jNOL4lh7s+cWzszpA0wpwIrKUPGhhLyUjQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/ssr': 3.7.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/label@3.6.1(react@18.2.0): + resolution: {integrity: sha512-hR7Qx6q0BjOJi/YG5pI13QTQA/2oaXMYdzDCx4Faz8qaY9CCsLjFpo5pUUwRhNieGmf/nHJq6jiYbJqfaONuTQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/label': 3.7.5(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/link@3.5.3(react@18.2.0): + resolution: {integrity: sha512-WGz/s/czlb/+wJUnBfnfaRuvOSiNTaQDTk9QsEEwrTkkYbWo7fMlH5Tc7c0Uxem4UuUblYXKth5SskiKQNWc0w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/link': 3.4.4(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/listbox@3.10.1(react@18.2.0): + resolution: {integrity: sha512-hG+f7URcVk7saRG6bemCRaZSNMCg5U51ol/EuoKyHyvd0Vfq/AcsLYrg8vOyRWTsPwjxFtMLItNOZo36KIDs5w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/label': 3.6.1(react@18.2.0) + '@react-aria/selection': 3.16.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/list': 3.9.1(react@18.2.0) + '@react-types/listbox': 3.4.3(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/live-announcer@3.3.1: + resolution: {integrity: sha512-hsc77U7S16trM86d+peqJCOCQ7/smO1cybgdpOuzXyiwcHQw8RQ4GrXrS37P4Ux/44E9nMZkOwATQRT2aK8+Ew==} + dependencies: + '@swc/helpers': 0.5.1 + dev: false + + /@react-aria/menu@3.10.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-FOb16XVejZgl4sFpclLvGd2RCvUBwl2bzFdAnss8Nd6Mx+h4m0bPeDT102k9v1Vjo7OGeqzvMyNU/KM4FwUGGA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/overlays': 3.16.0(react-dom@18.2.0)(react@18.2.0) + '@react-aria/selection': 3.16.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/menu': 3.5.4(react@18.2.0) + '@react-stately/tree': 3.7.1(react@18.2.0) + '@react-types/button': 3.7.4(react@18.2.0) + '@react-types/menu': 3.9.3(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@react-aria/meter@3.4.4(react@18.2.0): + resolution: {integrity: sha512-dbn4Ur/w2PzqO8ChrVfkr+GHqaqbMElQlx0HVVbrHhOS1fCx1CC86bn8h767lhFMvh54Kv9MY2cYuygmVBxP1w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/progress': 3.4.4(react@18.2.0) + '@react-types/meter': 3.3.3(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/numberfield@3.7.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-vXerG2mCdAM82AHc7ZiMhKxpWHgjnG+YXkBu5wGRYunmg5exj4n5QVFFIAQgCiToCoJp7nhY9d34BclJbmHwrQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/live-announcer': 3.3.1 + '@react-aria/spinbutton': 3.5.1(react-dom@18.2.0)(react@18.2.0) + '@react-aria/textfield': 3.11.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/numberfield': 3.6.0(react@18.2.0) + '@react-types/button': 3.7.4(react@18.2.0) + '@react-types/numberfield': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@react-types/textfield': 3.7.3(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@react-aria/overlays@3.16.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-jclyCqs1U4XqDA1DAdZaiijKtHLVZ78FV0+IzL4QQfrvzCPC+ba+MC8pe/tw8dMQzXBSnTx/IEqOHu07IwrESQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/ssr': 3.7.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-aria/visually-hidden': 3.8.3(react@18.2.0) + '@react-stately/overlays': 3.6.1(react@18.2.0) + '@react-types/button': 3.7.4(react@18.2.0) + '@react-types/overlays': 3.8.1(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@react-aria/progress@3.4.4(react@18.2.0): + resolution: {integrity: sha512-k4EBtYcmqw3j/JYJtn+xKPM8/P1uPcFGSBqvwmVdwDknuT/hR1os3wIKm712N/Ubde8hTeeLcaa38HYezSF8BA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/label': 3.6.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/progress': 3.4.2(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/radio@3.7.0(react@18.2.0): + resolution: {integrity: sha512-ygSr3ow9avO5BNNwm4aL70EwvLHrBbhSVfG1lmP2k5u/2dxn+Pnm3BGMaEriOFiAyAV4nLGUZAjER6GWXfu5cA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/label': 3.6.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/radio': 3.8.3(react@18.2.0) + '@react-types/radio': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/searchfield@3.5.4(react@18.2.0): + resolution: {integrity: sha512-0jHQYoqT4OutAXNAsWjVJPwzTgZg5wAXIEuQlJuhdfBrjisbgGrYlSHN3Si7x2quXzvdExVL7e0aWRuu6bjjYg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/textfield': 3.11.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/searchfield': 3.4.4(react@18.2.0) + '@react-types/button': 3.7.4(react@18.2.0) + '@react-types/searchfield': 3.4.3(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/select@3.12.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-2n7NezoR6xfrcfCAmg8hz8+4i4Sci/F5LGoqa6/KlESrMSIRI7FLHNsZV+4qE4dWLvDwtnxG2itIfQad1iAqUQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/label': 3.6.1(react@18.2.0) + '@react-aria/listbox': 3.10.1(react@18.2.0) + '@react-aria/menu': 3.10.1(react-dom@18.2.0)(react@18.2.0) + '@react-aria/selection': 3.16.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-aria/visually-hidden': 3.8.3(react@18.2.0) + '@react-stately/select': 3.5.3(react@18.2.0) + '@react-types/button': 3.7.4(react@18.2.0) + '@react-types/select': 3.8.2(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@react-aria/selection@3.16.1(react@18.2.0): + resolution: {integrity: sha512-mOoAeNjq23H5p6IaeoyLHavYHRXOuNUlv8xO4OzYxIEnxmAvk4PCgidGLFYrr4sloftUMgTTL3LpCj21ylBS9A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/selection': 3.13.3(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/separator@3.3.4(react@18.2.0): + resolution: {integrity: sha512-Wb4TJ/PF6Q1yMIKfPM5z+SYwvNRW4RKBzB4oTNAWpSnj8pFimRNXYtyqIowZa67HOPgqzLptqxx6+mAsffCiuQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/slider@3.6.0(react@18.2.0): + resolution: {integrity: sha512-jfFv5q8wX4aAPxoxLcMmBFBUnAdjsryMNLgwN0fosKBLZzshyH9d4WT+Vc4TfVjs5+HHPbGQXeRLo3pgvIJkGQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/label': 3.6.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/radio': 3.8.3(react@18.2.0) + '@react-stately/slider': 3.4.1(react@18.2.0) + '@react-types/radio': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@react-types/slider': 3.6.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/spinbutton@3.5.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-VUMPxjt7TEw38kSyqE3A20UlQ5/0GvkeV/Q61tcjdef9vcf9Z+EJ7AKCcqbVLd9wIKYlPaJQ0JMHJrFJ9Mc91g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/live-announcer': 3.3.1 + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/button': 3.7.4(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@react-aria/ssr@3.7.1(react@18.2.0): + resolution: {integrity: sha512-ovVPSD1WlRpZHt7GI9DqJrWG3OIYS+NXQ9y5HIewMJpSe+jPQmMQfyRmgX4EnvmxSlp0u04Wg/7oItcoSIb/RA==} + engines: {node: '>= 12'} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/switch@3.5.3(react@18.2.0): + resolution: {integrity: sha512-3sV78Oa12/aU+M9P7BqUDdp/zm2zZA2QvtLLdxykrH04AJp0hLNBnmaTDXJVaGPPiU0umOB0LWDquA3apkBiBA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/toggle': 3.7.0(react@18.2.0) + '@react-stately/toggle': 3.6.1(react@18.2.0) + '@react-types/switch': 3.4.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/table@3.11.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-kPIQWh1dIHFAzl+rzfUGgbpAZGerMwwW0zNvRwcLpBOl/nrOwV5Zg/wuCC5cSdkwgo3SghYbcUaM19teve0UcQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/grid': 3.8.1(react-dom@18.2.0)(react@18.2.0) + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/live-announcer': 3.3.1 + '@react-aria/selection': 3.16.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-aria/visually-hidden': 3.8.3(react@18.2.0) + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/flags': 3.0.0 + '@react-stately/table': 3.11.0(react@18.2.0) + '@react-stately/virtualizer': 3.6.1(react@18.2.0) + '@react-types/checkbox': 3.5.0(react@18.2.0) + '@react-types/grid': 3.2.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@react-types/table': 3.8.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@react-aria/tabs@3.6.2(react@18.2.0): + resolution: {integrity: sha512-FjI0h1Z4TsLOvIODhdDrVLz0O8RAqxDi58DO88CwkdUrWwZspNEpSpHhDarzUT7MlX3X72lsAUwvQLqY1OmaBQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/selection': 3.16.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/list': 3.9.1(react@18.2.0) + '@react-stately/tabs': 3.5.1(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@react-types/tabs': 3.3.1(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/tag@3.1.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-k7UCmPOWKbE5Vw2Ok2+OcjhISeadXOagGD0mN7rx/25zPLd2KcEnaHhkjnkH7dfLg1356IvzwvMt70Jp28M5kA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/gridlist': 3.5.1(react-dom@18.2.0)(react@18.2.0) + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/label': 3.6.1(react@18.2.0) + '@react-aria/selection': 3.16.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/list': 3.9.1(react@18.2.0) + '@react-types/button': 3.7.4(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + transitivePeerDependencies: + - react-dom + dev: false + + /@react-aria/textfield@3.11.0(react@18.2.0): + resolution: {integrity: sha512-07pHRuWeLmsmciWL8y9azUwcBYi1IBmOT9KxBgLdLK5NLejd7q2uqd0WEEgZkOc48i2KEtMDgBslc4hA+cmHow==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/label': 3.6.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@react-types/textfield': 3.7.3(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/toggle@3.7.0(react@18.2.0): + resolution: {integrity: sha512-8Rpqolm8dxesyHi03RSmX2MjfHO/YwdhyEpAMMO0nsajjdtZneGzIOXzyjdWCPWwwzahcpwRHOA4qfMiRz+axA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/toggle': 3.6.1(react@18.2.0) + '@react-types/checkbox': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@react-types/switch': 3.4.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/tooltip@3.6.1(react@18.2.0): + resolution: {integrity: sha512-CVSmndGXhC5EkkGrKcC8EVdAKCbSLTyJibpojC/8uOCbGIQglq3xCAr68PElNNO8+sFDJ4fp9ZzEeDi0Qyxf0w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/tooltip': 3.4.3(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@react-types/tooltip': 3.4.3(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/utils@3.19.0(react@18.2.0): + resolution: {integrity: sha512-5GXqTCrUQtr78aiLVHZoeeGPuAxO4lCM+udWbKpSCh5xLfCZ7zFlZV9Q9FS0ea+IQypUcY8ngXCLsf22nSu/yg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/ssr': 3.7.1(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + clsx: 1.2.1 + react: 18.2.0 + dev: false + + /@react-aria/visually-hidden@3.8.3(react@18.2.0): + resolution: {integrity: sha512-Ln3rqUnPF/UiiPjj8Xjc5FIagwNvG16qtAR2Diwnsju+X9o2xeDEZhN/5fg98PxH2JBS3IvtsmMZRzPT9mhpmg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + clsx: 1.2.1 + react: 18.2.0 + dev: false + + /@react-spring/animated@9.7.3(react@18.2.0): + resolution: {integrity: sha512-5CWeNJt9pNgyvuSzQH+uy2pvTg8Y4/OisoscZIR8/ZNLIOI+CatFBhGZpDGTF/OzdNFsAoGk3wiUYTwoJ0YIvw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@react-spring/shared': 9.7.3(react@18.2.0) + '@react-spring/types': 9.7.3 + react: 18.2.0 + dev: false + + /@react-spring/core@9.7.3(react@18.2.0): + resolution: {integrity: sha512-IqFdPVf3ZOC1Cx7+M0cXf4odNLxDC+n7IN3MDcVCTIOSBfqEcBebSv+vlY5AhM0zw05PDbjKrNmBpzv/AqpjnQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@react-spring/animated': 9.7.3(react@18.2.0) + '@react-spring/shared': 9.7.3(react@18.2.0) + '@react-spring/types': 9.7.3 + react: 18.2.0 + dev: false + + /@react-spring/shared@9.7.3(react@18.2.0): + resolution: {integrity: sha512-NEopD+9S5xYyQ0pGtioacLhL2luflh6HACSSDUZOwLHoxA5eku1UPuqcJqjwSD6luKjjLfiLOspxo43FUHKKSA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@react-spring/types': 9.7.3 + react: 18.2.0 + dev: false + + /@react-spring/types@9.7.3: + resolution: {integrity: sha512-Kpx/fQ/ZFX31OtlqVEFfgaD1ACzul4NksrvIgYfIFq9JpDHFwQkMVZ10tbo0FU/grje4rcL4EIrjekl3kYwgWw==} + dev: false + + /@react-spring/web@9.7.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-7qNc7/5KShu2D05x7o2Ols2nUE7mCKfKLaY2Ix70xPMfTle1sZisoQMBFgV9w/fSLZlHZHV9P0uWJqEXQnbV4Q==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@react-spring/animated': 9.7.3(react@18.2.0) + '@react-spring/core': 9.7.3(react@18.2.0) + '@react-spring/shared': 9.7.3(react@18.2.0) + '@react-spring/types': 9.7.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@react-stately/calendar@3.3.1(react@18.2.0): + resolution: {integrity: sha512-wD5hvdL6Bs8fL2oYkGB/7jGR5Z4ARrrd5uK7T2RwthYguvw95og99A6uUti8ssPGzEkPmJvokds59ov6UmBDdA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@internationalized/date': 3.4.0 + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/calendar': 3.3.1(react@18.2.0) + '@react-types/datepicker': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/checkbox@3.4.4(react@18.2.0): + resolution: {integrity: sha512-TYNod4+4TmS73F+sbKXAMoBH810ZEBdpMfXlNttUCXfVkDXc38W7ucvpQxXPwF+d+ZhGk4DJZsUYqfVPyXXSGg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/toggle': 3.6.1(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/checkbox': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/collections@3.10.0(react@18.2.0): + resolution: {integrity: sha512-PyJEFmt9X0kDMF7D4StGnTdXX1hgyUcTXvvXU2fEw6OyXLtmfWFHmFARRtYbuelGKk6clmJojYmIEds0k8jdww==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/combobox@3.6.0(react@18.2.0): + resolution: {integrity: sha512-TguTMh9hr5GjtT4sKragsiKqer2PXSa2cA/8bPGCox0E9VGNPnYWOYMZ5FXS3FO2OotHxOlbH1LNNKwiE255KQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/list': 3.9.1(react@18.2.0) + '@react-stately/menu': 3.5.4(react@18.2.0) + '@react-stately/select': 3.5.3(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/combobox': 3.7.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/data@3.10.1(react@18.2.0): + resolution: {integrity: sha512-7RBVr5NMGwruZkxuWZtGrZydPlfoZ2VNxzUkc9VXF1gAWbGP7l0t2MoxDgigznUHNS/iYBJ4Y/iYWx3GXtDsrQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/datepicker@3.6.0(react@18.2.0): + resolution: {integrity: sha512-NlaZNknzIXj8zjmwtyMaXIWAyCRIk2g6xQVqHuxZKjx8ZA44IEXiHqhqCmJH3KNjhrP1hvNPsE2Jl+kSbYZj/A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@internationalized/date': 3.4.0 + '@internationalized/string': 3.1.1 + '@react-stately/overlays': 3.6.1(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/datepicker': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/dnd@3.2.3(react@18.2.0): + resolution: {integrity: sha512-gE0bfKr2CY2LIWpVSee/+Xq74gaquQ5WIhMNDPPjRDuWiIvhAd1vCwqfqVKXGZbn3G97Ak/BIpwhvBvVQVD/8g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/selection': 3.13.3(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/flags@3.0.0: + resolution: {integrity: sha512-e3i2ItHbIa0eEwmSXAnPdD7K8syW76JjGe8ENxwFJPW/H1Pu9RJfjkCb/Mq0WSPN/TpxBb54+I9TgrGhbCoZ9w==} + dependencies: + '@swc/helpers': 0.4.36 + dev: false + + /@react-stately/grid@3.8.0(react@18.2.0): + resolution: {integrity: sha512-+3Q6D3W5FTc9/t1Gz35sH0NRiJ2u95aDls9ogBNulC/kQvYaF31NT34QdvpstcfrcCFtF+D49+TkesklZRHJlw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/selection': 3.13.3(react@18.2.0) + '@react-types/grid': 3.2.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/layout@3.13.0(react@18.2.0): + resolution: {integrity: sha512-ktTbD4IP82+4JilJ2iua3qmAeLDhsGUlY8fdYCEvs2BIhr87Hyalk7kMegPoU7bgo9kV9NS4BEf3ZH7DoaxLoQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/table': 3.11.0(react@18.2.0) + '@react-stately/virtualizer': 3.6.1(react@18.2.0) + '@react-types/grid': 3.2.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@react-types/table': 3.8.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/list@3.9.1(react@18.2.0): + resolution: {integrity: sha512-GiKrxGakzMTZKe3mp410l4xKiHbZplJCGrtqlxq/+YRD0uCQwWGYpRG+z9A7tTCusruRD3m91/OjWsbfbGdiEw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/selection': 3.13.3(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/menu@3.5.4(react@18.2.0): + resolution: {integrity: sha512-+Q71fMDhMM1iARPFtwqpXY/8qkb0dN4PBJbcjwjGCumGs+ja2YbZxLBHCP0DYBElS9l6m3ssF47RKNMtF/Oi5w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/overlays': 3.6.1(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/menu': 3.9.3(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/numberfield@3.6.0(react@18.2.0): + resolution: {integrity: sha512-4spLEPuYeYQrzs/r13tv/ti4szkJz+6VfVhFNdYwNiW41flUPDpFtGziIqbe2myoEudC+P5WWzryfHkl79tIbQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@internationalized/number': 3.2.1 + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/numberfield': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/overlays@3.6.1(react@18.2.0): + resolution: {integrity: sha512-c/Mda4ZZmFO4e3XZFd7kqt5wuh6Q/7wYJ+0oG59MfDoQstFwGcJTUnx7S8EUMujbocIOCeOmVPA1eE3DNPC2/A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/overlays': 3.8.1(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/radio@3.8.3(react@18.2.0): + resolution: {integrity: sha512-3ovJ6tDWzl/Qap8065GZS9mQM7LbQwLc7EhhmQ3dn5+pH4pUCHo8Gb0TIcYFsvFMyHrNMg/r8+N3ICq/WDj5NQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/radio': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/searchfield@3.4.4(react@18.2.0): + resolution: {integrity: sha512-GhgisSXbz18MjGrvLpXXBkb8HeYPCxlrAGp+tq1dCMhAkmgZI9ZqQZB8EFzS7EoXQ/gCb87sIT0vhiy257lxSA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/searchfield': 3.4.3(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/select@3.5.3(react@18.2.0): + resolution: {integrity: sha512-bzHcCyp2nka6+Gy/YIDM2eWhk+Dz6KP+l2XnGeM62LhbQ7OWdZW/cEjqhCw0MXZFIC+TDMQcLsX4GRkiRDmL7g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/list': 3.9.1(react@18.2.0) + '@react-stately/menu': 3.5.4(react@18.2.0) + '@react-stately/selection': 3.13.3(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/select': 3.8.2(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/selection@3.13.3(react@18.2.0): + resolution: {integrity: sha512-+CmpZpyIXfbxEwd9eBvo5Jatc2MNX7HinBcW3X8GfvqNzkbgOXETsmXaW6jlKJekvLLE13Is78Ob8NNzZVxQYg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/slider@3.4.1(react@18.2.0): + resolution: {integrity: sha512-mWnOMTRWO2QHSoH2plQe0yDmjqOHAqHkdGKwPI/vTXiqFVLlFhy5RNz8OkB91PBljIzbHh752W+9Cbi6u2K0yA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@react-types/slider': 3.6.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/table@3.11.0(react@18.2.0): + resolution: {integrity: sha512-mHv8KgNHm6scO0gntQc1ZVbQaAqLiNzYi4hxksz2lY+HN2CJbJkYGl/aRt4jmnfpi1xWpwYP5najXdncMAKpGA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/flags': 3.0.0 + '@react-stately/grid': 3.8.0(react@18.2.0) + '@react-stately/selection': 3.13.3(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/grid': 3.2.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@react-types/table': 3.8.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/table@3.9.1(react@18.2.0): + resolution: {integrity: sha512-/YWpV88RH4ElCiwNm/Ys+A5nyWhy+BwEsGTVatbjwZFmHwHxv1FeMrTiYZ9vXR7V7SMCvA8Pd9OJ9NmRkd2klg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/grid': 3.8.0(react@18.2.0) + '@react-stately/selection': 3.13.3(react@18.2.0) + '@react-types/grid': 3.1.8(react@18.2.0) + '@react-types/shared': 3.18.1(react@18.2.0) + '@react-types/table': 3.6.1(react@18.2.0) + '@swc/helpers': 0.4.36 + react: 18.2.0 + dev: false + + /@react-stately/tabs@3.5.1(react@18.2.0): + resolution: {integrity: sha512-p1vZOuIS98GMF9jfEHQA6Pir1wYY6j+Gni6DcluNnWj90rLEubuwARNw7uscoOaXKlK/DiZIhkLKSDsA5tbadQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/list': 3.9.1(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@react-types/tabs': 3.3.1(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/toggle@3.6.1(react@18.2.0): + resolution: {integrity: sha512-UUWtuI6gZlX6wpF9/bxBikjyAW1yQojRPCJ4MPkjMMBQL0iveAm3WEQkXRLNycEiOCeoaVFBwAd1L9h9+fuCFg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/checkbox': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/tooltip@3.4.3(react@18.2.0): + resolution: {integrity: sha512-IX/XlLdwSQWy75TAOARm6hxajRWV0x/C7vGA54O+JNvvfZ212+nxVyTSduM+zjULzhOPICSSUFKmX4ZCV/aHSg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/overlays': 3.6.1(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/tooltip': 3.4.3(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/tree@3.7.1(react@18.2.0): + resolution: {integrity: sha512-D0BWcLTRx7EOTdAJCgYV6zm18xpNDxmv4meKJ/WmYSFq1bkHPN75NLv7VPf5Uvsm66xshbO/B3A4HB2/ag1yPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/selection': 3.13.3(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/utils@3.7.0(react@18.2.0): + resolution: {integrity: sha512-VbApRiUV2rhozOfk0Qj9xt0qjVbQfLTgAzXLdrfeZSBnyIgo1bFRnjDpnDZKZUUCeGQcJJI03I9niaUtY+kwJQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/virtualizer@3.6.1(react@18.2.0): + resolution: {integrity: sha512-Gq5gQ1YPgTakPCkWnmp9P6p5uGoVS+phm6Ie34lmZQ+E62lrkHK0XG0bkOuvMSdWwzql0oLg03E/SMOahI9vNA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-types/breadcrumbs@3.6.1(react@18.2.0): + resolution: {integrity: sha512-O4Jeh2DdYqqbG9tFDkcMEBZ+MId/vouy0gSuRf7Q9HWnT3E68GE1LM8yj2z58XIYOecDeWhlbzvPMfXztouYzg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/link': 3.4.4(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/button@3.7.4(react@18.2.0): + resolution: {integrity: sha512-y1JOnJ3pqg2ezZz/fdwMMToPj+8fgj/He7z1NRWtIy1/I7HP+ilSK6S/MLO2jRsM2QfCq8KSw5MQEZBPiPWsjw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/calendar@3.3.1(react@18.2.0): + resolution: {integrity: sha512-9pn4M8GK6dCMyCN5oilsGYnphe+tSU5zfHucdiVCOyss3HrOBVxLQnr9eZfDxN/nEqz7fCu8QPIIMFFgOi/YCA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@internationalized/date': 3.4.0 + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/checkbox@3.5.0(react@18.2.0): + resolution: {integrity: sha512-fCisTdqFKkz7FvxNoexXIiVsTBt0ZwIyeIZz/S41M6hzIZM38nKbh6yS/lveQ+/877Dn7+ngvbpJ8QYnXYVrIQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/combobox@3.7.0(react@18.2.0): + resolution: {integrity: sha512-w9LSAq/DR1mM8lwHk7cGbIGGm75yg+A2pdnLaViFNEVqv7nBUuhHUBzIihnCQ2k/4piWxa5Ih5gcggDFv2yE4g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/datepicker@3.5.0(react@18.2.0): + resolution: {integrity: sha512-PQSfLR0CgSaD3T70enZQZH/L4s1+KPAJLRxwtyy8toDekKfrkoIjrnUOP91e0rkajeHCSG9T1kL6w8FtaUvbmg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@internationalized/date': 3.4.0 + '@react-types/calendar': 3.3.1(react@18.2.0) + '@react-types/overlays': 3.8.1(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/dialog@3.5.4(react@18.2.0): + resolution: {integrity: sha512-WCEkUf93XauGaPaF1efTJ8u04Z5iUgmmzRbFnGLrske7rQJYfryP3+26zCxtKKlOTgeFORq5AHeH6vqaMKOhhg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/overlays': 3.8.1(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/grid@3.1.8(react@18.2.0): + resolution: {integrity: sha512-NKk4pDbW2QXJOYnDSAYhta81CGwXOc/9tVw2WFs+1wacvxeKmh1Q+n36uAFcIdQOvVRqeGTJaYiqLFmF3fC3tA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.18.1(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/grid@3.2.0(react@18.2.0): + resolution: {integrity: sha512-ZIzFDbuBgqaPNvZ18/fOdm9Ol0m5rFPlhSxQfyAgUOXFaQhl/1+BsG8FsHla/Y6tTmxDt5cVrF5PX2CWzZmtOw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/label@3.7.5(react@18.2.0): + resolution: {integrity: sha512-iNO5T1UYK7FPF23cwRLQJ4zth2rqoJWbz27Wikwt8Cw8VbVVzfLBPUBZoUyeBVZ0/zzTvEgZUW75OrmKb4gqhw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/link@3.4.4(react@18.2.0): + resolution: {integrity: sha512-/FnKf7W6nCNZ2E96Yo1gaX63eSxERmtovQbkRRdsgPLfgRcqzQIVzQtNJThIbVNncOnAw3qvIyhrS0weUTFacQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/listbox@3.4.3(react@18.2.0): + resolution: {integrity: sha512-AHOnx5z+q/uIsBnGqrNJ25OSTbOe2/kWXWUcPDdfZ29OBqoDZu86psAOA97glYod97w/KzU5xq8EaxDrWupKuQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/menu@3.9.3(react@18.2.0): + resolution: {integrity: sha512-0dgIIM9z3hzjFltT+1/L8Hj3oDEcdYkexQhaA+jv6xBHUI5Bqs4SaJAeSGrGz5u6tsrHBPEgf/TLk9Dg9c7XMA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/overlays': 3.8.1(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/meter@3.3.3(react@18.2.0): + resolution: {integrity: sha512-cuNMHAG9SF/QjM0bjukC1ezjWxp0KRInmEQN3kQuQt+eAVC2GLCJjDRfRSLgf5jld8S68xOVw8fEAWY+VK/NHg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/progress': 3.4.2(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/numberfield@3.5.0(react@18.2.0): + resolution: {integrity: sha512-uKN6uJCJICIvngk3d2AzD/XU+LZHSriALpsM58l6Zy7xmVu3Wdb11WeWL9z/cwJ+KAdt4tcD+rCE/Y2rcfjWDA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/overlays@3.8.1(react@18.2.0): + resolution: {integrity: sha512-aDI/K3E2XACkey8SCBmAerLhYSUFa8g8tML4SoQbfEJPRj+jJztbHbg9F7b3HKDUk4ZOjcUdQRfz1nFHORdbtQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/progress@3.4.2(react@18.2.0): + resolution: {integrity: sha512-UvnBt1OtjgQgOM3556KpuAXSdvSIVGSeD4+otTfkl05ieTcy6Lx7ef3TFI2KfQP45a9JeRBstTNpThBmuRe03A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/radio@3.5.0(react@18.2.0): + resolution: {integrity: sha512-jpAG03eYxLvD1+zLoHXVUR7BCXfzbaQnOv5vu2R4EXhBA7t1/HBOAY/WHbUEgrnyDYa2na7dr/RbY81H9JqR0g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/searchfield@3.4.3(react@18.2.0): + resolution: {integrity: sha512-gnOKM2r5GuRspe+8gmKZxuiPYUlzxge9r1SADWgCCrF9091Aq6uEL+oXT4nAIMlRCwxxKXjAa8KlGeqz3dEgxw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + '@react-types/textfield': 3.7.3(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/select@3.8.2(react@18.2.0): + resolution: {integrity: sha512-m11J/xBR8yFwPLuueoFHzr4DiLyY7nKLCbZCz1W2lwIyd8Tl2iJwcLcuJiyUTJwdSTcCDgvbkY4vdTfLOIktYQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/shared@3.18.1(react@18.2.0): + resolution: {integrity: sha512-OpTYRFS607Ctfd6Tmhyk6t6cbFyDhO5K+etU35X50pMzpypo1b7vF0mkngEeTc0Xwl0e749ONZNPZskMyu5k8w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + + /@react-types/shared@3.19.0(react@18.2.0): + resolution: {integrity: sha512-h852l8bWhqUxbXIG8vH3ab7gE19nnP3U1kuWf6SNSMvgmqjiRN9jXKPIFxF/PbfdvnXXm0yZSgSMWfUCARF0Cg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + + /@react-types/slider@3.6.0(react@18.2.0): + resolution: {integrity: sha512-X9h7g1eoYx5+Xts0qCfLd7Qje8NknK3AWq9BZKul2KSZ/5VJeFhIsRjN5MzaUNngO1aYOvSPlPn1oaAWx/ZXHw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/switch@3.4.0(react@18.2.0): + resolution: {integrity: sha512-vUA4Etm7ZiThYN3IotPXl99gHYZNJlc/f9o/SgAUSxtk5pBv5unOSmXLdrvk01Kd6TJ/MjL42IxRShygyr8mTQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/checkbox': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/table@3.6.1(react@18.2.0): + resolution: {integrity: sha512-DeiiBZPZUO2kH40P10Bn9Y4SvDobUlH7Flgx2afL3tJirKMkS1SNDU/B+X9B5Duyd1D0okf1+PLVmi0NBqM4vg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/grid': 3.1.8(react@18.2.0) + '@react-types/shared': 3.18.1(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/table@3.8.0(react@18.2.0): + resolution: {integrity: sha512-/7IBG4ZlJHvEPQwND/q6ZFzfXq0Bc1ohaocDFzEOeNtVUrgQ2rFS64EY2p8G7BL9XDJFTY2R5dLYqjyGFojUvQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/grid': 3.2.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/tabs@3.3.1(react@18.2.0): + resolution: {integrity: sha512-vPxSbLCU7RT+Rupvu/1uOAesxlR/53GD5ZbgLuQRr/oEZRbsjY8Cs3CE3LGv49VdvBWivXUvHiF5wSE7CdWs1w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/textfield@3.7.3(react@18.2.0): + resolution: {integrity: sha512-M2u9NK3iqQEmTp4G1Dk36pCleyH/w1n+N52u5n0fRlxvucY/Od8W1zvk3w9uqJLFHSlzleHsfSvkaETDJn7FYw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/tooltip@3.4.3(react@18.2.0): + resolution: {integrity: sha512-ne1SVhgofHRZNhoQM4iMCSjCstpdPBpM81B4KDJ7XmWax0+dP4qmdxMc7qvEm7GjuZLfYx5f44fWytKm1BkZmg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/overlays': 3.8.1(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@reduxjs/toolkit@1.9.5(react-redux@8.1.1)(react@18.2.0): + resolution: {integrity: sha512-Rt97jHmfTeaxL4swLRNPD/zV4OxTes4la07Xc4hetpUW/vc75t5m1ANyxG6ymnEQ2FsLQsoMlYB2vV1sO3m8tQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18 + react-redux: ^7.2.1 || ^8.0.2 + peerDependenciesMeta: + react: + optional: true + react-redux: + optional: true + dependencies: + immer: 9.0.21 + react: 18.2.0 + react-redux: 8.1.1(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0)(redux@4.2.1) + redux: 4.2.1 + redux-thunk: 2.4.2(redux@4.2.1) + reselect: 4.1.8 + dev: false + + /@remix-run/router@1.7.0: + resolution: {integrity: sha512-Eu1V3kz3mV0wUpVTiFHuaT8UD1gj/0VnoFHQYX35xlslQUpe8CuYoKFn9d4WZFHm3yDywz6ALZuGdnUPKrNeAw==} + engines: {node: '>=14'} + dev: false + + /@rollup/pluginutils@5.0.3: + resolution: {integrity: sha512-hfllNN4a80rwNQ9QCxhxuHCGHMAvabXqxNdaChUSSadMre7t4iEUI6fFAhBOn/eIYTgYVhBv7vCLsAJ4u3lf3g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.1 + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: true + + /@safe-global/safe-apps-provider@0.17.1(typescript@5.1.3): + resolution: {integrity: sha512-lYfRqrbbK1aKU1/UGkYWc/X7PgySYcumXKc5FB2uuwAs2Ghj8uETuW5BrwPqyjBknRxutFbTv+gth/JzjxAhdQ==} + dependencies: + '@safe-global/safe-apps-sdk': 8.0.0(typescript@5.1.3) + events: 3.3.0 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + - zod + dev: false + + /@safe-global/safe-apps-sdk@8.0.0(typescript@5.1.3): + resolution: {integrity: sha512-gYw0ki/EAuV1oSyMxpqandHjnthZjYYy+YWpTAzf8BqfXM3ItcZLpjxfg+3+mXW8HIO+3jw6T9iiqEXsqHaMMw==} + dependencies: + '@safe-global/safe-gateway-typescript-sdk': 3.9.0 + viem: 1.1.6(typescript@5.1.3) + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + - zod + dev: false + + /@safe-global/safe-apps-sdk@8.1.0(typescript@5.1.3): + resolution: {integrity: sha512-XJbEPuaVc7b9n23MqlF6c+ToYIS3f7P2Sel8f3cSBQ9WORE4xrSuvhMpK9fDSFqJ7by/brc+rmJR/5HViRr0/w==} + dependencies: + '@safe-global/safe-gateway-typescript-sdk': 3.9.0 + viem: 1.1.6(typescript@5.1.3) + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + - zod + dev: false + + /@safe-global/safe-gateway-typescript-sdk@3.9.0: + resolution: {integrity: sha512-DxRM/sBBQhv955dPtdo0z2Bf2fXxrzoRUnGyTa3+4Z0RAhcyiqnffRP1Bt3tyuvlyfZnFL0RsvkqDcAIKzq3RQ==} + dependencies: + cross-fetch: 3.1.8 + transitivePeerDependencies: + - encoding + dev: false + + /@scure/base@1.1.1: + resolution: {integrity: sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==} + dev: false + + /@scure/bip32@1.3.0: + resolution: {integrity: sha512-bcKpo1oj54hGholplGLpqPHRbIsnbixFtc06nwuNM5/dwSXOq/AAYoIBRsBmnZJSdfeNW5rnff7NTAz3ZCqR9Q==} + dependencies: + '@noble/curves': 1.0.0 + '@noble/hashes': 1.3.1 + '@scure/base': 1.1.1 + dev: false + + /@scure/bip32@1.3.1: + resolution: {integrity: sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==} + dependencies: + '@noble/curves': 1.1.0 + '@noble/hashes': 1.3.1 + '@scure/base': 1.1.1 + dev: false + + /@scure/bip39@1.2.0: + resolution: {integrity: sha512-SX/uKq52cuxm4YFXWFaVByaSHJh2w3BnokVSeUJVCv6K7WulT9u2BuNRBhuFl8vAuYnzx9bEu9WgpcNYTrYieg==} + dependencies: + '@noble/hashes': 1.3.1 + '@scure/base': 1.1.1 + dev: false + + /@scure/bip39@1.2.1: + resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} + dependencies: + '@noble/hashes': 1.3.1 + '@scure/base': 1.1.1 + dev: false + + /@sindresorhus/is@5.6.0: + resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} + engines: {node: '>=14.16'} + dev: false + + /@solana/buffer-layout@4.0.1: + resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} + engines: {node: '>=5.10'} + dependencies: + buffer: 6.0.3 + dev: false + + /@solana/web3.js@1.78.4: + resolution: {integrity: sha512-up5VG1dK+GPhykmuMIozJZBbVqpm77vbOG6/r5dS7NBGZonwHfTLdBbsYc3rjmaQ4DpCXUa3tUc4RZHRORvZrw==} + dependencies: + '@babel/runtime': 7.22.10 + '@noble/curves': 1.1.0 + '@noble/hashes': 1.3.1 + '@solana/buffer-layout': 4.0.1 + agentkeepalive: 4.5.0 + bigint-buffer: 1.1.5 + bn.js: 5.2.1 + borsh: 0.7.0 + bs58: 4.0.1 + buffer: 6.0.3 + fast-stable-stringify: 1.0.0 + jayson: 4.1.0 + node-fetch: 2.6.12 + rpc-websockets: 7.6.0 + superstruct: 0.14.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + + /@stablelib/aead@1.0.1: + resolution: {integrity: sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg==} + dev: false + + /@stablelib/binary@1.0.1: + resolution: {integrity: sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==} + dependencies: + '@stablelib/int': 1.0.1 + dev: false + + /@stablelib/bytes@1.0.1: + resolution: {integrity: sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ==} + dev: false + + /@stablelib/chacha20poly1305@1.0.1: + resolution: {integrity: sha512-MmViqnqHd1ymwjOQfghRKw2R/jMIGT3wySN7cthjXCBdO+qErNPUBnRzqNpnvIwg7JBCg3LdeCZZO4de/yEhVA==} + dependencies: + '@stablelib/aead': 1.0.1 + '@stablelib/binary': 1.0.1 + '@stablelib/chacha': 1.0.1 + '@stablelib/constant-time': 1.0.1 + '@stablelib/poly1305': 1.0.1 + '@stablelib/wipe': 1.0.1 + dev: false + + /@stablelib/chacha@1.0.1: + resolution: {integrity: sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg==} + dependencies: + '@stablelib/binary': 1.0.1 + '@stablelib/wipe': 1.0.1 + dev: false + + /@stablelib/constant-time@1.0.1: + resolution: {integrity: sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg==} + dev: false + + /@stablelib/ed25519@1.0.3: + resolution: {integrity: sha512-puIMWaX9QlRsbhxfDc5i+mNPMY+0TmQEskunY1rZEBPi1acBCVQAhnsk/1Hk50DGPtVsZtAWQg4NHGlVaO9Hqg==} + dependencies: + '@stablelib/random': 1.0.2 + '@stablelib/sha512': 1.0.1 + '@stablelib/wipe': 1.0.1 + dev: false + + /@stablelib/hash@1.0.1: + resolution: {integrity: sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg==} + dev: false + + /@stablelib/hkdf@1.0.1: + resolution: {integrity: sha512-SBEHYE16ZXlHuaW5RcGk533YlBj4grMeg5TooN80W3NpcHRtLZLLXvKyX0qcRFxf+BGDobJLnwkvgEwHIDBR6g==} + dependencies: + '@stablelib/hash': 1.0.1 + '@stablelib/hmac': 1.0.1 + '@stablelib/wipe': 1.0.1 + dev: false + + /@stablelib/hmac@1.0.1: + resolution: {integrity: sha512-V2APD9NSnhVpV/QMYgCVMIYKiYG6LSqw1S65wxVoirhU/51ACio6D4yDVSwMzuTJXWZoVHbDdINioBwKy5kVmA==} + dependencies: + '@stablelib/constant-time': 1.0.1 + '@stablelib/hash': 1.0.1 + '@stablelib/wipe': 1.0.1 + dev: false + + /@stablelib/int@1.0.1: + resolution: {integrity: sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==} + dev: false + + /@stablelib/keyagreement@1.0.1: + resolution: {integrity: sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg==} + dependencies: + '@stablelib/bytes': 1.0.1 + dev: false + + /@stablelib/poly1305@1.0.1: + resolution: {integrity: sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA==} + dependencies: + '@stablelib/constant-time': 1.0.1 + '@stablelib/wipe': 1.0.1 + dev: false + + /@stablelib/random@1.0.2: + resolution: {integrity: sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==} + dependencies: + '@stablelib/binary': 1.0.1 + '@stablelib/wipe': 1.0.1 + dev: false + + /@stablelib/sha256@1.0.1: + resolution: {integrity: sha512-GIIH3e6KH+91FqGV42Kcj71Uefd/QEe7Dy42sBTeqppXV95ggCcxLTk39bEr+lZfJmp+ghsR07J++ORkRELsBQ==} + dependencies: + '@stablelib/binary': 1.0.1 + '@stablelib/hash': 1.0.1 + '@stablelib/wipe': 1.0.1 + dev: false + + /@stablelib/sha512@1.0.1: + resolution: {integrity: sha512-13gl/iawHV9zvDKciLo1fQ8Bgn2Pvf7OV6amaRVKiq3pjQ3UmEpXxWiAfV8tYjUpeZroBxtyrwtdooQT/i3hzw==} + dependencies: + '@stablelib/binary': 1.0.1 + '@stablelib/hash': 1.0.1 + '@stablelib/wipe': 1.0.1 + dev: false + + /@stablelib/wipe@1.0.1: + resolution: {integrity: sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==} + dev: false + + /@stablelib/x25519@1.0.3: + resolution: {integrity: sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==} + dependencies: + '@stablelib/keyagreement': 1.0.1 + '@stablelib/random': 1.0.2 + '@stablelib/wipe': 1.0.1 + dev: false + + /@svgr/babel-plugin-add-jsx-attribute@7.0.0(@babel/core@7.22.5): + resolution: {integrity: sha512-khWbXesWIP9v8HuKCl2NU2HNAyqpSQ/vkIl36Nbn4HIwEYSRWL0H7Gs6idJdha2DkpFDWlsqMELvoCE8lfFY6Q==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + dev: true + + /@svgr/babel-plugin-remove-jsx-attribute@7.0.0(@babel/core@7.22.5): + resolution: {integrity: sha512-iiZaIvb3H/c7d3TH2HBeK91uI2rMhZNwnsIrvd7ZwGLkFw6mmunOCoVnjdYua662MqGFxlN9xTq4fv9hgR4VXQ==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + dev: true + + /@svgr/babel-plugin-remove-jsx-empty-expression@7.0.0(@babel/core@7.22.5): + resolution: {integrity: sha512-sQQmyo+qegBx8DfFc04PFmIO1FP1MHI1/QEpzcIcclo5OAISsOJPW76ZIs0bDyO/DBSJEa/tDa1W26pVtt0FRw==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + dev: true + + /@svgr/babel-plugin-replace-jsx-attribute-value@7.0.0(@babel/core@7.22.5): + resolution: {integrity: sha512-i6MaAqIZXDOJeikJuzocByBf8zO+meLwfQ/qMHIjCcvpnfvWf82PFvredEZElErB5glQFJa2KVKk8N2xV6tRRA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + dev: true + + /@svgr/babel-plugin-svg-dynamic-title@7.0.0(@babel/core@7.22.5): + resolution: {integrity: sha512-BoVSh6ge3SLLpKC0pmmN9DFlqgFy4NxNgdZNLPNJWBUU7TQpDWeBuyVuDW88iXydb5Cv0ReC+ffa5h3VrKfk1w==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + dev: true + + /@svgr/babel-plugin-svg-em-dimensions@7.0.0(@babel/core@7.22.5): + resolution: {integrity: sha512-tNDcBa+hYn0gO+GkP/AuNKdVtMufVhU9fdzu+vUQsR18RIJ9RWe7h/pSBY338RO08wArntwbDk5WhQBmhf2PaA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + dev: true + + /@svgr/babel-plugin-transform-react-native-svg@7.0.0(@babel/core@7.22.5): + resolution: {integrity: sha512-qw54u8ljCJYL2KtBOjI5z7Nzg8LnSvQOP5hPKj77H4VQL4+HdKbAT5pnkkZLmHKYwzsIHSYKXxHouD8zZamCFQ==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + dev: true + + /@svgr/babel-plugin-transform-svg-component@7.0.0(@babel/core@7.22.5): + resolution: {integrity: sha512-CcFECkDj98daOg9jE3Bh3uyD9kzevCAnZ+UtzG6+BQG/jOQ2OA3jHnX6iG4G1MCJkUQFnUvEv33NvQfqrb/F3A==} + engines: {node: '>=12'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + dev: true + + /@svgr/babel-preset@7.0.0(@babel/core@7.22.5): + resolution: {integrity: sha512-EX/NHeFa30j5UjldQGVQikuuQNHUdGmbh9kEpBKofGUtF0GUPJ4T4rhoYiqDAOmBOxojyot36JIFiDUHUK1ilQ==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@svgr/babel-plugin-add-jsx-attribute': 7.0.0(@babel/core@7.22.5) + '@svgr/babel-plugin-remove-jsx-attribute': 7.0.0(@babel/core@7.22.5) + '@svgr/babel-plugin-remove-jsx-empty-expression': 7.0.0(@babel/core@7.22.5) + '@svgr/babel-plugin-replace-jsx-attribute-value': 7.0.0(@babel/core@7.22.5) + '@svgr/babel-plugin-svg-dynamic-title': 7.0.0(@babel/core@7.22.5) + '@svgr/babel-plugin-svg-em-dimensions': 7.0.0(@babel/core@7.22.5) + '@svgr/babel-plugin-transform-react-native-svg': 7.0.0(@babel/core@7.22.5) + '@svgr/babel-plugin-transform-svg-component': 7.0.0(@babel/core@7.22.5) + dev: true + + /@svgr/core@7.0.0: + resolution: {integrity: sha512-ztAoxkaKhRVloa3XydohgQQCb0/8x9T63yXovpmHzKMkHO6pkjdsIAWKOS4bE95P/2quVh1NtjSKlMRNzSBffw==} + engines: {node: '>=14'} + dependencies: + '@babel/core': 7.22.5 + '@svgr/babel-preset': 7.0.0(@babel/core@7.22.5) + camelcase: 6.3.0 + cosmiconfig: 8.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@svgr/hast-util-to-babel-ast@7.0.0: + resolution: {integrity: sha512-42Ej9sDDEmsJKjrfQ1PHmiDiHagh/u9AHO9QWbeNx4KmD9yS5d1XHmXUNINfUcykAU+4431Cn+k6Vn5mWBYimQ==} + engines: {node: '>=14'} + dependencies: + '@babel/types': 7.22.10 + entities: 4.5.0 + dev: true + + /@svgr/plugin-jsx@7.0.0: + resolution: {integrity: sha512-SWlTpPQmBUtLKxXWgpv8syzqIU8XgFRvyhfkam2So8b3BE0OS0HPe5UfmlJ2KIC+a7dpuuYovPR2WAQuSyMoPw==} + engines: {node: '>=14'} + dependencies: + '@babel/core': 7.22.5 + '@svgr/babel-preset': 7.0.0(@babel/core@7.22.5) + '@svgr/hast-util-to-babel-ast': 7.0.0 + svg-parser: 2.0.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@swc/core-darwin-arm64@1.3.77: + resolution: {integrity: sha512-l4KGQAGB4Ih1Al2tWoUBrtVJCF/xZRjH3jCMCRD52KZDRAnRVDq42JKek7+aHjjH8juzTISaqzsI8Ipv6zvKhA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@swc/core-darwin-x64@1.3.77: + resolution: {integrity: sha512-eFCkZg/BzObOn5IWn7t/Ywz+jlZKff/1XBymT7Arh/UkO39Agh+rYdBqjbylp4JQMl0qGRBfxD3wPgDRoViNVQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm-gnueabihf@1.3.77: + resolution: {integrity: sha512-+1BueyGcCQAtxSORJml0CU8aKQNssQ5E3ABMFJwCbcec+lUCiGYK1fBfqj4FmWQMbXuQ+mn1SMeXSZAtaXoQ3w==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm64-gnu@1.3.77: + resolution: {integrity: sha512-3smbzVcuuCiWWPFeUIp1c0aAXd+fGsc8x8rUcYvoJAWBgLJ45JymOI5WSUjIybl3rk0prdkbFylZuR0t1Rue3A==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm64-musl@1.3.77: + resolution: {integrity: sha512-e81+i4ef5vDeu9AkMY2AamPcmtPVPUqeqq3aNWM1tcHCaUej1DwY4xhRxrd1OvEoYyVBLtiMb5nenF3V9OzXIQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-x64-gnu@1.3.77: + resolution: {integrity: sha512-gl3+9VESckZ/GYCmGClGgXqB2tAA2MivEV/51Wde+2alo2lPSSujEhxE6Q3TNYkXOLAHSupYyDZ0ou9RfXufOw==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-x64-musl@1.3.77: + resolution: {integrity: sha512-AqQLZAMYTaNrA4i/Nv/GhXdildDZyRv6xsK8u2actevv5PPjD/69yYB3Z4uaptwh/4ys4W/Y2vnt+OPCNH4OQg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-arm64-msvc@1.3.77: + resolution: {integrity: sha512-Wdw++6w7WyavxZ3WruElCrRJ6EO0iHS0Mts4qHnbKgD08GJqIMTZPtZ5qhRe9zCf6sj2rQqhAMf/HKhYrHoF+w==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-ia32-msvc@1.3.77: + resolution: {integrity: sha512-ObNVpdtLdXDpmVKuMZh87yBYL4ti64WX95o2j5Oq3r0e0RqwIGqGvPDxvJVEiyCnaXHfl8eSNKWuiOxPHPkMNQ==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-x64-msvc@1.3.77: + resolution: {integrity: sha512-Ew6jg/qr0v/2ixeJXvIUBuAPMKTz8HRoDBO/nHkvlnDFmkhsyH7h5YwJS1rLBwAEhWuJaVYjYi7cibZTI/QRYQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core@1.3.77: + resolution: {integrity: sha512-CiLD2NGTdhE8JnWFHeRAglaCAcvwOxvpeWNtCIT261GrxTKCXHPAn4eqIWiBzXnwWDmZ6XdyrCL4/GmPESNnrg==} + engines: {node: '>=10'} + requiresBuild: true + peerDependencies: + '@swc/helpers': ^0.5.0 + peerDependenciesMeta: + '@swc/helpers': + optional: true + optionalDependencies: + '@swc/core-darwin-arm64': 1.3.77 + '@swc/core-darwin-x64': 1.3.77 + '@swc/core-linux-arm-gnueabihf': 1.3.77 + '@swc/core-linux-arm64-gnu': 1.3.77 + '@swc/core-linux-arm64-musl': 1.3.77 + '@swc/core-linux-x64-gnu': 1.3.77 + '@swc/core-linux-x64-musl': 1.3.77 + '@swc/core-win32-arm64-msvc': 1.3.77 + '@swc/core-win32-ia32-msvc': 1.3.77 + '@swc/core-win32-x64-msvc': 1.3.77 + dev: true + + /@swc/helpers@0.4.14: + resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==} + dependencies: + tslib: 2.6.1 + dev: false + + /@swc/helpers@0.4.36: + resolution: {integrity: sha512-5lxnyLEYFskErRPenYItLRSge5DjrJngYKdVjRSrWfza9G6KkgHEXi0vUZiyUeMU5JfXH1YnvXZzSp8ul88o2Q==} + dependencies: + legacy-swc-helpers: /@swc/helpers@0.4.14 + tslib: 2.6.1 + dev: false + + /@swc/helpers@0.5.1: + resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} + dependencies: + tslib: 2.6.1 + dev: false + + /@szmarczak/http-timer@5.0.1: + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + dependencies: + defer-to-connect: 2.0.1 + dev: false + + /@tanstack/match-sorter-utils@8.8.4: + resolution: {integrity: sha512-rKH8LjZiszWEvmi01NR72QWZ8m4xmXre0OOwlRGnjU01Eqz/QnN+cqpty2PJ0efHblq09+KilvyR7lsbzmXVEw==} + engines: {node: '>=12'} + dependencies: + remove-accents: 0.4.2 + dev: false + + /@tanstack/query-core@4.32.6: + resolution: {integrity: sha512-YVB+mVWENQwPyv+40qO7flMgKZ0uI41Ph7qXC2Zf1ft5AIGfnXnMZyifB2ghhZ27u+5wm5mlzO4Y6lwwadzxCA==} + dev: false + + /@tanstack/query-persist-client-core@4.32.6: + resolution: {integrity: sha512-MJJ7CldvT5HOel50h/3wOZZwVlIcroFD5Vxn8vPsfo2C0qQ208ilmN/81JWutm/lWy4n2BjnCrrWv6HvVI7S0w==} + dependencies: + '@tanstack/query-core': 4.32.6 + dev: false + + /@tanstack/query-sync-storage-persister@4.32.6: + resolution: {integrity: sha512-hTwNo5O5EvydbfdVvwnwY0nIrNg1BxKEV4WAA8A+0NP9yc/9xoWy8RxbIkcz1p4JN2JhagaTKek8Fa5h5KitsA==} + dependencies: + '@tanstack/query-persist-client-core': 4.32.6 + dev: false + + /@tanstack/react-query-devtools@4.32.6(@tanstack/react-query@4.32.6)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Gd9pBkm2sbeze9P5Yp8R7y0rZVUdoIOhduomDjz138WdJuVbRS4Y8p6gX2uMJFsUFVe7jA6fX/D6NfQ9o5OS/A==} + peerDependencies: + '@tanstack/react-query': ^4.32.6 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@tanstack/match-sorter-utils': 8.8.4 + '@tanstack/react-query': 4.32.6(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + superjson: 1.13.1 + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false + + /@tanstack/react-query-persist-client@4.32.6(@tanstack/react-query@4.32.6): + resolution: {integrity: sha512-EmNnYpvFYpxS4j5WFeNmfVVBxqq4RDnEFDBZwNKRfb4pzukcx/hcWtwqFk7Qj0EI4Dk8QGl239MEYwJbAc83tQ==} + peerDependencies: + '@tanstack/react-query': ^4.32.6 + dependencies: + '@tanstack/query-persist-client-core': 4.32.6 + '@tanstack/react-query': 4.32.6(react-dom@18.2.0)(react@18.2.0) + dev: false + + /@tanstack/react-query@4.32.6(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-AITu/IKJJJXsHHeXNBy5bclu12t08usMCY0vFC2dh9SP/w6JAk5U9GwfjOIPj3p+ATADZvxQPe8UiCtMLNeQbg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + dependencies: + '@tanstack/query-core': 4.32.6 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false + + /@types/acorn@4.0.6: + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + dependencies: + '@types/estree': 1.0.1 + dev: true + + /@types/chai-subset@1.3.3: + resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + dependencies: + '@types/chai': 4.3.5 + dev: true + + /@types/chai@4.3.5: + resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} + dev: true + + /@types/color-convert@2.0.0: + resolution: {integrity: sha512-m7GG7IKKGuJUXvkZ1qqG3ChccdIM/qBBo913z+Xft0nKCX4hAU/IxKwZBU4cpRZ7GS5kV4vOblUkILtSShCPXQ==} + dependencies: + '@types/color-name': 1.1.1 + dev: true + + /@types/color-name@1.1.1: + resolution: {integrity: sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==} + dev: true + + /@types/color@3.0.3: + resolution: {integrity: sha512-X//qzJ3d3Zj82J9sC/C18ZY5f43utPbAJ6PhYt/M7uG6etcF6MRpKdN880KBy43B0BMzSfeT96MzrsNjFI3GbA==} + dependencies: + '@types/color-convert': 2.0.0 + dev: true + + /@types/connect@3.4.35: + resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} + dependencies: + '@types/node': 20.3.1 + dev: false + + /@types/crypto-js@4.1.1: + resolution: {integrity: sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==} + dev: true + + /@types/d3-color@3.1.0: + resolution: {integrity: sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==} + dev: false + + /@types/d3-interpolate@3.0.1: + resolution: {integrity: sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==} + dependencies: + '@types/d3-color': 3.1.0 + dev: false + + /@types/d3-path@1.0.9: + resolution: {integrity: sha512-NaIeSIBiFgSC6IGUBjZWcscUJEq7vpVu7KthHN8eieTV9d9MqkSOZLH4chq1PmcKy06PNe3axLeKmRIyxJ+PZQ==} + dev: false + + /@types/d3-scale@4.0.3: + resolution: {integrity: sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==} + dependencies: + '@types/d3-time': 2.1.1 + dev: false + + /@types/d3-shape@1.3.8: + resolution: {integrity: sha512-gqfnMz6Fd5H6GOLYixOZP/xlrMtJms9BaS+6oWxTKHNqPGZ93BkWWupQSCYm6YHqx6h9wjRupuJb90bun6ZaYg==} + dependencies: + '@types/d3-path': 1.0.9 + dev: false + + /@types/d3-time@2.1.1: + resolution: {integrity: sha512-9MVYlmIgmRR31C5b4FVSWtuMmBHh2mOWQYfl7XAYOa8dsnb7iEmUmRSWSFgXFtkjxO65d7hTUHQC+RhR/9IWFg==} + dev: false + + /@types/d3-voronoi@1.1.9: + resolution: {integrity: sha512-DExNQkaHd1F3dFPvGA/Aw2NGyjMln6E9QzsiqOcBgnE+VInYnFBHBBySbZQts6z6xD+5jTfKCP7M4OqMyVjdwQ==} + dev: false + + /@types/debug@4.1.8: + resolution: {integrity: sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==} + dependencies: + '@types/ms': 0.7.31 + + /@types/eslint-scope@3.7.4: + resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} + dependencies: + '@types/eslint': 8.44.2 + '@types/estree': 1.0.1 + dev: true + + /@types/eslint@8.44.2: + resolution: {integrity: sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==} + dependencies: + '@types/estree': 1.0.1 + '@types/json-schema': 7.0.12 + dev: true + + /@types/estree-jsx@1.0.0: + resolution: {integrity: sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==} + dependencies: + '@types/estree': 1.0.1 + dev: true + + /@types/estree@1.0.1: + resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} + dev: true + + /@types/hast@2.3.5: + resolution: {integrity: sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg==} + dependencies: + '@types/unist': 2.0.7 + dev: true + + /@types/hoist-non-react-statics@3.3.1: + resolution: {integrity: sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==} + dependencies: + '@types/react': 18.2.14 + hoist-non-react-statics: 3.3.2 + dev: false + + /@types/http-cache-semantics@4.0.1: + resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} + dev: false + + /@types/json-schema@7.0.12: + resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} + dev: true + + /@types/json5@0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: true + + /@types/lodash@4.14.195: + resolution: {integrity: sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==} + dev: false + + /@types/long@4.0.2: + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + + /@types/luxon@3.3.0: + resolution: {integrity: sha512-uKRI5QORDnrGFYgcdAVnHvEIvEZ8noTpP/Bg+HeUzZghwinDlIS87DEenV5r1YoOF9G4x600YsUXLWZ19rmTmg==} + dev: true + + /@types/mdast@3.0.12: + resolution: {integrity: sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==} + dependencies: + '@types/unist': 2.0.7 + dev: true + + /@types/mdx@2.0.6: + resolution: {integrity: sha512-sVcwEG10aFU2KcM7cIA0M410UPv/DesOPyG8zMVk0QUDexHA3lYmGucpEpZ2dtWWhi2ip3CG+5g/iH0PwoW4Fw==} + dev: true + + /@types/minimatch@3.0.5: + resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} + dev: true + + /@types/minimist@1.2.2: + resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} + + /@types/ms@0.7.31: + resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} + + /@types/node@10.12.18: + resolution: {integrity: sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==} + dev: false + + /@types/node@12.20.55: + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + dev: false + + /@types/node@18.15.13: + resolution: {integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==} + dev: false + + /@types/node@20.3.1: + resolution: {integrity: sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==} + + /@types/normalize-package-data@2.4.1: + resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + + /@types/parse5@6.0.3: + resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} + dev: true + + /@types/prop-types@15.7.5: + resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + + /@types/react-dom@18.2.6: + resolution: {integrity: sha512-2et4PDvg6PVCyS7fuTc4gPoksV58bW0RwSxWKcPRcHZf0PRUGq03TKcD/rUHe3azfV6/5/biUBJw+HhCQjaP0A==} + dependencies: + '@types/react': 18.2.14 + + /@types/react@18.2.14: + resolution: {integrity: sha512-A0zjq+QN/O0Kpe30hA1GidzyFjatVvrpIvWLxD+xv67Vt91TWWgco9IvrJBkeyHm1trGaFS/FSGqPlhyeZRm0g==} + dependencies: + '@types/prop-types': 15.7.5 + '@types/scheduler': 0.16.3 + csstype: 3.1.2 + + /@types/retry@0.12.0: + resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + dev: true + + /@types/scheduler@0.16.3: + resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} + + /@types/semver@7.5.0: + resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} + dev: true + + /@types/styled-components@5.1.26: + resolution: {integrity: sha512-KuKJ9Z6xb93uJiIyxo/+ksS7yLjS1KzG6iv5i78dhVg/X3u5t1H7juRWqVmodIdz6wGVaIApo1u01kmFRdJHVw==} + dependencies: + '@types/hoist-non-react-statics': 3.3.1 + '@types/react': 18.2.14 + csstype: 3.1.2 + dev: false + + /@types/trusted-types@2.0.3: + resolution: {integrity: sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==} + dev: false + + /@types/unist@2.0.7: + resolution: {integrity: sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==} + dev: true + + /@types/use-sync-external-store@0.0.3: + resolution: {integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==} + dev: false + + /@types/ws@7.4.7: + resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} + dependencies: + '@types/node': 20.3.1 + dev: false + + /@typescript-eslint/eslint-plugin@5.60.0(@typescript-eslint/parser@5.60.0)(eslint@8.43.0)(typescript@5.1.3): + resolution: {integrity: sha512-78B+anHLF1TI8Jn/cD0Q00TBYdMgjdOn980JfAVa9yw5sop8nyTfVOQAv6LWywkOGLclDBtv5z3oxN4w7jxyNg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.6.2 + '@typescript-eslint/parser': 5.60.0(eslint@8.43.0)(typescript@5.1.3) + '@typescript-eslint/scope-manager': 5.60.0 + '@typescript-eslint/type-utils': 5.60.0(eslint@8.43.0)(typescript@5.1.3) + '@typescript-eslint/utils': 5.60.0(eslint@8.43.0)(typescript@5.1.3) + debug: 4.3.4(supports-color@5.5.0) + eslint: 8.43.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 + natural-compare-lite: 1.4.0 + semver: 7.5.4 + tsutils: 3.21.0(typescript@5.1.3) + typescript: 5.1.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@5.60.0(eslint@8.43.0)(typescript@5.1.3): + resolution: {integrity: sha512-jBONcBsDJ9UoTWrARkRRCgDz6wUggmH5RpQVlt7BimSwaTkTjwypGzKORXbR4/2Hqjk9hgwlon2rVQAjWNpkyQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.60.0 + '@typescript-eslint/types': 5.60.0 + '@typescript-eslint/typescript-estree': 5.60.0(typescript@5.1.3) + debug: 4.3.4(supports-color@5.5.0) + eslint: 8.43.0 + typescript: 5.1.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@5.60.0: + resolution: {integrity: sha512-hakuzcxPwXi2ihf9WQu1BbRj1e/Pd8ZZwVTG9kfbxAMZstKz8/9OoexIwnmLzShtsdap5U/CoQGRCWlSuPbYxQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.60.0 + '@typescript-eslint/visitor-keys': 5.60.0 + dev: true + + /@typescript-eslint/type-utils@5.60.0(eslint@8.43.0)(typescript@5.1.3): + resolution: {integrity: sha512-X7NsRQddORMYRFH7FWo6sA9Y/zbJ8s1x1RIAtnlj6YprbToTiQnM6vxcMu7iYhdunmoC0rUWlca13D5DVHkK2g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.60.0(typescript@5.1.3) + '@typescript-eslint/utils': 5.60.0(eslint@8.43.0)(typescript@5.1.3) + debug: 4.3.4(supports-color@5.5.0) + eslint: 8.43.0 + tsutils: 3.21.0(typescript@5.1.3) + typescript: 5.1.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@5.60.0: + resolution: {integrity: sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/typescript-estree@5.60.0(typescript@5.1.3): + resolution: {integrity: sha512-R43thAuwarC99SnvrBmh26tc7F6sPa2B3evkXp/8q954kYL6Ro56AwASYWtEEi+4j09GbiNAHqYwNNZuNlARGQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.60.0 + '@typescript-eslint/visitor-keys': 5.60.0 + debug: 4.3.4(supports-color@5.5.0) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + tsutils: 3.21.0(typescript@5.1.3) + typescript: 5.1.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@5.60.0(eslint@8.43.0)(typescript@5.1.3): + resolution: {integrity: sha512-ba51uMqDtfLQ5+xHtwlO84vkdjrqNzOnqrnwbMHMRY8Tqeme8C2Q8Fc7LajfGR+e3/4LoYiWXUM6BpIIbHJ4hQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.43.0) + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.0 + '@typescript-eslint/scope-manager': 5.60.0 + '@typescript-eslint/types': 5.60.0 + '@typescript-eslint/typescript-estree': 5.60.0(typescript@5.1.3) + eslint: 8.43.0 + eslint-scope: 5.1.1 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@5.60.0: + resolution: {integrity: sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.60.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@visx/annotation@3.0.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-otf2AZDlt/XCpOBG0gkPowXVerLJW5yXPFis94Km0bj629htyKOsY5GeJKlBeB89ddxdi4zWHkaFxGFJ79Pqog==} + peerDependencies: + react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 + dependencies: + '@types/react': 18.2.14 + '@visx/drag': 3.0.1(react@18.2.0) + '@visx/group': 3.0.0(react@18.2.0) + '@visx/text': 3.0.0(react@18.2.0) + classnames: 2.3.2 + prop-types: 15.8.1 + react: 18.2.0 + react-use-measure: 2.1.1(react-dom@18.2.0)(react@18.2.0) + transitivePeerDependencies: + - react-dom + dev: false + + /@visx/axis@3.1.0(react@18.2.0): + resolution: {integrity: sha512-JDj/1VYx0JO0pHFtwoFtYcnqdoZFh/dpHImEl169S5nTslSFlIoNTXA/ekpBP6ELkEZ59gmF1X5k29x6MFBwCA==} + peerDependencies: + react: ^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0 + dependencies: + '@types/react': 18.2.14 + '@visx/group': 3.0.0(react@18.2.0) + '@visx/point': 3.0.1 + '@visx/scale': 3.0.0 + '@visx/shape': 3.0.0(react@18.2.0) + '@visx/text': 3.0.0(react@18.2.0) + classnames: 2.3.2 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@visx/bounds@3.0.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-YQaSSER9erxlhppzRms6cvYdKqcIwk6eksrGdbJkBoHobhPo1JCIUXlmrA4qgrEnXInPJpueGE+PE5F+Dk12DA==} + peerDependencies: + react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 + react-dom: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 + dependencies: + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@visx/clip-path@3.0.0(react@18.2.0): + resolution: {integrity: sha512-Kvoi2qDVNrB4PoSaOUhw7SKEVSXrSyz8oZggoIb5OoA6feeG7CQQEbNQyOS2wW2zmOuxnwkg3EB7sOBxC6c7WA==} + peerDependencies: + react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 + dependencies: + '@types/react': 18.2.14 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@visx/curve@3.0.0: + resolution: {integrity: sha512-kvHJDLBeczTQ87ZExSTfRxej06l6o6UiQ0NHf9+xpAin06y6Qk1ThOHHWJTGM6KGzwlu7jEauJGHwZs6nMhDvA==} + dependencies: + '@types/d3-shape': 1.3.8 + d3-shape: 1.3.7 + dev: false + + /@visx/drag@3.0.1(react@18.2.0): + resolution: {integrity: sha512-yi2AB/unUfNYBRKS4pmUOuz8MjaAAYjsQGYcD/s4LqeQjd+lBZF7CuNcYZ/maGNQAEUfgLr2czIzADanOMtMaw==} + peerDependencies: + react: ^16.8.0-0 || ^17.0.0-0 || ^18.0.0-0 + dependencies: + '@types/react': 18.2.14 + '@visx/event': 3.0.1 + '@visx/point': 3.0.1 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@visx/event@3.0.1: + resolution: {integrity: sha512-tK1EUYQLLStBuoCMbm8LJ3VbDyCVI8HjT0pMRQxm+C75FSIVWvrThgrfrC9sWOFnEMEYWspZO7hI5zjsPKjLQA==} + dependencies: + '@types/react': 18.2.14 + '@visx/point': 3.0.1 + dev: false + + /@visx/glyph@3.0.0(react@18.2.0): + resolution: {integrity: sha512-r1B0IocfWfhTABKjam0qqsWKjxLxZfGwefnwn8IcfELSd9iAUtLbI/46nP4roQRHhB/Wl3RBbgA97fZw8f1MxA==} + peerDependencies: + react: ^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0 + dependencies: + '@types/d3-shape': 1.3.8 + '@types/react': 18.2.14 + '@visx/group': 3.0.0(react@18.2.0) + classnames: 2.3.2 + d3-shape: 1.3.7 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@visx/gradient@3.0.0(react@18.2.0): + resolution: {integrity: sha512-UoM9R9PIPLO/w7hCW9gFncrLdpKNqh13sLS9/0Iy6b75uP2l05FLG2HX4kXljeyOrj4/XyzRCMYm0HHk/p5iMA==} + peerDependencies: + react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 + dependencies: + '@types/react': 18.2.14 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@visx/grid@3.0.1(react@18.2.0): + resolution: {integrity: sha512-cln5CVvFG58C5Uz1Uf0KRBFmGmgD1NALOQdYDu5yPsTuY2yLzVYPvCIlYBMdUtE0uzfNq972SmkZHfZYs03jxQ==} + peerDependencies: + react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 + dependencies: + '@types/react': 18.2.14 + '@visx/curve': 3.0.0 + '@visx/group': 3.0.0(react@18.2.0) + '@visx/point': 3.0.1 + '@visx/scale': 3.0.0 + '@visx/shape': 3.0.0(react@18.2.0) + classnames: 2.3.2 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@visx/group@3.0.0(react@18.2.0): + resolution: {integrity: sha512-SFjXhTMcsaVAb1/TVL1KM5vn8gQTIVgSx0ATdDl4BJSFp2ym1lO8LY4jpV4SFweaHnWxVwrrfGLTn5QsYnvmjQ==} + peerDependencies: + react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 + dependencies: + '@types/react': 18.2.14 + classnames: 2.3.2 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@visx/point@3.0.1: + resolution: {integrity: sha512-S5WOBMgEP2xHcgs3A2BFB2vwzrk0tMmn3PGZAbQJ+lu4HlnalDP72klUnxLTH8xclNNvpUHtHM5eLIJXyHx6Pw==} + dev: false + + /@visx/react-spring@3.1.0(@react-spring/web@9.7.2)(react@18.2.0): + resolution: {integrity: sha512-8GHfXvJwnscGgf5UVCMeKw8Genq+cllcQJ8T6aAe1uC2ttYa2InmRIPsJEoA7VDLcxNIJgvw1bRd22QrgT9LtA==} + peerDependencies: + '@react-spring/web': ^9.4.5 + react: ^16.3.0-0 || ^17.0.0 || ^18.0.0 + dependencies: + '@react-spring/web': 9.7.2(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.14 + '@visx/axis': 3.1.0(react@18.2.0) + '@visx/grid': 3.0.1(react@18.2.0) + '@visx/scale': 3.0.0 + '@visx/text': 3.0.0(react@18.2.0) + classnames: 2.3.2 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@visx/responsive@3.0.0(react@18.2.0): + resolution: {integrity: sha512-immnxQwOWlrxbnlCIqJWuDpPfrM6tglgMTN1WsyXyGluLMJqhuuxqxllfXaRPkQFS4fcvs66KCEELdazh96U2w==} + peerDependencies: + react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 + dependencies: + '@types/lodash': 4.14.195 + '@types/react': 18.2.14 + lodash: 4.17.21 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@visx/scale@3.0.0: + resolution: {integrity: sha512-WSf+wrxZEvu5TPGfGTafzzX1MbogbIxfD9ZKM9p7xfw65v23G0dNMy4bqVBUbOJigONoQkIZyqQ+gz5AJ/ioIg==} + dependencies: + '@types/d3-interpolate': 3.0.1 + '@types/d3-scale': 4.0.3 + '@types/d3-time': 2.1.1 + d3-interpolate: 3.0.1 + d3-scale: 4.0.2 + d3-time: 2.1.1 + dev: false + + /@visx/shape@3.0.0(react@18.2.0): + resolution: {integrity: sha512-t6lpP9bIA1vwChDwiOUWl92ro29XF/M8IVNWRA0pm4LGxGGTACvxG3Agfcdi3JprahUVqPpnRCwuR36PDanq3Q==} + peerDependencies: + react: ^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0 + dependencies: + '@types/d3-path': 1.0.9 + '@types/d3-shape': 1.3.8 + '@types/lodash': 4.14.195 + '@types/react': 18.2.14 + '@visx/curve': 3.0.0 + '@visx/group': 3.0.0(react@18.2.0) + '@visx/scale': 3.0.0 + classnames: 2.3.2 + d3-path: 1.0.9 + d3-shape: 1.3.7 + lodash: 4.17.21 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@visx/text@3.0.0(react@18.2.0): + resolution: {integrity: sha512-LW6v5T/gpd9RGw83/ScXncYc6IlcfzXTpaN8WbbxLRI65gdvSqrykwAMR0cbpQmzoVFuZXljqOf0QslHGnBg1w==} + peerDependencies: + react: ^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0 + dependencies: + '@types/lodash': 4.14.195 + '@types/react': 18.2.14 + classnames: 2.3.2 + lodash: 4.17.21 + prop-types: 15.8.1 + react: 18.2.0 + reduce-css-calc: 1.3.0 + dev: false + + /@visx/threshold@3.0.0(react@18.2.0): + resolution: {integrity: sha512-fEvn0kTjV9+GVOan+a9zodNjCuJggGiQtujcYEGb0ozjpKGI5peMye19JBAAChFukQ5smiW3L5a3mLJW3wUvoQ==} + peerDependencies: + react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 + dependencies: + '@types/react': 18.2.14 + '@visx/clip-path': 3.0.0(react@18.2.0) + '@visx/shape': 3.0.0(react@18.2.0) + classnames: 2.3.2 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@visx/tooltip@3.1.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-p46qztGRNkEDbxzc3V1virahvz3UQ29TzddUjA0oaTIBCrOd9UJuLvv1Tq9OpeUYPdbrO/ZRwaEeri2pbwv04Q==} + peerDependencies: + react: ^16.8.0-0 || ^17.0.0-0 || ^18.0.0-0 + react-dom: ^16.8.0-0 || ^17.0.0-0 || ^18.0.0-0 + dependencies: + '@types/react': 18.2.14 + '@visx/bounds': 3.0.0(react-dom@18.2.0)(react@18.2.0) + classnames: 2.3.2 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-use-measure: 2.1.1(react-dom@18.2.0)(react@18.2.0) + dev: false + + /@visx/voronoi@3.0.0(react@18.2.0): + resolution: {integrity: sha512-ySX7+Ic+irfgZQMij/0RJnryETonuKDWA3Upw3V6YtIiodPOEQ5w8FW8TvEbhaBlAUfSwQtHJ5ECvv3ZDrJa2A==} + peerDependencies: + react: ^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0 + dependencies: + '@types/d3-voronoi': 1.1.9 + '@types/react': 18.2.14 + classnames: 2.3.2 + d3-voronoi: 1.1.4 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@visx/xychart@3.1.2(@react-spring/web@9.7.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-ra8BAPzchVgvVDEJSBKYd5Hi2xXZ+m8gnQxJlrDBUg/LnCMRXebQWIjjhDBfumOjXT255IELB/vPrUfeMZD9jA==} + peerDependencies: + '@react-spring/web': ^9.4.5 + react: ^16.8.0 || ^17.0.0 || ^ 18.0.0 + dependencies: + '@react-spring/web': 9.7.2(react-dom@18.2.0)(react@18.2.0) + '@types/lodash': 4.14.195 + '@types/react': 18.2.14 + '@visx/annotation': 3.0.1(react-dom@18.2.0)(react@18.2.0) + '@visx/axis': 3.1.0(react@18.2.0) + '@visx/event': 3.0.1 + '@visx/glyph': 3.0.0(react@18.2.0) + '@visx/grid': 3.0.1(react@18.2.0) + '@visx/react-spring': 3.1.0(@react-spring/web@9.7.2)(react@18.2.0) + '@visx/responsive': 3.0.0(react@18.2.0) + '@visx/scale': 3.0.0 + '@visx/shape': 3.0.0(react@18.2.0) + '@visx/text': 3.0.0(react@18.2.0) + '@visx/tooltip': 3.1.2(react-dom@18.2.0)(react@18.2.0) + '@visx/voronoi': 3.0.0(react@18.2.0) + classnames: 2.3.2 + d3-array: 2.12.1 + d3-interpolate-path: 2.2.1 + d3-shape: 2.1.0 + lodash: 4.17.21 + mitt: 2.1.0 + prop-types: 15.8.1 + react: 18.2.0 + transitivePeerDependencies: + - react-dom + dev: false + + /@vitejs/plugin-react-swc@3.1.0(vite@4.3.9): + resolution: {integrity: sha512-xnDULNrkEbtTtRNnMPp+RsuIuIbk1JJV0xY7irchYyv9JJS4uvmc1EYip+qyrnkcX7TQ9c8vCS3AmkQqADI0Fw==} + peerDependencies: + vite: ^4 + dependencies: + '@swc/core': 1.3.77 + vite: 4.3.9(@types/node@20.3.1) + transitivePeerDependencies: + - '@swc/helpers' + dev: true + + /@vitejs/plugin-react@3.1.0(vite@4.3.9): + resolution: {integrity: sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.1.0-beta.0 + dependencies: + '@babel/core': 7.22.5 + '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.22.5) + magic-string: 0.27.0 + react-refresh: 0.14.0 + vite: 4.3.9(@types/node@20.3.1) + transitivePeerDependencies: + - supports-color + dev: true + + /@vitejs/plugin-react@4.0.1(vite@4.3.9): + resolution: {integrity: sha512-g25lL98essfeSj43HJ0o4DMp0325XK0ITkxpgChzJU/CyemgyChtlxfnRbjfwxDGCTRxTiXtQAsdebQXKMRSOA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 + dependencies: + '@babel/core': 7.22.5 + '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.22.5) + react-refresh: 0.14.0 + vite: 4.3.9(@types/node@20.3.1) + transitivePeerDependencies: + - supports-color + dev: true + + /@vitest/expect@0.32.2: + resolution: {integrity: sha512-6q5yzweLnyEv5Zz1fqK5u5E83LU+gOMVBDuxBl2d2Jfx1BAp5M+rZgc5mlyqdnxquyoiOXpXmFNkcGcfFnFH3Q==} + dependencies: + '@vitest/spy': 0.32.2 + '@vitest/utils': 0.32.2 + chai: 4.3.7 + dev: true + + /@vitest/runner@0.32.2: + resolution: {integrity: sha512-06vEL0C1pomOEktGoLjzZw+1Fb+7RBRhmw/06WkDrd1akkT9i12su0ku+R/0QM69dfkIL/rAIDTG+CSuQVDcKw==} + dependencies: + '@vitest/utils': 0.32.2 + concordance: 5.0.4 + p-limit: 4.0.0 + pathe: 1.1.1 + dev: true + + /@vitest/snapshot@0.32.2: + resolution: {integrity: sha512-JwhpeH/PPc7GJX38vEfCy9LtRzf9F4er7i4OsAJyV7sjPwjj+AIR8cUgpMTWK4S3TiamzopcTyLsZDMuldoi5A==} + dependencies: + magic-string: 0.30.2 + pathe: 1.1.1 + pretty-format: 27.5.1 + dev: true + + /@vitest/spy@0.32.2: + resolution: {integrity: sha512-Q/ZNILJ4ca/VzQbRM8ur3Si5Sardsh1HofatG9wsJY1RfEaw0XKP8IVax2lI1qnrk9YPuG9LA2LkZ0EI/3d4ug==} + dependencies: + tinyspy: 2.1.1 + dev: true + + /@vitest/utils@0.32.2: + resolution: {integrity: sha512-lnJ0T5i03j0IJaeW73hxe2AuVnZ/y1BhhCOuIcl9LIzXnbpXJT9Lrt6brwKHXLOiA7MZ6N5hSJjt0xE1dGNCzQ==} + dependencies: + diff-sequences: 29.4.3 + loupe: 2.3.6 + pretty-format: 27.5.1 + dev: true + + /@wagmi/chains@1.2.0(typescript@5.1.3): + resolution: {integrity: sha512-dmDRipsE54JfyudOBkuhEexqQWcrZqxn/qiujG8SBzMh/az/AH5xlJSA+j1CPWTx9+QofSMF3B7A4gb6XRmSaQ==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.1.3 + dev: false + + /@wagmi/chains@1.4.0(typescript@5.1.3): + resolution: {integrity: sha512-9HwJrhcZ1TxyrCbE10y7s1eSiSiyfGam7AHIOLYExaOX+vpOZ+MNTt4orFEDbEpz1fxwJDPPI38lanAUix1OSA==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.1.3 + dev: false + + /@wagmi/connectors@2.6.5(@wagmi/chains@1.4.0)(react@18.2.0)(typescript@5.1.3)(viem@1.1.6): + resolution: {integrity: sha512-klF31togMDd0qQqEcLl5cCGxjMbL0RRXQ8I1vxmEa3KdGzw6Z3ICVzX7/bDfnNEZcOW7BKyAnZDq7rCt5jTOiw==} + peerDependencies: + '@wagmi/chains': '>=1.3.0' + typescript: '>=5.0.4' + viem: '>=0.3.35' + peerDependenciesMeta: + '@wagmi/chains': + optional: true + typescript: + optional: true + dependencies: + '@coinbase/wallet-sdk': 3.7.1 + '@ledgerhq/connect-kit-loader': 1.1.2 + '@safe-global/safe-apps-provider': 0.17.1(typescript@5.1.3) + '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.1.3) + '@wagmi/chains': 1.4.0(typescript@5.1.3) + '@walletconnect/ethereum-provider': 2.8.6(@walletconnect/modal@2.5.9) + '@walletconnect/legacy-provider': 2.0.0 + '@walletconnect/modal': 2.5.9(react@18.2.0) + '@walletconnect/utils': 2.8.6 + abitype: 0.8.7(typescript@5.1.3) + eventemitter3: 4.0.7 + typescript: 5.1.3 + viem: 1.1.6(typescript@5.1.3) + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - bufferutil + - encoding + - lokijs + - react + - supports-color + - utf-8-validate + - zod + dev: false + + /@wagmi/core@1.3.6(@types/react@18.2.14)(react@18.2.0)(typescript@5.1.3)(viem@1.1.6): + resolution: {integrity: sha512-TXv9ZlRR5aySfERFuWMuo+lKXC/CoqtxVJZVHPqhK1jY+nldMx3AvrWzzF4CccRaMYcVdvPFepvmxzq2A2VvWg==} + peerDependencies: + typescript: '>=5.0.4' + viem: '>=0.3.35' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@wagmi/chains': 1.4.0(typescript@5.1.3) + '@wagmi/connectors': 2.6.5(@wagmi/chains@1.4.0)(react@18.2.0)(typescript@5.1.3)(viem@1.1.6) + abitype: 0.8.7(typescript@5.1.3) + eventemitter3: 4.0.7 + typescript: 5.1.3 + viem: 1.1.6(typescript@5.1.3) + zustand: 4.4.1(@types/react@18.2.14)(react@18.2.0) + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - '@types/react' + - bufferutil + - encoding + - immer + - lokijs + - react + - supports-color + - utf-8-validate + - zod + dev: false + + /@walletconnect/core@2.10.0: + resolution: {integrity: sha512-Z8pdorfIMueuiBXLdnf7yloiO9JIiobuxN3j0OTal+MYc4q5/2O7d+jdD1DAXbLi1taJx3x60UXT/FPVkjIqIQ==} + dependencies: + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.13 + '@walletconnect/keyvaluestorage': 1.0.2 + '@walletconnect/logger': 2.0.1 + '@walletconnect/relay-api': 1.0.9 + '@walletconnect/relay-auth': 1.0.4 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.10.0 + '@walletconnect/utils': 2.10.0 + events: 3.3.0 + lodash.isequal: 4.5.0 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - bufferutil + - lokijs + - utf-8-validate + dev: false + + /@walletconnect/core@2.8.6: + resolution: {integrity: sha512-rnSqm1KJLcww/v6+UH8JeibQkJ3EKgyUDPfEK0stSEkrIUIcXaFlq3Et8S+vgV8bPhI0MVUhAhFL5OJZ3t2ryg==} + dependencies: + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.13 + '@walletconnect/keyvaluestorage': 1.0.2 + '@walletconnect/logger': 2.0.1 + '@walletconnect/relay-api': 1.0.9 + '@walletconnect/relay-auth': 1.0.4 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.8.6 + '@walletconnect/utils': 2.8.6 + events: 3.3.0 + lodash.isequal: 4.5.0 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - bufferutil + - lokijs + - utf-8-validate + dev: false + + /@walletconnect/crypto@1.0.3: + resolution: {integrity: sha512-+2jdORD7XQs76I2Odgr3wwrtyuLUXD/kprNVsjWRhhhdO9Mt6WqVzOPu0/t7OHSmgal8k7SoBQzUc5hu/8zL/g==} + dependencies: + '@walletconnect/encoding': 1.0.2 + '@walletconnect/environment': 1.0.1 + '@walletconnect/randombytes': 1.0.3 + aes-js: 3.1.2 + hash.js: 1.1.7 + tslib: 1.14.1 + dev: false + + /@walletconnect/encoding@1.0.2: + resolution: {integrity: sha512-CrwSBrjqJ7rpGQcTL3kU+Ief+Bcuu9PH6JLOb+wM6NITX1GTxR/MfNwnQfhLKK6xpRAyj2/nM04OOH6wS8Imag==} + dependencies: + is-typedarray: 1.0.0 + tslib: 1.14.1 + typedarray-to-buffer: 3.1.5 + dev: false + + /@walletconnect/environment@1.0.1: + resolution: {integrity: sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==} + dependencies: + tslib: 1.14.1 + dev: false + + /@walletconnect/ethereum-provider@2.8.6(@walletconnect/modal@2.5.9): + resolution: {integrity: sha512-wUvJEsXTLmMihrOhQxAs1k9hrWEOT03QBn54P9r9GpJbJ1zEfIjQaXFfi8uup6gldhH+vN38PsbOiLyv/6d3qQ==} + peerDependencies: + '@walletconnect/modal': '>=2' + peerDependenciesMeta: + '@walletconnect/modal': + optional: true + dependencies: + '@walletconnect/jsonrpc-http-connection': 1.0.7 + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/modal': 2.5.9(react@18.2.0) + '@walletconnect/sign-client': 2.8.6 + '@walletconnect/types': 2.8.6 + '@walletconnect/universal-provider': 2.8.6 + '@walletconnect/utils': 2.8.6 + events: 3.3.0 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - bufferutil + - encoding + - lokijs + - utf-8-validate + dev: false + + /@walletconnect/events@1.0.1: + resolution: {integrity: sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==} + dependencies: + keyvaluestorage-interface: 1.0.0 + tslib: 1.14.1 + dev: false + + /@walletconnect/heartbeat@1.2.1: + resolution: {integrity: sha512-yVzws616xsDLJxuG/28FqtZ5rzrTA4gUjdEMTbWB5Y8V1XHRmqq4efAxCw5ie7WjbXFSUyBHaWlMR+2/CpQC5Q==} + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/time': 1.0.2 + tslib: 1.14.1 + dev: false + + /@walletconnect/jsonrpc-http-connection@1.0.7: + resolution: {integrity: sha512-qlfh8fCfu8LOM9JRR9KE0s0wxP6ZG9/Jom8M0qsoIQeKF3Ni0FyV4V1qy/cc7nfI46SLQLSl4tgWSfLiE1swyQ==} + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + cross-fetch: 3.1.8 + tslib: 1.14.1 + transitivePeerDependencies: + - encoding + dev: false + + /@walletconnect/jsonrpc-provider@1.0.13: + resolution: {integrity: sha512-K73EpThqHnSR26gOyNEL+acEex3P7VWZe6KE12ZwKzAt2H4e5gldZHbjsu2QR9cLeJ8AXuO7kEMOIcRv1QEc7g==} + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + tslib: 1.14.1 + dev: false + + /@walletconnect/jsonrpc-types@1.0.3: + resolution: {integrity: sha512-iIQ8hboBl3o5ufmJ8cuduGad0CQm3ZlsHtujv9Eu16xq89q+BG7Nh5VLxxUgmtpnrePgFkTwXirCTkwJH1v+Yw==} + dependencies: + keyvaluestorage-interface: 1.0.0 + tslib: 1.14.1 + dev: false + + /@walletconnect/jsonrpc-utils@1.0.8: + resolution: {integrity: sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw==} + dependencies: + '@walletconnect/environment': 1.0.1 + '@walletconnect/jsonrpc-types': 1.0.3 + tslib: 1.14.1 + dev: false + + /@walletconnect/jsonrpc-ws-connection@1.0.13: + resolution: {integrity: sha512-mfOM7uFH4lGtQxG+XklYuFBj6dwVvseTt5/ahOkkmpcAEgz2umuzu7fTR+h5EmjQBdrmYyEBOWADbeaFNxdySg==} + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + tslib: 1.14.1 + ws: 7.5.9 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@walletconnect/keyvaluestorage@1.0.2: + resolution: {integrity: sha512-U/nNG+VLWoPFdwwKx0oliT4ziKQCEoQ27L5Hhw8YOFGA2Po9A9pULUYNWhDgHkrb0gYDNt//X7wABcEWWBd3FQ==} + peerDependencies: + '@react-native-async-storage/async-storage': 1.x + lokijs: 1.x + peerDependenciesMeta: + '@react-native-async-storage/async-storage': + optional: true + lokijs: + optional: true + dependencies: + safe-json-utils: 1.1.1 + tslib: 1.14.1 + dev: false + + /@walletconnect/legacy-client@2.0.0: + resolution: {integrity: sha512-v5L7rYk9loVnfvUf0mF+76bUPFaU5/Vh7mzL6/950CD/yoGdzYZ3Kj+L7mkC6HPMEGeQsBP1+sqBuiVGZ/aODA==} + dependencies: + '@walletconnect/crypto': 1.0.3 + '@walletconnect/encoding': 1.0.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/legacy-types': 2.0.0 + '@walletconnect/legacy-utils': 2.0.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + detect-browser: 5.3.0 + query-string: 6.14.1 + dev: false + + /@walletconnect/legacy-modal@2.0.0: + resolution: {integrity: sha512-jckNd8lMhm4X7dX9TDdxM3bXKJnaqkRs6K2Mo5j6GmbIF9Eyx40jZ5+q457RVxvM6ciZEDT5s1wBHWdWoOo+9Q==} + dependencies: + '@walletconnect/legacy-types': 2.0.0 + '@walletconnect/legacy-utils': 2.0.0 + copy-to-clipboard: 3.3.3 + preact: 10.17.0 + qrcode: 1.5.3 + dev: false + + /@walletconnect/legacy-provider@2.0.0: + resolution: {integrity: sha512-A8xPebMI1A+50HbWwTpFCbwP7G+1NGKdTKyg8BUUg3h3Y9JucpC1W6w/x0v1Xw7qFEqQnz74LoIN/A3ytH9xrQ==} + dependencies: + '@walletconnect/jsonrpc-http-connection': 1.0.7 + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/legacy-client': 2.0.0 + '@walletconnect/legacy-modal': 2.0.0 + '@walletconnect/legacy-types': 2.0.0 + '@walletconnect/legacy-utils': 2.0.0 + transitivePeerDependencies: + - encoding + dev: false + + /@walletconnect/legacy-types@2.0.0: + resolution: {integrity: sha512-sOVrA7HUdbI1OwKyPOQU0/DdvTSVFlsXWpAk2K2WvP2erTkBWPMTJq6cv2BmKdoJ3p6gLApT7sd+jHi3OF71uw==} + dependencies: + '@walletconnect/jsonrpc-types': 1.0.3 + dev: false + + /@walletconnect/legacy-utils@2.0.0: + resolution: {integrity: sha512-CPWxSVVXw0kgNCxvU126g4GiV3mzXmC8IPJ15twE46aJ1FX+RHEIfAzFMFz2F2+fEhBxL63A7dwNQKDXorRPcQ==} + dependencies: + '@walletconnect/encoding': 1.0.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/legacy-types': 2.0.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + detect-browser: 5.3.0 + query-string: 6.14.1 + dev: false + + /@walletconnect/logger@2.0.1: + resolution: {integrity: sha512-SsTKdsgWm+oDTBeNE/zHxxr5eJfZmE9/5yp/Ku+zJtcTAjELb3DXueWkDXmE9h8uHIbJzIb5wj5lPdzyrjT6hQ==} + dependencies: + pino: 7.11.0 + tslib: 1.14.1 + dev: false + + /@walletconnect/modal-core@2.5.9(react@18.2.0): + resolution: {integrity: sha512-isIebwF9hOknGouhS/Ob4YJ9Sa/tqNYG2v6Ua9EkCqIoLimepkG5eC53tslUWW29SLSfQ9qqBNG2+iE7yQXqgw==} + dependencies: + buffer: 6.0.3 + valtio: 1.10.6(react@18.2.0) + transitivePeerDependencies: + - react + dev: false + + /@walletconnect/modal-ui@2.5.9(react@18.2.0): + resolution: {integrity: sha512-nfBaAT9Ls7RZTBBgAq+Nt/3AoUcinIJ9bcq5UHXTV3lOPu/qCKmUC/0HY3GvUK8ykabUAsjr0OAGmcqkB91qug==} + dependencies: + '@walletconnect/modal-core': 2.5.9(react@18.2.0) + lit: 2.7.5 + motion: 10.16.2 + qrcode: 1.5.3 + transitivePeerDependencies: + - react + dev: false + + /@walletconnect/modal@2.5.9(react@18.2.0): + resolution: {integrity: sha512-Zs2RvPwbBNRdBhb50FuJCxi3FJltt1KSpI7odjU/x9GTpTOcSOkmR66PBCy2JvNA0+ztnS1Xs0LVEr3lu7/Jzw==} + dependencies: + '@walletconnect/modal-core': 2.5.9(react@18.2.0) + '@walletconnect/modal-ui': 2.5.9(react@18.2.0) + transitivePeerDependencies: + - react + dev: false + + /@walletconnect/randombytes@1.0.3: + resolution: {integrity: sha512-35lpzxcHFbTN3ABefC9W+uBpNZl1GC4Wpx0ed30gibfO/y9oLdy1NznbV96HARQKSBV9J9M/rrtIvf6a23jfYw==} + dependencies: + '@walletconnect/encoding': 1.0.2 + '@walletconnect/environment': 1.0.1 + randombytes: 2.1.0 + tslib: 1.14.1 + dev: false + + /@walletconnect/relay-api@1.0.9: + resolution: {integrity: sha512-Q3+rylJOqRkO1D9Su0DPE3mmznbAalYapJ9qmzDgK28mYF9alcP3UwG/og5V7l7CFOqzCLi7B8BvcBUrpDj0Rg==} + dependencies: + '@walletconnect/jsonrpc-types': 1.0.3 + tslib: 1.14.1 + dev: false + + /@walletconnect/relay-auth@1.0.4: + resolution: {integrity: sha512-kKJcS6+WxYq5kshpPaxGHdwf5y98ZwbfuS4EE/NkQzqrDFm5Cj+dP8LofzWvjrrLkZq7Afy7WrQMXdLy8Sx7HQ==} + dependencies: + '@stablelib/ed25519': 1.0.3 + '@stablelib/random': 1.0.2 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + tslib: 1.14.1 + uint8arrays: 3.1.1 + dev: false + + /@walletconnect/safe-json@1.0.2: + resolution: {integrity: sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==} + dependencies: + tslib: 1.14.1 + dev: false + + /@walletconnect/sign-client@2.10.0: + resolution: {integrity: sha512-hbDljDS53kR/It3oXD91UkcOsT6diNnW5+Zzksm0YEfwww5dop/YfNlcdnc8+jKUhWOL/YDPNQCjzsCSNlVzbw==} + dependencies: + '@walletconnect/core': 2.10.0 + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.0.1 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.10.0 + '@walletconnect/utils': 2.10.0 + events: 3.3.0 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - bufferutil + - lokijs + - utf-8-validate + dev: false + + /@walletconnect/sign-client@2.8.6: + resolution: {integrity: sha512-rOFTKTHP7oJfXgYHX7+SdB8VbcsEE3ZFG/bMdmZboWaBim1mrY3vUyDdKrNr0VgI3AwBiEQezQDfKxBX0pMSQQ==} + dependencies: + '@walletconnect/core': 2.8.6 + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.0.1 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.8.6 + '@walletconnect/utils': 2.8.6 + events: 3.3.0 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - bufferutil + - lokijs + - utf-8-validate + dev: false + + /@walletconnect/time@1.0.2: + resolution: {integrity: sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==} + dependencies: + tslib: 1.14.1 + dev: false + + /@walletconnect/types@2.10.0: + resolution: {integrity: sha512-kSTA/WZnbKdEbvbXSW16Ty6dOSzOZCHnGg6JH7q1MuraalD2HuNg00lVVu7QAZ/Rj1Gn9DAkrgP5Wd5a8Xq//Q==} + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/keyvaluestorage': 1.0.2 + '@walletconnect/logger': 2.0.1 + events: 3.3.0 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - lokijs + dev: false + + /@walletconnect/types@2.8.6: + resolution: {integrity: sha512-Z/PFa3W1XdxeTcCtdR6lUsFgZfU/69wWJBPyclPwn7cu1+eriuCr6XZXQpJjib3flU+HnwHiXeUuqZaheehPxw==} + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.1 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/keyvaluestorage': 1.0.2 + '@walletconnect/logger': 2.0.1 + events: 3.3.0 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - lokijs + dev: false + + /@walletconnect/universal-provider@2.8.6: + resolution: {integrity: sha512-ln1RVv8+oHu9enOJ/oVkjiarneB+4vJCk16znOklIN2JtDHwB8iObDHlQH3UE6ynNTw1iRvaGuPR4g+YdIfB6w==} + dependencies: + '@walletconnect/jsonrpc-http-connection': 1.0.7 + '@walletconnect/jsonrpc-provider': 1.0.13 + '@walletconnect/jsonrpc-types': 1.0.3 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.0.1 + '@walletconnect/sign-client': 2.8.6 + '@walletconnect/types': 2.8.6 + '@walletconnect/utils': 2.8.6 + events: 3.3.0 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - bufferutil + - encoding + - lokijs + - utf-8-validate + dev: false + + /@walletconnect/utils@2.10.0: + resolution: {integrity: sha512-9GRyEz/7CJW+G04RvrjPET5k7hOEsB9b3fF9cWDk/iDCxSWpbkU/hv/urRB36C+gvQMAZgIZYX3dHfzJWkY/2g==} + dependencies: + '@stablelib/chacha20poly1305': 1.0.1 + '@stablelib/hkdf': 1.0.1 + '@stablelib/random': 1.0.2 + '@stablelib/sha256': 1.0.1 + '@stablelib/x25519': 1.0.3 + '@walletconnect/relay-api': 1.0.9 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.10.0 + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - lokijs + dev: false + + /@walletconnect/utils@2.8.6: + resolution: {integrity: sha512-wcy6e5+COYo7tfNnW8YqidnATdJDIW6vDiWWE7A1F78Sl/VflkaevB9cIgyn8eLdxC1SxXgGoeC2oLP90nnHJg==} + dependencies: + '@stablelib/chacha20poly1305': 1.0.1 + '@stablelib/hkdf': 1.0.1 + '@stablelib/random': 1.0.2 + '@stablelib/sha256': 1.0.1 + '@stablelib/x25519': 1.0.3 + '@walletconnect/relay-api': 1.0.9 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.8.6 + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - lokijs + dev: false + + /@walletconnect/window-getters@1.0.1: + resolution: {integrity: sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==} + dependencies: + tslib: 1.14.1 + dev: false + + /@walletconnect/window-metadata@1.0.1: + resolution: {integrity: sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==} + dependencies: + '@walletconnect/window-getters': 1.0.1 + tslib: 1.14.1 + dev: false + + /@web-std/blob@3.0.4: + resolution: {integrity: sha512-+dibyiw+uHYK4dX5cJ7HA+gtDAaUUe6JsOryp2ZpAC7h4ICsh49E34JwHoEKPlPvP0llCrNzz45vvD+xX5QDBg==} + dependencies: + '@web-std/stream': 1.0.0 + web-encoding: 1.1.5 + dev: true + + /@web-std/fetch@3.0.3: + resolution: {integrity: sha512-PtaKr6qvw2AmKChugzhQWuTa12dpbogHRBxwcleAZ35UhWucnfD4N+g3f7qYK2OeioSWTK3yMf6n/kOOfqxHaQ==} + engines: {node: ^10.17 || >=12.3} + dependencies: + '@web-std/blob': 3.0.4 + '@web-std/form-data': 3.0.2 + '@web3-storage/multipart-parser': 1.0.0 + data-uri-to-buffer: 3.0.1 + dev: true + + /@web-std/fetch@4.1.2: + resolution: {integrity: sha512-NUX+nnCTjC6URLtFC2O9dX9FtzCS5nlbF/vZwkPlheq5h6+rQxluH/aO+ORbLjGY4z4iQOulfEGoHcXwx5GFUQ==} + engines: {node: ^10.17 || >=12.3} + dependencies: + '@web-std/blob': 3.0.4 + '@web-std/form-data': 3.0.2 + '@web-std/stream': 1.0.1 + '@web3-storage/multipart-parser': 1.0.0 + data-uri-to-buffer: 3.0.1 + mrmime: 1.0.1 + dev: true + + /@web-std/file@3.0.2: + resolution: {integrity: sha512-pIH0uuZsmY8YFvSHP1NsBIiMT/1ce0suPrX74fEeO3Wbr1+rW0fUGEe4d0R99iLwXtyCwyserqCFI4BJkJlkRA==} + dependencies: + '@web-std/blob': 3.0.4 + dev: true + + /@web-std/form-data@3.0.2: + resolution: {integrity: sha512-rhc8IRw66sJ0FHcnC84kT3mTN6eACTuNftkt1XSl1Ef6WRKq4Pz65xixxqZymAZl1K3USpwhLci4SKNn4PYxWQ==} + dependencies: + web-encoding: 1.1.5 + dev: true + + /@web-std/stream@1.0.0: + resolution: {integrity: sha512-jyIbdVl+0ZJyKGTV0Ohb9E6UnxP+t7ZzX4Do3AHjZKxUXKMs9EmqnBDQgHF7bEw0EzbQygOjtt/7gvtmi//iCQ==} + dependencies: + web-streams-polyfill: 3.2.1 + dev: true + + /@web-std/stream@1.0.1: + resolution: {integrity: sha512-tsz4Y0WNDgFA5jwLSeV7/UV5rfMIlj0cPsSLVfTihjaVW0OJPd5NxJ3le1B3yLyqqzRpeG5OAfJAADLc4VoGTA==} + dependencies: + web-streams-polyfill: 3.2.1 + dev: true + + /@web3-storage/multipart-parser@1.0.0: + resolution: {integrity: sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw==} + dev: true + + /@web3-storage/parse-link-header@3.1.0: + resolution: {integrity: sha512-K1undnK70vLLauqdE8bq/l98isTF2FDhcP0UPpXVSjkSWe3xhAn5eRXk5jfA1E5ycNm84Ws/rQFUD7ue11nciw==} + dev: true + + /@web3modal/core@2.4.3(react@18.2.0): + resolution: {integrity: sha512-7Z/sDe9RIYQ2k9ITcxgEa/u7FvlI76vcVVZn9UY4ISivefqrH4JAS3GX4JmVNUUlovwuiZdyqBv4llAQOMK6Rg==} + dependencies: + buffer: 6.0.3 + valtio: 1.10.5(react@18.2.0) + transitivePeerDependencies: + - react + dev: false + + /@web3modal/standalone@2.4.3(react@18.2.0): + resolution: {integrity: sha512-5ATXBoa4GGm+TIUSsKWsfWCJunv1XevOizpgTFhqyeGgRDmWhqsz9UIPzH/1mk+g0iJ/xqMKs5F6v9D2QeKxag==} + deprecated: This package has been deprecated in favor of @walletconnect/modal. Please read more at https://docs.walletconnect.com + dependencies: + '@web3modal/core': 2.4.3(react@18.2.0) + '@web3modal/ui': 2.4.3(react@18.2.0) + transitivePeerDependencies: + - react + dev: false + + /@web3modal/ui@2.4.3(react@18.2.0): + resolution: {integrity: sha512-J989p8CdtEhI9gZHf/rZ/WFqYlrAHWw9GmAhFoiNODwjAp0BoG/uoaPiijJMchXdngihZOjLGCQwDXU16DHiKg==} + dependencies: + '@web3modal/core': 2.4.3(react@18.2.0) + lit: 2.7.5 + motion: 10.16.2 + qrcode: 1.5.3 + transitivePeerDependencies: + - react + dev: false + + /@webassemblyjs/ast@1.11.6: + resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + dev: true + + /@webassemblyjs/floating-point-hex-parser@1.11.6: + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + dev: true + + /@webassemblyjs/helper-api-error@1.11.6: + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + dev: true + + /@webassemblyjs/helper-buffer@1.11.6: + resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} + dev: true + + /@webassemblyjs/helper-numbers@1.11.6: + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/helper-wasm-bytecode@1.11.6: + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + dev: true + + /@webassemblyjs/helper-wasm-section@1.11.6: + resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + dev: true + + /@webassemblyjs/ieee754@1.11.6: + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + dependencies: + '@xtuc/ieee754': 1.2.0 + dev: true + + /@webassemblyjs/leb128@1.11.6: + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + dependencies: + '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/utf8@1.11.6: + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + dev: true + + /@webassemblyjs/wasm-edit@1.11.6: + resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-opt': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + '@webassemblyjs/wast-printer': 1.11.6 + dev: true + + /@webassemblyjs/wasm-gen@1.11.6: + resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + dev: true + + /@webassemblyjs/wasm-opt@1.11.6: + resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + dev: true + + /@webassemblyjs/wasm-parser@1.11.6: + resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + dev: true + + /@webassemblyjs/wast-printer@1.11.6: + resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@xtuc/long': 4.2.2 + dev: true + + /@xtuc/ieee754@1.2.0: + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + dev: true + + /@xtuc/long@4.2.2: + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + dev: true + + /@zxing/text-encoding@0.9.0: + resolution: {integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==} + requiresBuild: true + dev: true + optional: true + + /JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + dev: false + + /abitype@0.8.7(typescript@5.1.3): + resolution: {integrity: sha512-wQ7hV8Yg/yKmGyFpqrNZufCxbszDe5es4AZGYPBitocfSqXtjrTG9JMWFcc4N30ukl2ve48aBTwt7NJxVQdU3w==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.19.1 + peerDependenciesMeta: + zod: + optional: true + dependencies: + typescript: 5.1.3 + dev: false + + /abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + dev: true + + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: true + + /acorn-import-assertions@1.9.0(acorn@8.10.0): + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.10.0 + dev: true + + /acorn-jsx@5.3.2(acorn@8.10.0): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.10.0 + dev: true + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + + /add-stream@1.0.0: + resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} + dev: false + + /aes-js@3.0.0: + resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} + dev: false + + /aes-js@3.1.2: + resolution: {integrity: sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==} + dev: false + + /aes-js@4.0.0-beta.5: + resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} + dev: false + + /agent-base@7.1.0: + resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} + engines: {node: '>= 14'} + dependencies: + debug: 4.3.4(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + dev: false + + /agentkeepalive@4.5.0: + resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} + engines: {node: '>= 8.0.0'} + dependencies: + humanize-ms: 1.2.1 + dev: false + + /ajv-formats@2.1.1(ajv@8.12.0): + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.12.0 + dev: true + + /ajv-keywords@3.5.2(ajv@6.12.6): + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + dependencies: + ajv: 6.12.6 + dev: true + + /ajv-keywords@5.1.0(ajv@8.12.0): + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + dependencies: + ajv: 8.12.0 + fast-deep-equal: 3.1.3 + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + + /ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + dependencies: + string-width: 4.2.3 + + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: true + + /any-signal@2.1.2: + resolution: {integrity: sha512-B+rDnWasMi/eWcajPcCWSlYc7muXOrcYrqgyzcdKisl2H/WTlQ0gip1KyQfr0ZlxJdsuWCj/LWwQm7fhyhRfIQ==} + dependencies: + abort-controller: 3.0.0 + native-abort-controller: 1.0.4(abort-controller@3.0.0) + dev: true + + /any-signal@3.0.1: + resolution: {integrity: sha512-xgZgJtKEa9YmDqXodIgl7Fl1C8yNXr8w6gXjqK3LW4GcEiYT+6AQfJSE/8SPsEpLLmcvbv8YU+qet94UewHxqg==} + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: false + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + /aria-hidden@1.2.3: + resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} + engines: {node: '>=10'} + dependencies: + tslib: 2.6.1 + dev: false + + /aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + dependencies: + dequal: 2.0.3 + dev: true + + /array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + dependencies: + call-bind: 1.0.2 + is-array-buffer: 3.0.2 + + /array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + dev: false + + /array-includes@3.1.6: + resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + get-intrinsic: 1.2.1 + is-string: 1.0.7 + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /array.prototype.flat@1.3.1: + resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-shim-unscopables: 1.0.0 + dev: true + + /array.prototype.flatmap@1.3.1: + resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-shim-unscopables: 1.0.0 + dev: true + + /array.prototype.map@1.0.5: + resolution: {integrity: sha512-gfaKntvwqYIuC7mLLyv2wzZIJqrRhn5PZ9EfFejSx6a78sV7iDsGpG9P+3oUPtm1Rerqm6nrKS4FYuTIvWfo3g==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-array-method-boxes-properly: 1.0.0 + is-string: 1.0.7 + dev: false + + /array.prototype.tosorted@1.1.1: + resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-shim-unscopables: 1.0.0 + get-intrinsic: 1.2.1 + dev: true + + /arraybuffer.prototype.slice@1.0.1: + resolution: {integrity: sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.2 + define-properties: 1.2.0 + get-intrinsic: 1.2.1 + is-array-buffer: 3.0.2 + is-shared-array-buffer: 1.0.2 + + /arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + + /assert@2.0.0: + resolution: {integrity: sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==} + dependencies: + es6-object-assign: 1.1.0 + is-nan: 1.3.2 + object-is: 1.1.5 + util: 0.12.5 + dev: true + + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + + /ast-types-flow@0.0.7: + resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} + dev: true + + /ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} + dependencies: + tslib: 2.6.1 + dev: false + + /astring@1.8.6: + resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} + hasBin: true + dev: true + + /async-mutex@0.2.6: + resolution: {integrity: sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==} + dependencies: + tslib: 2.6.1 + dev: false + + /async-retry@1.3.3: + resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} + dependencies: + retry: 0.13.1 + dev: false + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + + /atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + dev: false + + /available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + + /axe-core@4.7.2: + resolution: {integrity: sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==} + engines: {node: '>=4'} + dev: true + + /axios@0.21.4: + resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + dependencies: + follow-redirects: 1.15.2 + transitivePeerDependencies: + - debug + dev: false + + /axios@0.27.2: + resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} + dependencies: + follow-redirects: 1.15.2 + form-data: 4.0.0 + transitivePeerDependencies: + - debug + dev: false + + /axios@1.1.3: + resolution: {integrity: sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==} + dependencies: + follow-redirects: 1.15.2 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + + /axobject-query@3.2.1: + resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + dependencies: + dequal: 2.0.3 + dev: true + + /babel-loader@9.1.2(@babel/core@7.22.5)(webpack@5.88.2): + resolution: {integrity: sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==} + engines: {node: '>= 14.15.0'} + peerDependencies: + '@babel/core': ^7.12.0 + webpack: '>=5' + dependencies: + '@babel/core': 7.22.5 + find-cache-dir: 3.3.2 + schema-utils: 4.2.0 + webpack: 5.88.2 + dev: true + + /babel-plugin-styled-components@2.1.4(@babel/core@7.22.5)(styled-components@5.3.11): + resolution: {integrity: sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==} + peerDependencies: + styled-components: '>= 2' + dependencies: + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.5 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.5) + lodash: 4.17.21 + picomatch: 2.3.1 + styled-components: 5.3.11(@babel/core@7.22.5)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) + transitivePeerDependencies: + - '@babel/core' + + /bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + dev: true + + /balanced-match@0.4.2: + resolution: {integrity: sha512-STw03mQKnGUYtoNjmowo4F2cRmIIxYEGiMsjjwla/u5P1lxadj/05WkNaFjNiKTgJkj8KiXbgAiRTmcQRwQNtg==} + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /base-x@3.0.9: + resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + /basic-ftp@5.0.3: + resolution: {integrity: sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==} + engines: {node: '>=10.0.0'} + dev: false + + /bech32@1.1.4: + resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} + dev: false + + /before-after-hook@2.2.3: + resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} + dev: false + + /big-integer@1.6.51: + resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} + engines: {node: '>=0.6'} + + /bigint-buffer@1.1.5: + resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} + engines: {node: '>= 10.0.0'} + requiresBuild: true + dependencies: + bindings: 1.5.0 + dev: false + + /bignumber.js@9.1.1: + resolution: {integrity: sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==} + dev: false + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /bind-decorator@1.0.11: + resolution: {integrity: sha512-yzkH0uog6Vv/vQ9+rhSKxecnqGUZHYncg7qS7voz3Q76+TAi1SGiOKk2mlOvusQnFz9Dc4BC/NMkeXu11YgjJg==} + dev: false + + /bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + dependencies: + file-uri-to-path: 1.0.0 + dev: false + + /bip32@2.0.6: + resolution: {integrity: sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA==} + engines: {node: '>=6.0.0'} + dependencies: + '@types/node': 10.12.18 + bs58check: 2.1.2 + create-hash: 1.2.0 + create-hmac: 1.1.7 + tiny-secp256k1: 1.1.6 + typeforce: 1.18.0 + wif: 2.0.6 + dev: false + + /bip39@3.1.0: + resolution: {integrity: sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==} + dependencies: + '@noble/hashes': 1.3.1 + dev: false + + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /bl@5.1.0: + resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} + dependencies: + buffer: 6.0.3 + inherits: 2.0.4 + readable-stream: 3.6.2 + + /blob-to-it@1.0.4: + resolution: {integrity: sha512-iCmk0W4NdbrWgRRuxOriU8aM5ijeVLI61Zulsmg/lUHNr7pYjoj+U77opLefNagevtrrbMt3JQ5Qip7ar178kA==} + dependencies: + browser-readablestream-to-it: 1.0.3 + dev: true + + /blockstore-core@1.0.5: + resolution: {integrity: sha512-i/9CUMMvBALVbtSqUIuiWB3tk//a4Q2I2CEWiBuYNnhJvk/DWplXjLt8Sqc5VGkRVXVPSsEuH8fUtqJt5UFYcA==} + dependencies: + err-code: 3.0.1 + interface-blockstore: 2.0.3 + interface-store: 2.0.2 + it-all: 1.0.6 + it-drain: 1.0.5 + it-filter: 1.0.3 + it-take: 1.0.2 + multiformats: 9.9.0 + dev: true + + /blueimp-md5@2.19.0: + resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} + dev: true + + /bn.js@4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + dev: false + + /bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + dev: false + + /borsh@0.7.0: + resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} + dependencies: + bn.js: 5.2.1 + bs58: 4.0.1 + text-encoding-utf-8: 1.0.2 + dev: false + + /boxen@7.1.1: + resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} + engines: {node: '>=14.16'} + dependencies: + ansi-align: 3.0.1 + camelcase: 7.0.1 + chalk: 5.3.0 + cli-boxes: 3.0.0 + string-width: 5.1.2 + type-fest: 2.19.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 + + /bplist-parser@0.2.0: + resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} + engines: {node: '>= 5.10.0'} + dependencies: + big-integer: 1.6.51 + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + + /broadcast-channel@3.7.0: + resolution: {integrity: sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==} + dependencies: + '@babel/runtime': 7.22.10 + detect-node: 2.1.0 + js-sha3: 0.8.0 + microseconds: 0.2.0 + nano-time: 1.0.0 + oblivious-set: 1.0.0 + rimraf: 3.0.2 + unload: 2.2.0 + dev: false + + /brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + dev: false + + /browser-readablestream-to-it@1.0.3: + resolution: {integrity: sha512-+12sHB+Br8HIh6VAMVEG5r3UXCyESIgDW7kzk3BjIXa43DVqVwL7GC5TW3jeh+72dtcH99pPVpw0X8i0jt+/kw==} + dev: true + + /browserify-zlib@0.2.0: + resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} + dependencies: + pako: 1.0.11 + dev: true + + /browserslist@4.21.10: + resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001521 + electron-to-chromium: 1.4.495 + node-releases: 2.0.13 + update-browserslist-db: 1.0.11(browserslist@4.21.10) + + /bs58@4.0.1: + resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + dependencies: + base-x: 3.0.9 + dev: false + + /bs58check@2.1.2: + resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} + dependencies: + bs58: 4.0.1 + create-hash: 1.2.0 + safe-buffer: 5.2.1 + dev: false + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + /bufferutil@4.0.7: + resolution: {integrity: sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==} + engines: {node: '>=6.14.2'} + requiresBuild: true + dependencies: + node-gyp-build: 4.6.0 + dev: false + + /builtins@5.0.1: + resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + dependencies: + semver: 7.5.4 + dev: true + + /bundle-name@3.0.0: + resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} + engines: {node: '>=12'} + dependencies: + run-applescript: 5.0.0 + + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + + /cache-content-type@1.0.1: + resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} + engines: {node: '>= 6.0.0'} + dependencies: + mime-types: 2.1.35 + ylru: 1.3.2 + dev: true + + /cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} + dev: false + + /cacheable-request@10.2.13: + resolution: {integrity: sha512-3SD4rrMu1msNGEtNSt8Od6enwdo//U9s4ykmXfA2TD58kcLkCobtCDiby7kNyj7a/Q7lz/mAesAFI54rTdnvBA==} + engines: {node: '>=14.16'} + dependencies: + '@types/http-cache-semantics': 4.0.1 + get-stream: 6.0.1 + http-cache-semantics: 4.1.1 + keyv: 4.5.3 + mimic-response: 4.0.0 + normalize-url: 8.0.0 + responselike: 3.0.0 + dev: false + + /call-bind@1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.2.1 + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + /camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: true + + /camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + + /camelize@1.0.1: + resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + + /caniuse-lite@1.0.30001521: + resolution: {integrity: sha512-fnx1grfpEOvDGH+V17eccmNjucGUnCbP6KL+l5KqBIerp26WK/+RQ7CIDE37KGJjaPyqWXXlFUyKiWmvdNNKmQ==} + + /carbites@1.0.6: + resolution: {integrity: sha512-dS9IQvnrb5VIRvSTNz5Ff+mB9d2MFfi5mojtJi7Rlss79VeF190jr0sZdA7eW0CGHotvHkZaWuM6wgfD9PEFRg==} + dependencies: + '@ipld/car': 3.2.4 + '@ipld/dag-cbor': 6.0.15 + '@ipld/dag-pb': 2.1.18 + multiformats: 9.9.0 + dev: true + + /cborg@1.10.2: + resolution: {integrity: sha512-b3tFPA9pUr2zCUiCfRd2+wok2/LBSNUMKOuRRok+WlvvAgEt/PlbgPTsZUcwCOs53IJvLgTp0eotwtosE6njug==} + hasBin: true + dev: true + + /ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + dev: true + + /chai@4.3.7: + resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.2 + deep-eql: 4.1.3 + get-func-name: 2.0.0 + loupe: 2.3.6 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /chalk@5.2.0: + resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: false + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + /character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + dev: true + + /character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + dev: true + + /character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + dev: true + + /character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + dev: true + + /chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + dev: false + + /check-error@1.0.2: + resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + dev: true + + /ci-info@3.8.0: + resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} + engines: {node: '>=8'} + dev: false + + /cipher-base@1.0.4: + resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: false + + /class-is@1.1.0: + resolution: {integrity: sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==} + dev: true + + /classnames@2.3.2: + resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} + + /cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: false + + /cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + restore-cursor: 4.0.0 + dev: false + + /cli-spinners@2.9.0: + resolution: {integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==} + engines: {node: '>=6'} + dev: false + + /cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + dev: false + + /cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + dev: false + + /cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: false + + /clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + dev: false + + /clsx@1.2.1: + resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} + engines: {node: '>=6'} + dev: false + + /cmdk@0.2.0(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-JQpKvEOb86SnvMZbYaFKYhvzFntWBeSZdyii0rZPhKJj9uwJBxu4DaVYDrRN7r3mPop56oPhRw+JYWTKs66TYw==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@radix-ui/react-dialog': 1.0.0(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + command-score: 0.1.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + dev: false + + /co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: true + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: false + + /color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + dev: false + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + + /comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + dev: true + + /command-score@0.1.2: + resolution: {integrity: sha512-VtDvQpIJBvBatnONUsPzXYFVKQQAhuf3XTNOAsdBxCNO/QCtUUd8LSgjn0GVarBkCad6aJCZfXgrjYbl/KRr7w==} + dev: false + + /commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + dev: true + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: true + + /commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + dev: true + + /compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + dev: false + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 + dev: false + + /concordance@5.0.4: + resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} + engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'} + dependencies: + date-time: 3.1.0 + esutils: 2.0.3 + fast-diff: 1.3.0 + js-string-escape: 1.0.1 + lodash: 4.17.21 + md5-hex: 3.0.1 + semver: 7.5.4 + well-known-symbols: 2.0.0 + dev: true + + /config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + dev: false + + /configstore@6.0.0: + resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} + engines: {node: '>=12'} + dependencies: + dot-prop: 6.0.1 + graceful-fs: 4.2.11 + unique-string: 3.0.0 + write-file-atomic: 3.0.3 + xdg-basedir: 5.1.0 + dev: false + + /confusing-browser-globals@1.0.11: + resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} + dev: true + + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + dev: true + + /conventional-changelog-angular@6.0.0: + resolution: {integrity: sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg==} + engines: {node: '>=14'} + dependencies: + compare-func: 2.0.0 + dev: false + + /conventional-changelog-atom@3.0.0: + resolution: {integrity: sha512-pnN5bWpH+iTUWU3FaYdw5lJmfWeqSyrUkG+wyHBI9tC1dLNnHkbAOg1SzTQ7zBqiFrfo55h40VsGXWMdopwc5g==} + engines: {node: '>=14'} + dev: false + + /conventional-changelog-codemirror@3.0.0: + resolution: {integrity: sha512-wzchZt9HEaAZrenZAUUHMCFcuYzGoZ1wG/kTRMICxsnW5AXohYMRxnyecP9ob42Gvn5TilhC0q66AtTPRSNMfw==} + engines: {node: '>=14'} + dev: false + + /conventional-changelog-conventionalcommits@6.1.0: + resolution: {integrity: sha512-3cS3GEtR78zTfMzk0AizXKKIdN4OvSh7ibNz6/DPbhWWQu7LqE/8+/GqSodV+sywUR2gpJAdP/1JFf4XtN7Zpw==} + engines: {node: '>=14'} + dependencies: + compare-func: 2.0.0 + dev: false + + /conventional-changelog-core@5.0.2: + resolution: {integrity: sha512-RhQOcDweXNWvlRwUDCpaqXzbZemKPKncCWZG50Alth72WITVd6nhVk9MJ6w1k9PFNBcZ3YwkdkChE+8+ZwtUug==} + engines: {node: '>=14'} + dependencies: + add-stream: 1.0.0 + conventional-changelog-writer: 6.0.1 + conventional-commits-parser: 4.0.0 + dateformat: 3.0.3 + get-pkg-repo: 4.2.1 + git-raw-commits: 3.0.0 + git-remote-origin-url: 2.0.0 + git-semver-tags: 5.0.1 + normalize-package-data: 3.0.3 + read-pkg: 3.0.0 + read-pkg-up: 3.0.0 + dev: false + + /conventional-changelog-ember@3.0.0: + resolution: {integrity: sha512-7PYthCoSxIS98vWhVcSphMYM322OxptpKAuHYdVspryI0ooLDehRXWeRWgN+zWSBXKl/pwdgAg8IpLNSM1/61A==} + engines: {node: '>=14'} + dev: false + + /conventional-changelog-eslint@4.0.0: + resolution: {integrity: sha512-nEZ9byP89hIU0dMx37JXQkE1IpMmqKtsaR24X7aM3L6Yy/uAtbb+ogqthuNYJkeO1HyvK7JsX84z8649hvp43Q==} + engines: {node: '>=14'} + dev: false + + /conventional-changelog-express@3.0.0: + resolution: {integrity: sha512-HqxihpUMfIuxvlPvC6HltA4ZktQEUan/v3XQ77+/zbu8No/fqK3rxSZaYeHYant7zRxQNIIli7S+qLS9tX9zQA==} + engines: {node: '>=14'} + dev: false + + /conventional-changelog-jquery@4.0.0: + resolution: {integrity: sha512-TTIN5CyzRMf8PUwyy4IOLmLV2DFmPtasKN+x7EQKzwSX8086XYwo+NeaeA3VUT8bvKaIy5z/JoWUvi7huUOgaw==} + engines: {node: '>=14'} + dev: false + + /conventional-changelog-jshint@3.0.0: + resolution: {integrity: sha512-bQof4byF4q+n+dwFRkJ/jGf9dCNUv4/kCDcjeCizBvfF81TeimPZBB6fT4HYbXgxxfxWXNl/i+J6T0nI4by6DA==} + engines: {node: '>=14'} + dependencies: + compare-func: 2.0.0 + dev: false + + /conventional-changelog-preset-loader@3.0.0: + resolution: {integrity: sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA==} + engines: {node: '>=14'} + dev: false + + /conventional-changelog-writer@6.0.1: + resolution: {integrity: sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ==} + engines: {node: '>=14'} + hasBin: true + dependencies: + conventional-commits-filter: 3.0.0 + dateformat: 3.0.3 + handlebars: 4.7.8 + json-stringify-safe: 5.0.1 + meow: 8.1.2 + semver: 7.5.4 + split: 1.0.1 + dev: false + + /conventional-changelog@4.0.0: + resolution: {integrity: sha512-JbZjwE1PzxQCvm+HUTIr+pbSekS8qdOZzMakdFyPtdkEWwFvwEJYONzjgMm0txCb2yBcIcfKDmg8xtCKTdecNQ==} + engines: {node: '>=14'} + dependencies: + conventional-changelog-angular: 6.0.0 + conventional-changelog-atom: 3.0.0 + conventional-changelog-codemirror: 3.0.0 + conventional-changelog-conventionalcommits: 6.1.0 + conventional-changelog-core: 5.0.2 + conventional-changelog-ember: 3.0.0 + conventional-changelog-eslint: 4.0.0 + conventional-changelog-express: 3.0.0 + conventional-changelog-jquery: 4.0.0 + conventional-changelog-jshint: 3.0.0 + conventional-changelog-preset-loader: 3.0.0 + dev: false + + /conventional-commits-filter@3.0.0: + resolution: {integrity: sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==} + engines: {node: '>=14'} + dependencies: + lodash.ismatch: 4.4.0 + modify-values: 1.0.1 + dev: false + + /conventional-commits-parser@4.0.0: + resolution: {integrity: sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==} + engines: {node: '>=14'} + hasBin: true + dependencies: + JSONStream: 1.3.5 + is-text-path: 1.0.1 + meow: 8.1.2 + split2: 3.2.2 + dev: false + + /conventional-recommended-bump@7.0.1: + resolution: {integrity: sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA==} + engines: {node: '>=14'} + hasBin: true + dependencies: + concat-stream: 2.0.0 + conventional-changelog-preset-loader: 3.0.0 + conventional-commits-filter: 3.0.0 + conventional-commits-parser: 4.0.0 + git-raw-commits: 3.0.0 + git-semver-tags: 5.0.1 + meow: 8.1.2 + dev: false + + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + /cookies@0.8.0: + resolution: {integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + keygrip: 1.1.0 + dev: true + + /copy-anything@3.0.5: + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} + engines: {node: '>=12.13'} + dependencies: + is-what: 4.1.15 + dev: false + + /copy-to-clipboard@3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + dependencies: + toggle-selection: 1.0.6 + dev: false + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: false + + /cosmiconfig@8.1.3: + resolution: {integrity: sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==} + engines: {node: '>=14'} + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + dev: false + + /cosmiconfig@8.2.0: + resolution: {integrity: sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==} + engines: {node: '>=14'} + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + dev: true + + /cosmjs-types@0.5.2: + resolution: {integrity: sha512-zxCtIJj8v3Di7s39uN4LNcN3HIE1z0B9Z0SPE8ZNQR0oSzsuSe1ACgxoFkvhkS7WBasCAFcglS11G2hyfd5tPg==} + dependencies: + long: 4.0.0 + protobufjs: 6.11.4 + dev: false + + /cosmjs-types@0.7.2: + resolution: {integrity: sha512-vf2uLyktjr/XVAgEq0DjMxeAWh1yYREe7AMHDKd7EiHVqxBPCaBS+qEEQUkXbR9ndnckqr1sUG8BQhazh4X5lA==} + dependencies: + long: 4.0.0 + protobufjs: 6.11.4 + dev: false + + /cosmjs-types@0.8.0: + resolution: {integrity: sha512-Q2Mj95Fl0PYMWEhA2LuGEIhipF7mQwd9gTQ85DdP9jjjopeoGaDxvmPa5nakNzsq7FnO1DMTatXTAx6bxMH7Lg==} + dependencies: + long: 4.0.0 + protobufjs: 6.11.4 + dev: false + + /cosmos-directory-client@0.0.6: + resolution: {integrity: sha512-WIdaQ8uW1vIbYvNnAVunkC6yxTrneJC7VQ5UUQ0kuw8b0C0A39KTIpoQHCfc8tV7o9vF4niwRhdXEdfAgQEsQQ==} + dependencies: + cosmos-directory-types: 0.0.6 + node-fetch-native: 1.2.0 + dev: false + + /cosmos-directory-types@0.0.6: + resolution: {integrity: sha512-9qlQ3kTNTHvhYglTXSnllGqKhrtGB08Weatw56ZqV5OqcmjuZdlY9iMtD00odgQLTEpTSQQL3gFGuqTkGdIDPA==} + dev: false + + /create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + dependencies: + cipher-base: 1.0.4 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.2 + sha.js: 2.4.11 + dev: false + + /create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + dependencies: + cipher-base: 1.0.4 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + dev: false + + /cross-fetch@3.1.8: + resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} + dependencies: + node-fetch: 2.6.12 + transitivePeerDependencies: + - encoding + dev: false + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /crypto-js@4.1.1: + resolution: {integrity: sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==} + dev: false + + /crypto-random-string@4.0.0: + resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} + engines: {node: '>=12'} + dependencies: + type-fest: 1.4.0 + dev: false + + /css-color-keywords@1.0.0: + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} + + /css-to-react-native@3.2.0: + resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + dependencies: + camelize: 1.0.1 + css-color-keywords: 1.0.0 + postcss-value-parser: 4.2.0 + + /csstype@3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + + /d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + dependencies: + internmap: 1.0.1 + dev: false + + /d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + dependencies: + internmap: 2.0.3 + dev: false + + /d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + dev: false + + /d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + dev: false + + /d3-interpolate-path@2.2.1: + resolution: {integrity: sha512-6qLLh/KJVzls0XtMsMpcxhqMhgVEN7VIbR/6YGZe2qlS8KDgyyVB20XcmGnDyB051HcefQXM/Tppa9vcANEA4Q==} + dev: false + + /d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + dependencies: + d3-color: 3.1.0 + dev: false + + /d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + dev: false + + /d3-path@2.0.0: + resolution: {integrity: sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA==} + dev: false + + /d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 2.1.1 + d3-time-format: 4.1.0 + dev: false + + /d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + dependencies: + d3-path: 1.0.9 + dev: false + + /d3-shape@2.1.0: + resolution: {integrity: sha512-PnjUqfM2PpskbSLTJvAzp2Wv4CZsnAgTfcVRTwW03QR3MkXF8Uo7B1y/lWkAsmbKwuecto++4NlsYcvYpXpTHA==} + dependencies: + d3-path: 2.0.0 + dev: false + + /d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + dependencies: + d3-time: 2.1.1 + dev: false + + /d3-time@2.1.1: + resolution: {integrity: sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==} + dependencies: + d3-array: 2.12.1 + dev: false + + /d3-voronoi@1.1.4: + resolution: {integrity: sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==} + dev: false + + /damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + dev: true + + /dargs@7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + dev: false + + /data-uri-to-buffer@3.0.1: + resolution: {integrity: sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==} + engines: {node: '>= 6'} + dev: true + + /data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + /data-uri-to-buffer@5.0.1: + resolution: {integrity: sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==} + engines: {node: '>= 14'} + dev: false + + /date-time@3.1.0: + resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} + engines: {node: '>=6'} + dependencies: + time-zone: 1.0.0 + dev: true + + /dateformat@3.0.3: + resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} + dev: false + + /debounce@1.2.1: + resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + dev: false + + /debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + + /debug@4.3.4(supports-color@5.5.0): + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + supports-color: 5.5.0 + + /decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + /decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + dependencies: + character-entities: 2.0.2 + dev: true + + /decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + dev: false + + /decode-uri-component@0.4.1: + resolution: {integrity: sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==} + engines: {node: '>=14.16'} + dev: true + + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: false + + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + + /deep-equal@1.0.1: + resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} + dev: true + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: false + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + /default-browser-id@3.0.0: + resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} + engines: {node: '>=12'} + dependencies: + bplist-parser: 0.2.0 + untildify: 4.0.0 + + /default-browser@4.0.0: + resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} + engines: {node: '>=14.16'} + dependencies: + bundle-name: 3.0.0 + default-browser-id: 3.0.0 + execa: 7.2.0 + titleize: 3.0.0 + + /defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + dependencies: + clone: 1.0.4 + dev: false + + /defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + dev: false + + /define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + /define-properties@1.2.0: + resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + engines: {node: '>= 0.4'} + dependencies: + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + + /degenerator@4.0.4: + resolution: {integrity: sha512-MTZdZsuNxSBL92rsjx3VFWe57OpRlikyLbcx2B5Dmdv6oScqpMrvpY7zHLMymrUxo3U5+suPUMsNgW/+SZB1lg==} + engines: {node: '>= 14'} + dependencies: + ast-types: 0.13.4 + escodegen: 1.14.3 + esprima: 4.0.1 + vm2: 3.9.19 + dev: false + + /delay@4.4.1: + resolution: {integrity: sha512-aL3AhqtfhOlT/3ai6sWXeqwnw63ATNpnUiN4HL7x9q+My5QtHlO3OIkasmug9LKzpheLdmUKGRKnYXYAS7FQkQ==} + engines: {node: '>=6'} + dev: false + + /delay@5.0.0: + resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} + engines: {node: '>=10'} + dev: false + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + + /delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: true + + /depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + dev: true + + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: true + + /deprecation@2.3.1: + resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} + dev: false + + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + dev: true + + /destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: true + + /detect-browser@5.3.0: + resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==} + dev: false + + /detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + dev: false + + /detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + dev: false + + /diff-sequences@29.4.3: + resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + engines: {node: '>=0.3.1'} + dev: true + + /dijkstrajs@1.0.3: + resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + dev: false + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + + /dns-over-http-resolver@1.2.3(node-fetch@3.3.1): + resolution: {integrity: sha512-miDiVSI6KSNbi4SVifzO/reD8rMnxgrlnkrlkugOLQpWQTe2qMdHsZp5DmfKjxNE+/T3VAAYLQUZMv9SMr6+AA==} + dependencies: + debug: 4.3.4(supports-color@5.5.0) + native-fetch: 3.0.0(node-fetch@3.3.1) + receptacle: 1.3.2 + transitivePeerDependencies: + - node-fetch + - supports-color + dev: true + + /doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + dependencies: + is-obj: 2.0.0 + dev: false + + /dot-prop@6.0.1: + resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} + engines: {node: '>=10'} + dependencies: + is-obj: 2.0.0 + dev: false + + /duplexify@4.1.2: + resolution: {integrity: sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==} + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 3.6.2 + stream-shift: 1.0.1 + dev: false + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + dev: true + + /electron-fetch@1.9.1: + resolution: {integrity: sha512-M9qw6oUILGVrcENMSRRefE1MbHPIz0h79EKIeJWK9v563aT9Qkh8aEHPO1H5vi970wPirNY+jO9OpFoLiMsMGA==} + engines: {node: '>=6'} + dependencies: + encoding: 0.1.13 + dev: true + + /electron-to-chromium@1.4.495: + resolution: {integrity: sha512-mwknuemBZnoOCths4GtpU/SDuVMp3uQHKa2UNJT9/aVD6WVRjGpXOxRGX7lm6ILIenTdGXPSTCTDaWos5tEU8Q==} + + /elliptic@6.5.4: + resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + dev: false + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + /encode-utf8@1.0.3: + resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} + dev: false + + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: true + + /encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + dependencies: + iconv-lite: 0.6.3 + dev: true + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: false + + /enhanced-resolve@5.15.0: + resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + dev: true + + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: true + + /err-code@3.0.1: + resolution: {integrity: sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==} + dev: true + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + + /es-abstract@1.22.1: + resolution: {integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + arraybuffer.prototype.slice: 1.0.1 + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + es-set-tostringtag: 2.0.1 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.5 + get-intrinsic: 1.2.1 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 + has: 1.0.3 + has-property-descriptors: 1.0.0 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + is-array-buffer: 3.0.2 + is-callable: 1.2.7 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-typed-array: 1.1.12 + is-weakref: 1.0.2 + object-inspect: 1.12.3 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.5.0 + safe-array-concat: 1.0.0 + safe-regex-test: 1.0.0 + string.prototype.trim: 1.2.7 + string.prototype.trimend: 1.0.6 + string.prototype.trimstart: 1.0.6 + typed-array-buffer: 1.0.0 + typed-array-byte-length: 1.0.0 + typed-array-byte-offset: 1.0.0 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.11 + + /es-array-method-boxes-properly@1.0.0: + resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} + dev: false + + /es-get-iterator@1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + is-arguments: 1.1.1 + is-map: 2.0.2 + is-set: 2.0.2 + is-string: 1.0.7 + isarray: 2.0.5 + stop-iteration-iterator: 1.0.0 + dev: false + + /es-module-lexer@1.3.0: + resolution: {integrity: sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==} + dev: true + + /es-set-tostringtag@2.0.1: + resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.1 + has: 1.0.3 + has-tostringtag: 1.0.0 + + /es-shim-unscopables@1.0.0: + resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + dependencies: + has: 1.0.3 + dev: true + + /es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + + /es6-object-assign@1.1.0: + resolution: {integrity: sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==} + dev: true + + /es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + dev: false + + /es6-promisify@5.0.0: + resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} + dependencies: + es6-promise: 4.2.8 + dev: false + + /esbuild@0.17.19: + resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.19 + '@esbuild/android-arm64': 0.17.19 + '@esbuild/android-x64': 0.17.19 + '@esbuild/darwin-arm64': 0.17.19 + '@esbuild/darwin-x64': 0.17.19 + '@esbuild/freebsd-arm64': 0.17.19 + '@esbuild/freebsd-x64': 0.17.19 + '@esbuild/linux-arm': 0.17.19 + '@esbuild/linux-arm64': 0.17.19 + '@esbuild/linux-ia32': 0.17.19 + '@esbuild/linux-loong64': 0.17.19 + '@esbuild/linux-mips64el': 0.17.19 + '@esbuild/linux-ppc64': 0.17.19 + '@esbuild/linux-riscv64': 0.17.19 + '@esbuild/linux-s390x': 0.17.19 + '@esbuild/linux-x64': 0.17.19 + '@esbuild/netbsd-x64': 0.17.19 + '@esbuild/openbsd-x64': 0.17.19 + '@esbuild/sunos-x64': 0.17.19 + '@esbuild/win32-arm64': 0.17.19 + '@esbuild/win32-ia32': 0.17.19 + '@esbuild/win32-x64': 0.17.19 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + /escape-goat@4.0.0: + resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} + engines: {node: '>=12'} + dev: false + + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: true + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + /escodegen@1.14.3: + resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} + engines: {node: '>=4.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 4.3.0 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 + dev: false + + /eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.27.5)(eslint@8.43.0): + resolution: {integrity: sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==} + engines: {node: ^10.12.0 || >=12.0.0} + peerDependencies: + eslint: ^7.32.0 || ^8.2.0 + eslint-plugin-import: ^2.25.2 + dependencies: + confusing-browser-globals: 1.0.11 + eslint: 8.43.0 + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.60.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.43.0) + object.assign: 4.1.4 + object.entries: 1.1.6 + semver: 6.3.1 + dev: true + + /eslint-config-airbnb-typescript@17.0.0(@typescript-eslint/eslint-plugin@5.60.0)(@typescript-eslint/parser@5.60.0)(eslint-plugin-import@2.27.5)(eslint@8.43.0): + resolution: {integrity: sha512-elNiuzD0kPAPTXjFWg+lE24nMdHMtuxgYoD30OyMD6yrW1AhFZPAg27VX7d3tzOErw+dgJTNWfRSDqEcXb4V0g==} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^5.13.0 + '@typescript-eslint/parser': ^5.0.0 + eslint: ^7.32.0 || ^8.2.0 + eslint-plugin-import: ^2.25.3 + dependencies: + '@typescript-eslint/eslint-plugin': 5.60.0(@typescript-eslint/parser@5.60.0)(eslint@8.43.0)(typescript@5.1.3) + '@typescript-eslint/parser': 5.60.0(eslint@8.43.0)(typescript@5.1.3) + eslint: 8.43.0 + eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.27.5)(eslint@8.43.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.60.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.43.0) + dev: true + + /eslint-config-airbnb@19.0.4(eslint-plugin-import@2.27.5)(eslint-plugin-jsx-a11y@6.7.1)(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react@7.32.2)(eslint@8.43.0): + resolution: {integrity: sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==} + engines: {node: ^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^7.32.0 || ^8.2.0 + eslint-plugin-import: ^2.25.3 + eslint-plugin-jsx-a11y: ^6.5.1 + eslint-plugin-react: ^7.28.0 + eslint-plugin-react-hooks: ^4.3.0 + dependencies: + eslint: 8.43.0 + eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.27.5)(eslint@8.43.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.60.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.43.0) + eslint-plugin-jsx-a11y: 6.7.1(eslint@8.43.0) + eslint-plugin-react: 7.32.2(eslint@8.43.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.43.0) + object.assign: 4.1.4 + object.entries: 1.1.6 + dev: true + + /eslint-config-prettier@8.8.0(eslint@8.43.0): + resolution: {integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.43.0 + dev: true + + /eslint-config-standard-with-typescript@35.0.0(@typescript-eslint/eslint-plugin@5.60.0)(eslint-plugin-import@2.27.5)(eslint-plugin-n@16.0.0)(eslint-plugin-promise@6.1.1)(eslint@8.43.0)(typescript@5.1.3): + resolution: {integrity: sha512-Xa7DY9GgduZyp0qmXxBF0/dB+Vm4/DgWu1lGpNLJV2d46aCaUxTKDEnkzjUWX/1O9S0a+Dhnw7A4oI0JpYzwtw==} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^5.50.0 + eslint: ^8.0.1 + eslint-plugin-import: ^2.25.2 + eslint-plugin-n: ^15.0.0 + eslint-plugin-promise: ^6.0.0 + typescript: '*' + dependencies: + '@typescript-eslint/eslint-plugin': 5.60.0(@typescript-eslint/parser@5.60.0)(eslint@8.43.0)(typescript@5.1.3) + '@typescript-eslint/parser': 5.60.0(eslint@8.43.0)(typescript@5.1.3) + eslint: 8.43.0 + eslint-config-standard: 17.0.0(eslint-plugin-import@2.27.5)(eslint-plugin-n@16.0.0)(eslint-plugin-promise@6.1.1)(eslint@8.43.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.60.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.43.0) + eslint-plugin-n: 16.0.0(eslint@8.43.0) + eslint-plugin-promise: 6.1.1(eslint@8.43.0) + typescript: 5.1.3 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-config-standard@17.0.0(eslint-plugin-import@2.27.5)(eslint-plugin-n@16.0.0)(eslint-plugin-promise@6.1.1)(eslint@8.43.0): + resolution: {integrity: sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==} + peerDependencies: + eslint: ^8.0.1 + eslint-plugin-import: ^2.25.2 + eslint-plugin-n: ^15.0.0 + eslint-plugin-promise: ^6.0.0 + dependencies: + eslint: 8.43.0 + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.60.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.43.0) + eslint-plugin-n: 16.0.0(eslint@8.43.0) + eslint-plugin-promise: 6.1.1(eslint@8.43.0) + dev: true + + /eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + dependencies: + debug: 3.2.7 + is-core-module: 2.13.0 + resolve: 1.22.4 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.60.0)(eslint-plugin-import@2.27.5)(eslint@8.43.0): + resolution: {integrity: sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + dependencies: + debug: 4.3.4(supports-color@5.5.0) + enhanced-resolve: 5.15.0 + eslint: 8.43.0 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.60.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5)(eslint@8.43.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.60.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.43.0) + get-tsconfig: 4.7.0 + globby: 13.2.2 + is-core-module: 2.13.0 + is-glob: 4.0.3 + synckit: 0.8.5 + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.60.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5)(eslint@8.43.0): + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 5.60.0(eslint@8.43.0)(typescript@5.1.3) + debug: 3.2.7 + eslint: 8.43.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.60.0)(eslint-plugin-import@2.27.5)(eslint@8.43.0) + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-es-x@6.2.1(eslint@8.43.0): + resolution: {integrity: sha512-uR34zUhZ9EBoiSD2DdV5kHLpydVEvwWqjteUr9sXRgJknwbKZJZhdJ7uFnaTtd+Nr/2G3ceJHnHXrFhJ67n3Tw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '>=8' + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.43.0) + '@eslint-community/regexpp': 4.6.2 + eslint: 8.43.0 + dev: true + + /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.60.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.43.0): + resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 5.60.0(eslint@8.43.0)(typescript@5.1.3) + array-includes: 3.1.6 + array.prototype.flat: 1.3.1 + array.prototype.flatmap: 1.3.1 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.43.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.60.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5)(eslint@8.43.0) + has: 1.0.3 + is-core-module: 2.13.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.values: 1.1.6 + resolve: 1.22.4 + semver: 6.3.1 + tsconfig-paths: 3.14.2 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-jsx-a11y@6.7.1(eslint@8.43.0): + resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + '@babel/runtime': 7.22.10 + aria-query: 5.3.0 + array-includes: 3.1.6 + array.prototype.flatmap: 1.3.1 + ast-types-flow: 0.0.7 + axe-core: 4.7.2 + axobject-query: 3.2.1 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + eslint: 8.43.0 + has: 1.0.3 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.5 + minimatch: 3.1.2 + object.entries: 1.1.6 + object.fromentries: 2.0.6 + semver: 6.3.1 + dev: true + + /eslint-plugin-n@16.0.0(eslint@8.43.0): + resolution: {integrity: sha512-akkZTE3hsHBrq6CwmGuYCzQREbVUrA855kzcHqe6i0FLBkeY7Y/6tThCVkjUnjhvRBAlc+8lILcSe5QvvDpeZQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + eslint: '>=7.0.0' + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.43.0) + builtins: 5.0.1 + eslint: 8.43.0 + eslint-plugin-es-x: 6.2.1(eslint@8.43.0) + ignore: 5.2.4 + is-core-module: 2.13.0 + minimatch: 3.1.2 + resolve: 1.22.4 + semver: 7.5.4 + dev: true + + /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.8.0)(eslint@8.43.0)(prettier@2.8.8): + resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + eslint: '>=7.28.0' + eslint-config-prettier: '*' + prettier: '>=2.0.0' + peerDependenciesMeta: + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.43.0 + eslint-config-prettier: 8.8.0(eslint@8.43.0) + prettier: 2.8.8 + prettier-linter-helpers: 1.0.0 + dev: true + + /eslint-plugin-promise@6.1.1(eslint@8.43.0): + resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + eslint: 8.43.0 + dev: true + + /eslint-plugin-react-hooks@4.6.0(eslint@8.43.0): + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + dependencies: + eslint: 8.43.0 + dev: true + + /eslint-plugin-react@7.32.2(eslint@8.43.0): + resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + array-includes: 3.1.6 + array.prototype.flatmap: 1.3.1 + array.prototype.tosorted: 1.1.1 + doctrine: 2.1.0 + eslint: 8.43.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.6 + object.fromentries: 2.0.6 + object.hasown: 1.1.2 + object.values: 1.1.6 + prop-types: 15.8.1 + resolve: 2.0.0-next.4 + semver: 6.3.1 + string.prototype.matchall: 4.0.8 + dev: true + + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.43.0: + resolution: {integrity: sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.43.0) + '@eslint-community/regexpp': 4.6.2 + '@eslint/eslintrc': 2.1.2 + '@eslint/js': 8.43.0 + '@humanwhocodes/config-array': 0.11.10 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4(supports-color@5.5.0) + 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.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.21.0 + graphemer: 1.4.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + 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 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) + eslint-visitor-keys: 3.4.3 + dev: true + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /estree-util-attach-comments@2.1.1: + resolution: {integrity: sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==} + dependencies: + '@types/estree': 1.0.1 + dev: true + + /estree-util-build-jsx@2.2.2: + resolution: {integrity: sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==} + dependencies: + '@types/estree-jsx': 1.0.0 + estree-util-is-identifier-name: 2.1.0 + estree-walker: 3.0.3 + dev: true + + /estree-util-is-identifier-name@2.1.0: + resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==} + dev: true + + /estree-util-to-js@1.2.0: + resolution: {integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==} + dependencies: + '@types/estree-jsx': 1.0.0 + astring: 1.8.6 + source-map: 0.7.4 + dev: true + + /estree-util-visit@1.2.1: + resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/unist': 2.0.7 + dev: true + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: true + + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.1 + dev: true + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + /eth-block-tracker@6.1.0: + resolution: {integrity: sha512-K9SY8+/xMBi4M5HHTDdxnpEqEEGjbNpzHFqvxyjMZej8InV/B+CkFRKM6W+uvrFJ7m8Zd1E0qUkseU3vdIDFYQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@metamask/safe-event-emitter': 2.0.0 + '@metamask/utils': 3.6.0 + json-rpc-random-id: 1.0.1 + pify: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /eth-json-rpc-filters@5.1.0: + resolution: {integrity: sha512-fos+9xmoa1A2Ytsc9eYof17r81BjdJOUcGcgZn4K/tKdCCTb+a8ytEtwlu1op5qsXFDlgGmstTELFrDEc89qEQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@metamask/safe-event-emitter': 2.0.0 + async-mutex: 0.2.6 + eth-query: 2.1.2 + json-rpc-engine: 6.1.0 + pify: 5.0.0 + dev: false + + /eth-query@2.1.2: + resolution: {integrity: sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==} + dependencies: + json-rpc-random-id: 1.0.1 + xtend: 4.0.2 + dev: false + + /eth-rpc-errors@4.0.2: + resolution: {integrity: sha512-n+Re6Gu8XGyfFy1it0AwbD1x0MUzspQs0D5UiPs1fFPCr6WAwZM+vbIhXheBFrpgosqN9bs5PqlB4Q61U/QytQ==} + dependencies: + fast-safe-stringify: 2.1.1 + dev: false + + /ethereum-cryptography@2.1.2: + resolution: {integrity: sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==} + dependencies: + '@noble/curves': 1.1.0 + '@noble/hashes': 1.3.1 + '@scure/bip32': 1.3.1 + '@scure/bip39': 1.2.1 + dev: false + + /ethers@5.7.2: + resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/contracts': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/json-wallets': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/providers': 5.7.2 + '@ethersproject/random': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/solidity': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/units': 5.7.0 + '@ethersproject/wallet': 5.7.0 + '@ethersproject/web': 5.7.1 + '@ethersproject/wordlists': 5.7.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /ethers@6.6.1: + resolution: {integrity: sha512-bjNPf/EU4l1jQlAslOmOlyHqjOnM0W7LRPuSf0Kt0tYV4RpUEZsdGWDhvFXfogIhfzXJ/v2tPz4HqXwBt5T8mA==} + engines: {node: '>=14.0.0'} + dependencies: + '@adraffy/ens-normalize': 1.9.2 + '@noble/hashes': 1.1.2 + '@noble/secp256k1': 1.7.1 + '@types/node': 18.15.13 + aes-js: 4.0.0-beta.5 + tslib: 2.4.0 + ws: 8.5.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + dev: true + + /eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + dev: false + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + /execa@7.1.1: + resolution: {integrity: sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + dev: false + + /execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: true + + /external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + dev: false + + /eyes@0.1.8: + resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} + engines: {node: '> 0.1.90'} + dev: false + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + dev: true + + /fast-fifo@1.3.0: + resolution: {integrity: sha512-IgfweLvEpwyA4WgiQe9Nx6VV2QkML2NkvZnk1oKnIzXgXdWxuhF7zw4DvLTPZJn6PIUneiAXPF24QmoEqHTjyw==} + dev: true + + /fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + /fast-redact@3.3.0: + resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} + engines: {node: '>=6'} + dev: false + + /fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + dev: false + + /fast-stable-stringify@1.0.0: + resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} + dev: false + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + + /fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.2.1 + + /figures@5.0.0: + resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} + engines: {node: '>=14'} + dependencies: + escape-string-regexp: 5.0.0 + is-unicode-supported: 1.3.0 + dev: false + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.0.4 + dev: true + + /file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + dev: false + + /files-from-path@0.2.6: + resolution: {integrity: sha512-Mz4UNkv+WcRLxcCXAORbfpwYiXI60SN9C1ZfeyGFv0xQUmblgbOkSWwFwX+Ov/TaR3FEyzwDyPnCQjpPRGSxKA==} + dependencies: + err-code: 3.0.1 + graceful-fs: 4.2.11 + ipfs-unixfs: 6.0.9 + it-glob: 0.0.13 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + + /filter-obj@1.1.0: + resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} + engines: {node: '>=0.10.0'} + dev: false + + /filter-obj@5.1.0: + resolution: {integrity: sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==} + engines: {node: '>=14.16'} + dev: true + + /find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + dev: true + + /find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + dependencies: + locate-path: 2.0.0 + dev: false + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache@3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.7 + rimraf: 3.0.2 + dev: true + + /flatted@3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + dev: true + + /follow-redirects@1.15.2: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: false + + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + + /form-data-encoder@2.1.4: + resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} + engines: {node: '>= 14.17'} + dev: false + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + dependencies: + fetch-blob: 3.2.0 + + /fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + dev: true + + /fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: false + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + + /function.prototype.name@1.1.5: + resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + functions-have-names: 1.2.3 + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: false + + /get-func-name@2.0.0: + resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + dev: true + + /get-intrinsic@1.2.1: + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-proto: 1.0.1 + has-symbols: 1.0.3 + + /get-iterator@1.0.2: + resolution: {integrity: sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg==} + dev: true + + /get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + dev: false + + /get-pkg-repo@4.2.1: + resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} + engines: {node: '>=6.9.0'} + hasBin: true + dependencies: + '@hutson/parse-repository-url': 3.0.2 + hosted-git-info: 4.1.0 + through2: 2.0.5 + yargs: 16.2.0 + dev: false + + /get-port@6.1.2: + resolution: {integrity: sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + /get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + + /get-tsconfig@4.7.0: + resolution: {integrity: sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==} + dependencies: + resolve-pkg-maps: 1.0.0 + dev: true + + /get-uri@6.0.1: + resolution: {integrity: sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==} + engines: {node: '>= 14'} + dependencies: + basic-ftp: 5.0.3 + data-uri-to-buffer: 5.0.1 + debug: 4.3.4(supports-color@5.5.0) + fs-extra: 8.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /git-raw-commits@3.0.0: + resolution: {integrity: sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw==} + engines: {node: '>=14'} + hasBin: true + dependencies: + dargs: 7.0.0 + meow: 8.1.2 + split2: 3.2.2 + dev: false + + /git-remote-origin-url@2.0.0: + resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} + engines: {node: '>=4'} + dependencies: + gitconfiglocal: 1.0.0 + pify: 2.3.0 + dev: false + + /git-semver-tags@5.0.1: + resolution: {integrity: sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA==} + engines: {node: '>=14'} + hasBin: true + dependencies: + meow: 8.1.2 + semver: 7.5.4 + dev: false + + /git-up@7.0.0: + resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} + dependencies: + is-ssh: 1.4.0 + parse-url: 8.1.0 + dev: false + + /git-url-parse@13.1.0: + resolution: {integrity: sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==} + dependencies: + git-up: 7.0.0 + dev: false + + /gitconfiglocal@1.0.0: + resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} + dependencies: + ini: 1.3.8 + dev: false + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-regex@0.3.2: + resolution: {integrity: sha512-m5blUd3/OqDTWwzBBtWBPrGlAzatRywHameHeekAZyZrskYouOGdNB8T/q6JucucvJXtOuyHIn0/Yia7iDasDw==} + dev: true + + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + dev: true + + /glob@7.1.6: + resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /global-dirs@3.0.1: + resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} + engines: {node: '>=10'} + dependencies: + ini: 2.0.0 + dev: false + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + /globals@13.21.0: + resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.0 + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.1 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /globby@13.1.4: + resolution: {integrity: sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.3.1 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 4.0.0 + dev: false + + /globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.3.1 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 4.0.0 + dev: true + + /globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + dev: true + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.1 + + /got@12.6.1: + resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} + engines: {node: '>=14.16'} + dependencies: + '@sindresorhus/is': 5.6.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.13 + decompress-response: 6.0.0 + form-data-encoder: 2.1.4 + get-stream: 6.0.1 + http2-wrapper: 2.2.0 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + dev: false + + /graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + dev: false + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + /grapheme-splitter@1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + dev: true + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /graz@0.0.43(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-cLHdOeYxwyvU8c/9eByK5m23XJH4L3mwZU58OIehNwnBGGF2kQQ0TyAviZ8XH+EPhgp/bzVOvgX+e/8FvwzxHg==} + hasBin: true + peerDependencies: + react: '>=17' + dependencies: + '@cosmjs/cosmwasm-stargate': 0.30.1 + '@cosmjs/launchpad': 0.27.1 + '@cosmjs/proto-signing': 0.30.1 + '@cosmjs/stargate': 0.30.1 + '@cosmjs/tendermint-rpc': 0.30.1 + '@keplr-wallet/cosmos': 0.11.64 + '@keplr-wallet/types': 0.11.64 + '@tanstack/react-query': 4.32.6(react-dom@18.2.0)(react@18.2.0) + '@tanstack/react-query-devtools': 4.32.6(@tanstack/react-query@4.32.6)(react-dom@18.2.0)(react@18.2.0) + '@walletconnect/sign-client': 2.10.0 + '@walletconnect/types': 2.10.0 + '@walletconnect/utils': 2.10.0 + '@web3modal/standalone': 2.4.3(react@18.2.0) + arg: 5.0.2 + cosmos-directory-client: 0.0.6 + react: 18.2.0 + zustand: 4.4.1(@types/react@18.2.14)(react@18.2.0) + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - '@types/react' + - bufferutil + - debug + - immer + - lokijs + - react-dom + - react-native + - utf-8-validate + dev: false + + /hamt-sharding@2.0.1: + resolution: {integrity: sha512-vnjrmdXG9dDs1m/H4iJ6z0JFI2NtgsW5keRkTcM85NGak69Mkf5PHUqBz+Xs0T4sg0ppvj9O5EGAJo40FTxmmA==} + engines: {node: '>=10.0.0', npm: '>=6.0.0'} + dependencies: + sparse-array: 1.3.2 + uint8arrays: 3.1.1 + dev: true + + /handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.17.4 + dev: false + + /hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /has-property-descriptors@1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + dependencies: + get-intrinsic: 1.2.1 + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + /has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + + /has-yarn@3.0.0: + resolution: {integrity: sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + + /hash-base@3.1.0: + resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} + engines: {node: '>=4'} + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + safe-buffer: 5.2.1 + dev: false + + /hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: false + + /hast-util-from-parse5@7.1.2: + resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==} + dependencies: + '@types/hast': 2.3.5 + '@types/unist': 2.0.7 + hastscript: 7.2.0 + property-information: 6.2.0 + vfile: 5.3.7 + vfile-location: 4.1.0 + web-namespaces: 2.0.1 + dev: true + + /hast-util-parse-selector@3.1.1: + resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} + dependencies: + '@types/hast': 2.3.5 + dev: true + + /hast-util-raw@7.2.3: + resolution: {integrity: sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==} + dependencies: + '@types/hast': 2.3.5 + '@types/parse5': 6.0.3 + hast-util-from-parse5: 7.1.2 + hast-util-to-parse5: 7.1.0 + html-void-elements: 2.0.1 + parse5: 6.0.1 + unist-util-position: 4.0.4 + unist-util-visit: 4.1.2 + vfile: 5.3.7 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + dev: true + + /hast-util-to-estree@2.3.3: + resolution: {integrity: sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==} + dependencies: + '@types/estree': 1.0.1 + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.5 + '@types/unist': 2.0.7 + comma-separated-tokens: 2.0.3 + estree-util-attach-comments: 2.1.1 + estree-util-is-identifier-name: 2.1.0 + hast-util-whitespace: 2.0.1 + mdast-util-mdx-expression: 1.3.2 + mdast-util-mdxjs-esm: 1.3.1 + property-information: 6.2.0 + space-separated-tokens: 2.0.2 + style-to-object: 0.4.2 + unist-util-position: 4.0.4 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + dev: true + + /hast-util-to-parse5@7.1.0: + resolution: {integrity: sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==} + dependencies: + '@types/hast': 2.3.5 + comma-separated-tokens: 2.0.3 + property-information: 6.2.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + dev: true + + /hast-util-whitespace@2.0.1: + resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} + dev: true + + /hastscript@7.2.0: + resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} + dependencies: + '@types/hast': 2.3.5 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 3.1.1 + property-information: 6.2.0 + space-separated-tokens: 2.0.2 + dev: true + + /hey-listen@1.0.8: + resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} + dev: false + + /history@5.3.0: + resolution: {integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==} + dependencies: + '@babel/runtime': 7.22.10 + dev: true + + /hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + dev: false + + /hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + dependencies: + react-is: 16.13.1 + + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + /hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + + /html-void-elements@2.0.1: + resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} + dev: true + + /http-assert@1.5.0: + resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} + engines: {node: '>= 0.8'} + dependencies: + deep-equal: 1.0.1 + http-errors: 1.8.1 + dev: true + + /http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + dev: false + + /http-errors@1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 1.5.0 + toidentifier: 1.0.1 + dev: true + + /http-proxy-agent@7.0.0: + resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + dev: false + + /http2-wrapper@2.2.0: + resolution: {integrity: sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==} + engines: {node: '>=10.19.0'} + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + dev: false + + /https-proxy-agent@7.0.1: + resolution: {integrity: sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + dev: false + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + /human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + + /humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + dependencies: + ms: 2.1.3 + dev: false + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /idb-keyval@6.2.1: + resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} + dev: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + + /immer@9.0.21: + resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + dev: false + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + /import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + dev: false + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: false + + /ini@2.0.0: + resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} + engines: {node: '>=10'} + dev: false + + /inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + dev: true + + /inquirer@9.2.6: + resolution: {integrity: sha512-y71l237eJJKS4rl7sQcEUiMhrR0pB/ZnRMMTxLpjJhWL4hdWCT03a6jJnC1w6qIPSRZWEozuieGt3v7XaEJYFw==} + engines: {node: '>=14.18.0'} + dependencies: + ansi-escapes: 4.3.2 + chalk: 5.2.0 + cli-cursor: 3.1.0 + cli-width: 4.1.0 + external-editor: 3.1.0 + figures: 5.0.0 + lodash: 4.17.21 + mute-stream: 1.0.0 + ora: 5.4.1 + run-async: 3.0.0 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + wrap-ansi: 6.2.0 + dev: false + + /interface-blockstore@2.0.3: + resolution: {integrity: sha512-OwVUnlNcx7H5HloK0Myv6c/C1q9cNG11HX6afdeU6q6kbuNj8jKCwVnmJHhC94LZaJ+9hvVOk4IUstb3Esg81w==} + dependencies: + interface-store: 2.0.2 + multiformats: 9.9.0 + dev: true + + /interface-datastore@6.1.1: + resolution: {integrity: sha512-AmCS+9CT34pp2u0QQVXjKztkuq3y5T+BIciuiHDDtDZucZD8VudosnSdUyXJV6IsRkN5jc4RFDhCk1O6Q3Gxjg==} + dependencies: + interface-store: 2.0.2 + nanoid: 3.3.6 + uint8arrays: 3.1.1 + dev: true + + /interface-store@2.0.2: + resolution: {integrity: sha512-rScRlhDcz6k199EkHqT8NpM87ebN89ICOzILoBHgaG36/WX50N32BnU/kpZgCGPLhARRAWUUX5/cyaIjt7Kipg==} + dev: true + + /internal-slot@1.0.5: + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.1 + has: 1.0.3 + side-channel: 1.0.4 + + /internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + dev: false + + /internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + dev: false + + /interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + dev: false + + /intl-messageformat@10.5.0: + resolution: {integrity: sha512-AvojYuOaRb6r2veOKfTVpxH9TrmjSdc5iR9R5RgBwrDZYSmAAFVT+QLbW3C4V7Qsg0OguMp67Q/EoUkxZzXRGw==} + dependencies: + '@formatjs/ecma402-abstract': 1.17.0 + '@formatjs/fast-memoize': 2.2.0 + '@formatjs/icu-messageformat-parser': 2.6.0 + tslib: 2.6.1 + dev: false + + /invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /ip-regex@4.3.0: + resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} + engines: {node: '>=8'} + dev: true + + /ip@1.1.8: + resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} + dev: false + + /ip@2.0.0: + resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} + dev: false + + /ipfs-car@0.7.0(node-fetch@3.3.1): + resolution: {integrity: sha512-9ser6WWZ1ZMTCGbcVkRXUzOrpQ4SIiLfzIEnk+3LQsXbV09yeZg3ijhRuEXozEIYE68Go9JmOFshamsK9iKlNQ==} + hasBin: true + dependencies: + '@ipld/car': 3.2.4 + '@web-std/blob': 3.0.4 + bl: 5.1.0 + blockstore-core: 1.0.5 + browser-readablestream-to-it: 1.0.3 + idb-keyval: 6.2.1 + interface-blockstore: 2.0.3 + ipfs-core-types: 0.8.4(node-fetch@3.3.1) + ipfs-core-utils: 0.12.2(node-fetch@3.3.1) + ipfs-unixfs-exporter: 7.0.11 + ipfs-unixfs-importer: 9.0.10 + ipfs-utils: 9.0.14 + it-all: 1.0.6 + it-last: 1.0.6 + it-pipe: 1.1.0 + meow: 9.0.0 + move-file: 2.1.0 + multiformats: 9.9.0 + stream-to-it: 0.2.4 + streaming-iterables: 6.2.0 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - encoding + - node-fetch + - supports-color + dev: true + + /ipfs-core-types@0.8.4(node-fetch@3.3.1): + resolution: {integrity: sha512-sbRZA1QX3xJ6ywTiVQZMOxhlhp4osAZX2SXx3azOLxAtxmGWDMkHYt722VV4nZ2GyJy8qyk5GHQIZ0uvQnpaTg==} + deprecated: js-IPFS has been deprecated in favour of Helia - please see https://github.com/ipfs/js-ipfs/issues/4336 for details + dependencies: + interface-datastore: 6.1.1 + multiaddr: 10.0.1(node-fetch@3.3.1) + multiformats: 9.9.0 + transitivePeerDependencies: + - node-fetch + - supports-color + dev: true + + /ipfs-core-utils@0.12.2(node-fetch@3.3.1): + resolution: {integrity: sha512-RfxP3rPhXuqKIUmTAUhmee6fmaV3A7LMnjOUikRKpSyqESz/DR7aGK7tbttMxkZdkSEr0rFXlqbyb0vVwmn0wQ==} + deprecated: js-IPFS has been deprecated in favour of Helia - please see https://github.com/ipfs/js-ipfs/issues/4336 for details + dependencies: + any-signal: 2.1.2 + blob-to-it: 1.0.4 + browser-readablestream-to-it: 1.0.3 + debug: 4.3.4(supports-color@5.5.0) + err-code: 3.0.1 + ipfs-core-types: 0.8.4(node-fetch@3.3.1) + ipfs-unixfs: 6.0.9 + ipfs-utils: 9.0.14 + it-all: 1.0.6 + it-map: 1.0.6 + it-peekable: 1.0.3 + it-to-stream: 1.0.0 + merge-options: 3.0.4 + multiaddr: 10.0.1(node-fetch@3.3.1) + multiaddr-to-uri: 8.0.0(node-fetch@3.3.1) + multiformats: 9.9.0 + nanoid: 3.3.6 + parse-duration: 1.1.0 + timeout-abort-controller: 1.1.1 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - encoding + - node-fetch + - supports-color + dev: true + + /ipfs-unixfs-exporter@7.0.11: + resolution: {integrity: sha512-qTYa69J7HbI2EIYNUddKPg9Y3rHkYZV0bNdmzZKA5+ZbwRVoUEuBW/cguEqTp22zHygh3sMnzYZFm0naVIdMgQ==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + '@ipld/dag-cbor': 7.0.3 + '@ipld/dag-pb': 2.1.18 + '@multiformats/murmur3': 1.1.3 + err-code: 3.0.1 + hamt-sharding: 2.0.1 + interface-blockstore: 2.0.3 + ipfs-unixfs: 6.0.9 + it-last: 1.0.6 + multiformats: 9.9.0 + uint8arrays: 3.1.1 + dev: true + + /ipfs-unixfs-importer@9.0.10: + resolution: {integrity: sha512-W+tQTVcSmXtFh7FWYWwPBGXJ1xDgREbIyI1E5JzDcimZLIyT5gGMfxR3oKPxxWj+GKMpP5ilvMQrbsPzWcm3Fw==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + '@ipld/dag-pb': 2.1.18 + '@multiformats/murmur3': 1.1.3 + bl: 5.1.0 + err-code: 3.0.1 + hamt-sharding: 2.0.1 + interface-blockstore: 2.0.3 + ipfs-unixfs: 6.0.9 + it-all: 1.0.6 + it-batch: 1.0.9 + it-first: 1.0.7 + it-parallel-batch: 1.0.11 + merge-options: 3.0.4 + multiformats: 9.9.0 + rabin-wasm: 0.1.5 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /ipfs-unixfs@6.0.9: + resolution: {integrity: sha512-0DQ7p0/9dRB6XCb0mVCTli33GzIzSVx5udpJuVM47tGcD+W+Bl4LsnoLswd3ggNnNEakMv1FdoFITiEnchXDqQ==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + err-code: 3.0.1 + protobufjs: 6.11.4 + dev: true + + /ipfs-utils@9.0.14: + resolution: {integrity: sha512-zIaiEGX18QATxgaS0/EOQNoo33W0islREABAcxXE8n7y2MGAlB+hdsxXn4J0hGZge8IqVQhW8sWIb+oJz2yEvg==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + any-signal: 3.0.1 + browser-readablestream-to-it: 1.0.3 + buffer: 6.0.3 + electron-fetch: 1.9.1 + err-code: 3.0.1 + is-electron: 2.2.2 + iso-url: 1.2.1 + it-all: 1.0.6 + it-glob: 1.0.2 + it-to-stream: 1.0.0 + merge-options: 3.0.4 + nanoid: 3.3.6 + native-fetch: 3.0.0(node-fetch@2.6.12) + node-fetch: 2.6.12 + react-native-fetch-api: 3.0.0 + stream-to-it: 0.2.4 + transitivePeerDependencies: + - encoding + dev: true + + /ipns@0.16.0: + resolution: {integrity: sha512-fBYkRjN3/fc6IQujUF4WBEyOXegK715w+wx9IErV6H2B5JXsMnHOBceUKn3L90dj+wJfHs6T+hM/OZiTT6mQCw==} + dependencies: + cborg: 1.10.2 + debug: 4.3.4(supports-color@5.5.0) + err-code: 3.0.1 + interface-datastore: 6.1.1 + libp2p-crypto: 0.21.2 + long: 4.0.0 + multiformats: 9.9.0 + peer-id: 0.16.0 + protobufjs: 6.11.4 + timestamp-nano: 1.0.1 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + dev: true + + /is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + dev: true + + /is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + + /is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-typed-array: 1.1.12 + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + /is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: false + + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + + /is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + dev: true + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + /is-ci@3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + dependencies: + ci-info: 3.8.0 + dev: false + + /is-core-module@2.13.0: + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + dependencies: + has: 1.0.3 + + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + + /is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + dev: true + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + /is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + /is-electron@2.2.2: + resolution: {integrity: sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==} + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + dev: true + + /is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + dependencies: + is-docker: 3.0.0 + + /is-installed-globally@0.4.0: + resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} + engines: {node: '>=10'} + dependencies: + global-dirs: 3.0.1 + is-path-inside: 3.0.3 + dev: false + + /is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + dev: false + + /is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + dev: false + + /is-ip@3.1.0: + resolution: {integrity: sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==} + engines: {node: '>=8'} + dependencies: + ip-regex: 4.3.0 + dev: true + + /is-map@2.0.2: + resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + dev: false + + /is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + dev: true + + /is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + + /is-npm@6.0.0: + resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + /is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + dev: false + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + /is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + /is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + dev: true + + /is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + dev: true + + /is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + dev: false + + /is-reference@3.0.1: + resolution: {integrity: sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w==} + dependencies: + '@types/estree': 1.0.1 + dev: true + + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + + /is-set@2.0.2: + resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + dev: false + + /is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.2 + + /is-ssh@1.4.0: + resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} + dependencies: + protocols: 2.0.1 + dev: false + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + + /is-text-path@1.0.1: + resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} + engines: {node: '>=0.10.0'} + dependencies: + text-extensions: 1.9.0 + dev: false + + /is-typed-array@1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.11 + + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + dev: false + + /is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + dev: false + + /is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + dev: false + + /is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.2 + + /is-what@4.1.15: + resolution: {integrity: sha512-uKua1wfy3Yt+YqsD6mTUEa2zSi3G1oPlqTflgaPJ7z63vUGN5pxFpnQfeSLMFnJDEsdvOtkp1rUWkYjB4YfhgA==} + engines: {node: '>=12.13'} + dev: false + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + + /is-yarn-global@0.4.1: + resolution: {integrity: sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==} + engines: {node: '>=12'} + dev: false + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: false + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /iso-random-stream@2.0.2: + resolution: {integrity: sha512-yJvs+Nnelic1L2vH2JzWvvPQFA4r7kSTnpST/+LkAQjSz0hos2oqLD+qIVi9Qk38Hoe7mNDt3j0S27R58MVjLQ==} + engines: {node: '>=10'} + dependencies: + events: 3.3.0 + readable-stream: 3.6.2 + dev: true + + /iso-url@1.2.1: + resolution: {integrity: sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng==} + engines: {node: '>=12'} + dev: true + + /isomorphic-ws@4.0.1(ws@7.5.9): + resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} + peerDependencies: + ws: '*' + dependencies: + ws: 7.5.9 + dev: false + + /isomorphic-ws@5.0.0(ws@8.12.0): + resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} + peerDependencies: + ws: '*' + dependencies: + ws: 8.12.0 + dev: false + + /issue-parser@6.0.0: + resolution: {integrity: sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==} + engines: {node: '>=10.13'} + dependencies: + lodash.capitalize: 4.2.1 + lodash.escaperegexp: 4.1.2 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.uniqby: 4.7.0 + dev: false + + /it-all@1.0.6: + resolution: {integrity: sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A==} + dev: true + + /it-batch@1.0.9: + resolution: {integrity: sha512-7Q7HXewMhNFltTsAMdSz6luNhyhkhEtGGbYek/8Xb/GiqYMtwUmopE1ocPSiJKKp3rM4Dt045sNFoUu+KZGNyA==} + dev: true + + /it-drain@1.0.5: + resolution: {integrity: sha512-r/GjkiW1bZswC04TNmUnLxa6uovme7KKwPhc+cb1hHU65E3AByypHH6Pm91WHuvqfFsm+9ws0kPtDBV3/8vmIg==} + dev: true + + /it-filter@1.0.3: + resolution: {integrity: sha512-EI3HpzUrKjTH01miLHWmhNWy3Xpbx4OXMXltgrNprL5lDpF3giVpHIouFpr5l+evXw6aOfxhnt01BIB+4VQA+w==} + dev: true + + /it-first@1.0.7: + resolution: {integrity: sha512-nvJKZoBpZD/6Rtde6FXqwDqDZGF1sCADmr2Zoc0hZsIvnE449gRFnGctxDf09Bzc/FWnHXAdaHVIetY6lrE0/g==} + dev: true + + /it-glob@0.0.13: + resolution: {integrity: sha512-0Hcd5BraJUPzL28NWiFbdNrcdyNxNTKKdU3sjdFiYynNTQpwlG2UKW31X7bp+XhJwux/oPzIquo5ioztVmc2RQ==} + dependencies: + '@types/minimatch': 3.0.5 + minimatch: 3.1.2 + dev: true + + /it-glob@1.0.2: + resolution: {integrity: sha512-Ch2Dzhw4URfB9L/0ZHyY+uqOnKvBNeS/SMcRiPmJfpHiM0TsUZn+GkpcZxAoF3dJVdPm/PuIk3A4wlV7SUo23Q==} + dependencies: + '@types/minimatch': 3.0.5 + minimatch: 3.1.2 + dev: true + + /it-last@1.0.6: + resolution: {integrity: sha512-aFGeibeiX/lM4bX3JY0OkVCFkAw8+n9lkukkLNivbJRvNz8lI3YXv5xcqhFUV2lDJiraEK3OXRDbGuevnnR67Q==} + dev: true + + /it-map@1.0.6: + resolution: {integrity: sha512-XT4/RM6UHIFG9IobGlQPFQUrlEKkU4eBUFG3qhWhfAdh1JfF2x11ShCrKCdmZ0OiZppPfoLuzcfA4cey6q3UAQ==} + dev: true + + /it-parallel-batch@1.0.11: + resolution: {integrity: sha512-UWsWHv/kqBpMRmyZJzlmZeoAMA0F3SZr08FBdbhtbe+MtoEBgr/ZUAKrnenhXCBrsopy76QjRH2K/V8kNdupbQ==} + dependencies: + it-batch: 1.0.9 + dev: true + + /it-peekable@1.0.3: + resolution: {integrity: sha512-5+8zemFS+wSfIkSZyf0Zh5kNN+iGyccN02914BY4w/Dj+uoFEoPSvj5vaWn8pNZJNSxzjW0zHRxC3LUb2KWJTQ==} + dev: true + + /it-pipe@1.1.0: + resolution: {integrity: sha512-lF0/3qTVeth13TOnHVs0BTFaziwQF7m5Gg+E6JV0BXcLKutC92YjSi7bASgkPOXaLEb+YvNZrPorGMBIJvZfxg==} + dev: true + + /it-take@1.0.2: + resolution: {integrity: sha512-u7I6qhhxH7pSevcYNaMECtkvZW365ARqAIt9K+xjdK1B2WUDEjQSfETkOCT8bxFq/59LqrN3cMLUtTgmDBaygw==} + dev: true + + /it-to-stream@1.0.0: + resolution: {integrity: sha512-pLULMZMAB/+vbdvbZtebC0nWBTbG581lk6w8P7DfIIIKUfa8FbY7Oi0FxZcFPbxvISs7A9E+cMpLDBc1XhpAOA==} + dependencies: + buffer: 6.0.3 + fast-fifo: 1.3.0 + get-iterator: 1.0.2 + p-defer: 3.0.0 + p-fifo: 1.0.0 + readable-stream: 3.6.2 + dev: true + + /iterate-iterator@1.0.2: + resolution: {integrity: sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==} + dev: false + + /iterate-value@1.0.2: + resolution: {integrity: sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==} + dependencies: + es-get-iterator: 1.1.3 + iterate-iterator: 1.0.2 + dev: false + + /jayson@4.1.0: + resolution: {integrity: sha512-R6JlbyLN53Mjku329XoRT2zJAE6ZgOQ8f91ucYdMCD4nkGCF9kZSrcGXpHIU4jeKj58zUZke2p+cdQchU7Ly7A==} + engines: {node: '>=8'} + hasBin: true + dependencies: + '@types/connect': 3.4.35 + '@types/node': 12.20.55 + '@types/ws': 7.4.7 + JSONStream: 1.3.5 + commander: 2.20.3 + delay: 5.0.0 + es6-promisify: 5.0.0 + eyes: 0.1.8 + isomorphic-ws: 4.0.1(ws@7.5.9) + json-stringify-safe: 5.0.1 + uuid: 8.3.2 + ws: 7.5.9 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 20.3.1 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + dev: false + + /js-string-escape@1.0.1: + resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} + engines: {node: '>= 0.8'} + dev: true + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: false + + /json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + dev: false + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + /json-rpc-engine@6.1.0: + resolution: {integrity: sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==} + engines: {node: '>=10.0.0'} + dependencies: + '@metamask/safe-event-emitter': 2.0.0 + eth-rpc-errors: 4.0.2 + dev: false + + /json-rpc-random-id@1.0.1: + resolution: {integrity: sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==} + dev: false + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + dev: false + + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: false + + /jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + dev: false + + /jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + dependencies: + array-includes: 3.1.6 + array.prototype.flat: 1.3.1 + object.assign: 4.1.4 + object.values: 1.1.6 + dev: true + + /keccak@3.0.3: + resolution: {integrity: sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==} + engines: {node: '>=10.0.0'} + requiresBuild: true + dependencies: + node-addon-api: 2.0.2 + node-gyp-build: 4.6.0 + readable-stream: 3.6.2 + dev: false + + /keygrip@1.1.0: + resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} + engines: {node: '>= 0.6'} + dependencies: + tsscmp: 1.0.6 + dev: true + + /keyv@4.5.3: + resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} + dependencies: + json-buffer: 3.0.1 + dev: false + + /keyvaluestorage-interface@1.0.0: + resolution: {integrity: sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==} + dev: false + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + /kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + dev: true + + /koa-compose@4.1.0: + resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} + dev: true + + /koa-connect@2.1.0: + resolution: {integrity: sha512-O9pcFafHk0oQsBevlbTBlB9co+2RUQJ4zCzu3qJPmGlGoeEZkne+7gWDkecqDPSbCtED6LmhlQladxs6NjOnMQ==} + dev: true + + /koa-convert@2.0.0: + resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} + engines: {node: '>= 10'} + dependencies: + co: 4.6.0 + koa-compose: 4.1.0 + dev: true + + /koa@2.14.2: + resolution: {integrity: sha512-VFI2bpJaodz6P7x2uyLiX6RLYpZmOJqNmoCst/Yyd7hQlszyPwG/I9CQJ63nOtKSxpt5M7NH67V6nJL2BwCl7g==} + engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} + dependencies: + accepts: 1.3.8 + cache-content-type: 1.0.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookies: 0.8.0 + debug: 4.3.4(supports-color@5.5.0) + delegates: 1.0.0 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + fresh: 0.5.2 + http-assert: 1.5.0 + http-errors: 1.8.1 + is-generator-function: 1.0.10 + koa-compose: 4.1.0 + koa-convert: 2.0.0 + on-finished: 2.4.1 + only: 0.0.2 + parseurl: 1.3.3 + statuses: 1.5.0 + type-is: 1.6.18 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /language-subtag-registry@0.3.22: + resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} + dev: true + + /language-tags@1.0.5: + resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==} + dependencies: + language-subtag-registry: 0.3.22 + dev: true + + /latest-version@7.0.0: + resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} + engines: {node: '>=14.16'} + dependencies: + package-json: 8.1.1 + dev: false + + /levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + dev: false + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /libp2p-crypto@0.21.2: + resolution: {integrity: sha512-EXFrhSpiHtJ+/L8xXDvQNK5VjUMG51u878jzZcaT5XhuN/zFg6PWJFnl/qB2Y2j7eMWnvCRP7Kp+ua2H36cG4g==} + engines: {node: '>=12.0.0'} + dependencies: + '@noble/ed25519': 1.7.3 + '@noble/secp256k1': 1.7.1 + err-code: 3.0.1 + iso-random-stream: 2.0.2 + multiformats: 9.9.0 + node-forge: 1.3.1 + protobufjs: 6.11.4 + uint8arrays: 3.1.1 + dev: true + + /libsodium-sumo@0.7.11: + resolution: {integrity: sha512-bY+7ph7xpk51Ez2GbE10lXAQ5sJma6NghcIDaSPbM/G9elfrjLa0COHl/7P6Wb/JizQzl5UQontOOP1z0VwbLA==} + dev: false + + /libsodium-wrappers-sumo@0.7.11: + resolution: {integrity: sha512-DGypHOmJbB1nZn89KIfGOAkDgfv5N6SBGC3Qvmy/On0P0WD1JQvNRS/e3UL3aFF+xC0m+MYz5M+MnRnK2HMrKQ==} + dependencies: + libsodium-sumo: 0.7.11 + dev: false + + /libsodium-wrappers@0.7.11: + resolution: {integrity: sha512-SrcLtXj7BM19vUKtQuyQKiQCRJPgbpauzl3s0rSwD+60wtHqSUuqcoawlMDheCJga85nKOQwxNYQxf/CKAvs6Q==} + dependencies: + libsodium: 0.7.11 + dev: false + + /libsodium@0.7.11: + resolution: {integrity: sha512-WPfJ7sS53I2s4iM58QxY3Inb83/6mjlYgcmZs7DJsvDlnmVUwNinBCi5vBT43P6bHRy01O4zsMU2CoVR6xJ40A==} + dev: false + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + /lit-element@3.3.3: + resolution: {integrity: sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==} + dependencies: + '@lit-labs/ssr-dom-shim': 1.1.1 + '@lit/reactive-element': 1.6.3 + lit-html: 2.8.0 + dev: false + + /lit-html@2.8.0: + resolution: {integrity: sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==} + dependencies: + '@types/trusted-types': 2.0.3 + dev: false + + /lit@2.7.5: + resolution: {integrity: sha512-i/cH7Ye6nBDUASMnfwcictBnsTN91+aBjXoTHF2xARghXScKxpD4F4WYI+VLXg9lqbMinDfvoI7VnZXjyHgdfQ==} + dependencies: + '@lit/reactive-element': 1.6.3 + lit-element: 3.3.3 + lit-html: 2.8.0 + dev: false + + /load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + dev: false + + /loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + dev: true + + /local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: true + + /locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + dev: false + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.capitalize@4.2.1: + resolution: {integrity: sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==} + dev: false + + /lodash.escaperegexp@4.1.2: + resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} + dev: false + + /lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + dev: false + + /lodash.ismatch@4.4.0: + resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} + dev: false + + /lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + dev: false + + /lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + dev: false + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash.uniqby@4.7.0: + resolution: {integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==} + dev: false + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + /log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + dev: false + + /log-symbols@5.1.0: + resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} + engines: {node: '>=12'} + dependencies: + chalk: 5.2.0 + is-unicode-supported: 1.3.0 + dev: false + + /long@4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + + /long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + dev: false + + /longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + dev: true + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + + /loupe@2.3.6: + resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + dependencies: + get-func-name: 2.0.0 + dev: true + + /lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + dev: false + + /luxon@3.3.0: + resolution: {integrity: sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==} + engines: {node: '>=12'} + dev: false + + /macos-release@3.2.0: + resolution: {integrity: sha512-fSErXALFNsnowREYZ49XCdOHF8wOPWuFOGQrAhP7x5J/BqQv+B02cNsTykGpDgRVx43EKg++6ANmTaGTtW+hUA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /magic-string@0.27.0: + resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /magic-string@0.30.2: + resolution: {integrity: sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.1 + dev: true + + /map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + /map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + + /markdown-extensions@1.1.1: + resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==} + engines: {node: '>=0.10.0'} + dev: true + + /markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + dev: true + + /match-sorter@6.3.1: + resolution: {integrity: sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==} + dependencies: + '@babel/runtime': 7.22.10 + remove-accents: 0.4.2 + dev: false + + /math-expression-evaluator@1.4.0: + resolution: {integrity: sha512-4vRUvPyxdO8cWULGTh9dZWL2tZK6LDBvj+OGHBER7poH9Qdt7kXEoj20wiz4lQUbUXQZFjPbe5mVDo9nutizCw==} + dev: false + + /md5-hex@3.0.1: + resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==} + engines: {node: '>=8'} + dependencies: + blueimp-md5: 2.19.0 + dev: true + + /md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: false + + /mdast-util-definitions@5.1.2: + resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} + dependencies: + '@types/mdast': 3.0.12 + '@types/unist': 2.0.7 + unist-util-visit: 4.1.2 + dev: true + + /mdast-util-find-and-replace@2.2.2: + resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} + dependencies: + '@types/mdast': 3.0.12 + escape-string-regexp: 5.0.0 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + dev: true + + /mdast-util-from-markdown@1.3.1: + resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} + dependencies: + '@types/mdast': 3.0.12 + '@types/unist': 2.0.7 + decode-named-character-reference: 1.0.2 + mdast-util-to-string: 3.2.0 + micromark: 3.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-decode-string: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-stringify-position: 3.0.3 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + dev: true + + /mdast-util-gfm-autolink-literal@1.0.3: + resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} + dependencies: + '@types/mdast': 3.0.12 + ccount: 2.0.1 + mdast-util-find-and-replace: 2.2.2 + micromark-util-character: 1.2.0 + dev: true + + /mdast-util-gfm-footnote@1.0.2: + resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-to-markdown: 1.5.0 + micromark-util-normalize-identifier: 1.1.0 + dev: true + + /mdast-util-gfm-strikethrough@1.0.3: + resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-to-markdown: 1.5.0 + dev: true + + /mdast-util-gfm-table@1.0.7: + resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} + dependencies: + '@types/mdast': 3.0.12 + markdown-table: 3.0.3 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: true + + /mdast-util-gfm-task-list-item@1.0.2: + resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-to-markdown: 1.5.0 + dev: true + + /mdast-util-gfm@2.0.2: + resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} + dependencies: + mdast-util-from-markdown: 1.3.1 + mdast-util-gfm-autolink-literal: 1.0.3 + mdast-util-gfm-footnote: 1.0.2 + mdast-util-gfm-strikethrough: 1.0.3 + mdast-util-gfm-table: 1.0.7 + mdast-util-gfm-task-list-item: 1.0.2 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: true + + /mdast-util-mdx-expression@1.3.2: + resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.5 + '@types/mdast': 3.0.12 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: true + + /mdast-util-mdx-jsx@2.1.4: + resolution: {integrity: sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.5 + '@types/mdast': 3.0.12 + '@types/unist': 2.0.7 + ccount: 2.0.1 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.3 + unist-util-remove-position: 4.0.2 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + transitivePeerDependencies: + - supports-color + dev: true + + /mdast-util-mdx@2.0.1: + resolution: {integrity: sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==} + dependencies: + mdast-util-from-markdown: 1.3.1 + mdast-util-mdx-expression: 1.3.2 + mdast-util-mdx-jsx: 2.1.4 + mdast-util-mdxjs-esm: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: true + + /mdast-util-mdxjs-esm@1.3.1: + resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.5 + '@types/mdast': 3.0.12 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + dev: true + + /mdast-util-phrasing@3.0.1: + resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} + dependencies: + '@types/mdast': 3.0.12 + unist-util-is: 5.2.1 + dev: true + + /mdast-util-to-hast@12.3.0: + resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} + dependencies: + '@types/hast': 2.3.5 + '@types/mdast': 3.0.12 + mdast-util-definitions: 5.1.2 + micromark-util-sanitize-uri: 1.2.0 + trim-lines: 3.0.1 + unist-util-generated: 2.0.1 + unist-util-position: 4.0.4 + unist-util-visit: 4.1.2 + dev: true + + /mdast-util-to-markdown@1.5.0: + resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} + dependencies: + '@types/mdast': 3.0.12 + '@types/unist': 2.0.7 + longest-streak: 3.1.0 + mdast-util-phrasing: 3.0.1 + mdast-util-to-string: 3.2.0 + micromark-util-decode-string: 1.1.0 + unist-util-visit: 4.1.2 + zwitch: 2.0.4 + dev: true + + /mdast-util-to-string@3.2.0: + resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + dependencies: + '@types/mdast': 3.0.12 + dev: true + + /media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + dev: true + + /meow@8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + dependencies: + '@types/minimist': 1.2.2 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: false + + /meow@9.0.0: + resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} + engines: {node: '>=10'} + dependencies: + '@types/minimist': 1.2.2 + camelcase-keys: 6.2.2 + decamelize: 1.2.0 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: true + + /merge-options@3.0.4: + resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==} + engines: {node: '>=10'} + dependencies: + is-plain-obj: 2.1.0 + dev: true + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + /micromark-core-commonmark@1.1.0: + resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-factory-destination: 1.1.0 + micromark-factory-label: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-factory-title: 1.1.0 + micromark-factory-whitespace: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-html-tag-name: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: true + + /micromark-extension-gfm-autolink-literal@1.0.5: + resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: true + + /micromark-extension-gfm-footnote@1.1.2: + resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==} + dependencies: + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: true + + /micromark-extension-gfm-strikethrough@1.0.7: + resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==} + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: true + + /micromark-extension-gfm-table@1.0.7: + resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: true + + /micromark-extension-gfm-tagfilter@1.0.2: + resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==} + dependencies: + micromark-util-types: 1.1.0 + dev: true + + /micromark-extension-gfm-task-list-item@1.0.5: + resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: true + + /micromark-extension-gfm@2.0.3: + resolution: {integrity: sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==} + dependencies: + micromark-extension-gfm-autolink-literal: 1.0.5 + micromark-extension-gfm-footnote: 1.1.2 + micromark-extension-gfm-strikethrough: 1.0.7 + micromark-extension-gfm-table: 1.0.7 + micromark-extension-gfm-tagfilter: 1.0.2 + micromark-extension-gfm-task-list-item: 1.0.5 + micromark-util-combine-extensions: 1.1.0 + micromark-util-types: 1.1.0 + dev: true + + /micromark-extension-mdx-expression@1.0.8: + resolution: {integrity: sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==} + dependencies: + '@types/estree': 1.0.1 + micromark-factory-mdx-expression: 1.0.9 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: true + + /micromark-extension-mdx-jsx@1.0.5: + resolution: {integrity: sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==} + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.1 + estree-util-is-identifier-name: 2.1.0 + micromark-factory-mdx-expression: 1.0.9 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + vfile-message: 3.1.4 + dev: true + + /micromark-extension-mdx-md@1.0.1: + resolution: {integrity: sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==} + dependencies: + micromark-util-types: 1.1.0 + dev: true + + /micromark-extension-mdxjs-esm@1.0.5: + resolution: {integrity: sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==} + dependencies: + '@types/estree': 1.0.1 + micromark-core-commonmark: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-position-from-estree: 1.1.2 + uvu: 0.5.6 + vfile-message: 3.1.4 + dev: true + + /micromark-extension-mdxjs@1.0.1: + resolution: {integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==} + dependencies: + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) + micromark-extension-mdx-expression: 1.0.8 + micromark-extension-mdx-jsx: 1.0.5 + micromark-extension-mdx-md: 1.0.1 + micromark-extension-mdxjs-esm: 1.0.5 + micromark-util-combine-extensions: 1.1.0 + micromark-util-types: 1.1.0 + dev: true + + /micromark-factory-destination@1.1.0: + resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: true + + /micromark-factory-label@1.1.0: + resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: true + + /micromark-factory-mdx-expression@1.0.9: + resolution: {integrity: sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==} + dependencies: + '@types/estree': 1.0.1 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-position-from-estree: 1.1.2 + uvu: 0.5.6 + vfile-message: 3.1.4 + dev: true + + /micromark-factory-space@1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-types: 1.1.0 + dev: true + + /micromark-factory-title@1.1.0: + resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: true + + /micromark-factory-whitespace@1.1.0: + resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: true + + /micromark-util-character@1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: true + + /micromark-util-chunked@1.1.0: + resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} + dependencies: + micromark-util-symbol: 1.1.0 + dev: true + + /micromark-util-classify-character@1.1.0: + resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: true + + /micromark-util-combine-extensions@1.1.0: + resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-types: 1.1.0 + dev: true + + /micromark-util-decode-numeric-character-reference@1.1.0: + resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} + dependencies: + micromark-util-symbol: 1.1.0 + dev: true + + /micromark-util-decode-string@1.1.0: + resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 1.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-symbol: 1.1.0 + dev: true + + /micromark-util-encode@1.1.0: + resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + dev: true + + /micromark-util-events-to-acorn@1.2.3: + resolution: {integrity: sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==} + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.1 + '@types/unist': 2.0.7 + estree-util-visit: 1.2.1 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + vfile-message: 3.1.4 + dev: true + + /micromark-util-html-tag-name@1.2.0: + resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + dev: true + + /micromark-util-normalize-identifier@1.1.0: + resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + dependencies: + micromark-util-symbol: 1.1.0 + dev: true + + /micromark-util-resolve-all@1.1.0: + resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + dependencies: + micromark-util-types: 1.1.0 + dev: true + + /micromark-util-sanitize-uri@1.2.0: + resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-encode: 1.1.0 + micromark-util-symbol: 1.1.0 + dev: true + + /micromark-util-subtokenize@1.1.0: + resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: true + + /micromark-util-symbol@1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + dev: true + + /micromark-util-types@1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + dev: true + + /micromark@3.2.0: + resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + dependencies: + '@types/debug': 4.1.8 + debug: 4.3.4(supports-color@5.5.0) + decode-named-character-reference: 1.0.2 + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-combine-extensions: 1.1.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-encode: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + dev: true + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + + /microseconds@0.2.0: + resolution: {integrity: sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==} + dev: false + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: false + + /mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + /minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + dev: false + + /minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + dev: false + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + + /minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + /mitt@2.1.0: + resolution: {integrity: sha512-ILj2TpLiysu2wkBbWjAmww7TkZb65aiQO+DkVdUTBpBXq+MHYiETENkKFMtsJZX1Lf4pe4QOrTSjIfUwN5lRdg==} + dev: false + + /mlly@1.4.0: + resolution: {integrity: sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==} + dependencies: + acorn: 8.10.0 + pathe: 1.1.1 + pkg-types: 1.0.3 + ufo: 1.2.0 + dev: true + + /modify-values@1.0.1: + resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} + engines: {node: '>=0.10.0'} + dev: false + + /motion@10.16.2: + resolution: {integrity: sha512-p+PurYqfUdcJZvtnmAqu5fJgV2kR0uLFQuBKtLeFVTrYEVllI99tiOTSefVNYuip9ELTEkepIIDftNdze76NAQ==} + dependencies: + '@motionone/animation': 10.15.1 + '@motionone/dom': 10.16.2 + '@motionone/svelte': 10.16.2 + '@motionone/types': 10.15.1 + '@motionone/utils': 10.15.1 + '@motionone/vue': 10.16.2 + dev: false + + /move-file@2.1.0: + resolution: {integrity: sha512-i9qLW6gqboJ5Ht8bauZi7KlTnQ3QFpBCvMvFfEcHADKgHGeJ9BZMO7SFCTwHPV9Qa0du9DYY1Yx3oqlGt30nXA==} + engines: {node: '>=10.17'} + dependencies: + path-exists: 4.0.0 + dev: true + + /mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + dev: true + + /mrmime@1.0.1: + resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} + engines: {node: '>=10'} + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + /multiaddr-to-uri@8.0.0(node-fetch@3.3.1): + resolution: {integrity: sha512-dq4p/vsOOUdVEd1J1gl+R2GFrXJQH8yjLtz4hodqdVbieg39LvBOdMQRdQnfbg5LSM/q1BYNVf5CBbwZFFqBgA==} + deprecated: This module is deprecated, please upgrade to @multiformats/multiaddr-to-uri + dependencies: + multiaddr: 10.0.1(node-fetch@3.3.1) + transitivePeerDependencies: + - node-fetch + - supports-color + dev: true + + /multiaddr@10.0.1(node-fetch@3.3.1): + resolution: {integrity: sha512-G5upNcGzEGuTHkzxezPrrD6CaIHR9uo+7MwqhNVcXTs33IInon4y7nMiGxl2CY5hG7chvYQUQhz5V52/Qe3cbg==} + deprecated: This module is deprecated, please upgrade to @multiformats/multiaddr + dependencies: + dns-over-http-resolver: 1.2.3(node-fetch@3.3.1) + err-code: 3.0.1 + is-ip: 3.1.0 + multiformats: 9.9.0 + uint8arrays: 3.1.1 + varint: 6.0.0 + transitivePeerDependencies: + - node-fetch + - supports-color + dev: true + + /multiformats@9.9.0: + resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} + + /murmurhash3js-revisited@3.0.0: + resolution: {integrity: sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==} + engines: {node: '>=8.0.0'} + dev: true + + /mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: false + + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: true + + /nan@2.17.0: + resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==} + dev: false + + /nano-time@1.0.0: + resolution: {integrity: sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==} + dependencies: + big-integer: 1.6.51 + dev: false + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /native-abort-controller@1.0.4(abort-controller@3.0.0): + resolution: {integrity: sha512-zp8yev7nxczDJMoP6pDxyD20IU0T22eX8VwN2ztDccKvSZhRaV33yP1BGwKSZfXuqWUzsXopVFjBdau9OOAwMQ==} + peerDependencies: + abort-controller: '*' + dependencies: + abort-controller: 3.0.0 + dev: true + + /native-fetch@3.0.0(node-fetch@2.6.12): + resolution: {integrity: sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw==} + peerDependencies: + node-fetch: '*' + dependencies: + node-fetch: 2.6.12 + dev: true + + /native-fetch@3.0.0(node-fetch@3.3.1): + resolution: {integrity: sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw==} + peerDependencies: + node-fetch: '*' + dependencies: + node-fetch: 3.3.1 + dev: true + + /natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + dev: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: true + + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + /netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + engines: {node: '>= 0.4.0'} + dev: false + + /new-github-release-url@2.0.0: + resolution: {integrity: sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + type-fest: 2.19.0 + dev: false + + /node-addon-api@2.0.2: + resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + dev: false + + /node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + + /node-fetch-native@1.2.0: + resolution: {integrity: sha512-5IAMBTl9p6PaAjYCnMv5FmqIF6GcZnawAVnzaCG0rX2aYZJ4CxEkZNtVPuTRug7fL7wyM5BQYTlAzcyMPi6oTQ==} + dev: false + + /node-fetch@2.6.12: + resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + + /node-fetch@3.3.1: + resolution: {integrity: sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + + /node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + dev: true + + /node-gyp-build@4.6.0: + resolution: {integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==} + hasBin: true + dev: false + + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.4 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + + /normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.13.0 + semver: 7.5.4 + validate-npm-package-license: 3.0.4 + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-url@8.0.0: + resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==} + engines: {node: '>=14.16'} + dev: false + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + + /npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + /object-inspect@1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + + /object-is@1.1.5: + resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + dev: true + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + /object.assign@4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + has-symbols: 1.0.3 + object-keys: 1.1.1 + + /object.entries@1.1.6: + resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: true + + /object.fromentries@2.0.6: + resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: true + + /object.hasown@1.1.2: + resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} + dependencies: + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: true + + /object.values@1.1.6: + resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: true + + /oblivious-set@1.0.0: + resolution: {integrity: sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==} + dev: false + + /on-exit-leak-free@0.2.0: + resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} + dev: false + + /on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + + /only@0.0.2: + resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} + dev: true + + /open@9.1.0: + resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} + engines: {node: '>=14.16'} + dependencies: + default-browser: 4.0.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 2.2.0 + + /optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.5 + dev: false + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.0 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: false + + /ora@6.3.1: + resolution: {integrity: sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + chalk: 5.2.0 + cli-cursor: 4.0.0 + cli-spinners: 2.9.0 + is-interactive: 2.0.0 + is-unicode-supported: 1.3.0 + log-symbols: 5.1.0 + stdin-discarder: 0.1.0 + strip-ansi: 7.1.0 + wcwidth: 1.0.1 + dev: false + + /os-name@5.1.0: + resolution: {integrity: sha512-YEIoAnM6zFmzw3PQ201gCVCIWbXNyKObGlVvpAVvraAeOHnlYVKFssbA/riRX5R40WA6kKrZ7Dr7dWzO3nKSeQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + macos-release: 3.2.0 + windows-release: 5.1.1 + dev: false + + /os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + dev: false + + /osmojs@15.5.0: + resolution: {integrity: sha512-7wy3QEYu+R+c8imfLEPS1PliYA8uw0qdFYjc2PToHteYG4hzYt4Noa7X0lM9O59s7nxo9ozT1N9z7uwB/1qHkA==} + dependencies: + '@babel/runtime': 7.22.10 + '@cosmjs/amino': 0.29.3 + '@cosmjs/proto-signing': 0.29.3 + '@cosmjs/stargate': 0.29.3 + '@cosmjs/tendermint-rpc': 0.29.5 + '@osmonauts/lcd': 0.10.0 + long: 5.2.3 + protobufjs: 6.11.4 + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + dev: false + + /p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + dev: false + + /p-defer@3.0.0: + resolution: {integrity: sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==} + engines: {node: '>=8'} + dev: true + + /p-fifo@1.0.0: + resolution: {integrity: sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A==} + dependencies: + fast-fifo: 1.3.0 + p-defer: 3.0.0 + dev: true + + /p-limit@1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + dependencies: + p-try: 1.0.0 + dev: false + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + + /p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + dependencies: + p-limit: 1.3.0 + dev: false + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /p-retry@4.6.2: + resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} + engines: {node: '>=8'} + dependencies: + '@types/retry': 0.12.0 + retry: 0.13.1 + dev: true + + /p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + dev: false + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + /pac-proxy-agent@6.0.4: + resolution: {integrity: sha512-FbJYeusBOZNe6bmrC2/+r/HljwExryon16lNKEU82gWiwIPMCEktUPSEAcTkO9K3jd/YPGuX/azZel1ltmo6nQ==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4(supports-color@5.5.0) + get-uri: 6.0.1 + http-proxy-agent: 7.0.0 + https-proxy-agent: 7.0.1 + pac-resolver: 6.0.2 + socks-proxy-agent: 8.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /pac-resolver@6.0.2: + resolution: {integrity: sha512-EQpuJ2ifOjpZY5sg1Q1ZeAxvtLwR7Mj3RgY8cysPGbsRu3RBXyJFWxnMus9PScjxya/0LzvVDxNh/gl0eXBU4w==} + engines: {node: '>= 14'} + dependencies: + degenerator: 4.0.4 + ip: 1.1.8 + netmask: 2.0.2 + dev: false + + /package-json@8.1.1: + resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} + engines: {node: '>=14.16'} + dependencies: + got: 12.6.1 + registry-auth-token: 5.0.2 + registry-url: 6.0.1 + semver: 7.5.4 + dev: false + + /pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + dev: true + + /pako@2.1.0: + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + dev: false + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + + /parse-duration@1.1.0: + resolution: {integrity: sha512-z6t9dvSJYaPoQq7quMzdEagSFtpGu+utzHqqxmpVWNNZRIXnvqyCvn9XsTdh7c/w0Bqmdz3RB3YnRaKtpRtEXQ==} + dev: true + + /parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + dependencies: + '@types/unist': 2.0.7 + character-entities: 2.0.2 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + dev: true + + /parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + dev: false + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.22.10 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + /parse-path@7.0.0: + resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} + dependencies: + protocols: 2.0.1 + dev: false + + /parse-url@8.1.0: + resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} + dependencies: + parse-path: 7.0.0 + dev: false + + /parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + dev: true + + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: true + + /path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + dev: false + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + /path-type@3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + dependencies: + pify: 3.0.0 + dev: false + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + /pathe@1.1.1: + resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} + dev: true + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + + /peer-id@0.16.0: + resolution: {integrity: sha512-EmL7FurFUduU9m1PS9cfJ5TAuCvxKQ7DKpfx3Yj6IKWyBRtosriFuOag/l3ni/dtPgPLwiA4R9IvpL7hsDLJuQ==} + engines: {node: '>=15.0.0'} + dependencies: + class-is: 1.1.0 + libp2p-crypto: 0.21.2 + multiformats: 9.9.0 + protobufjs: 6.11.4 + uint8arrays: 3.1.1 + dev: true + + /periscopic@3.1.0: + resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + dependencies: + '@types/estree': 1.0.1 + estree-walker: 3.0.3 + is-reference: 3.0.1 + dev: true + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: false + + /pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + dev: false + + /pify@5.0.0: + resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} + engines: {node: '>=10'} + dev: false + + /pino-abstract-transport@0.5.0: + resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==} + dependencies: + duplexify: 4.1.2 + split2: 4.2.0 + dev: false + + /pino-std-serializers@4.0.0: + resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==} + dev: false + + /pino@7.11.0: + resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==} + hasBin: true + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.3.0 + on-exit-leak-free: 0.2.0 + pino-abstract-transport: 0.5.0 + pino-std-serializers: 4.0.0 + process-warning: 1.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.1.0 + safe-stable-stringify: 2.4.3 + sonic-boom: 2.8.0 + thread-stream: 0.15.2 + dev: false + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: true + + /pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: true + + /pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.4.0 + pathe: 1.1.1 + dev: true + + /pngjs@5.0.0: + resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} + engines: {node: '>=10.13.0'} + dev: false + + /pnpm@8.6.6: + resolution: {integrity: sha512-a51bIJyCmvstgCvsWf6SgZnsXfWmwAW1pHWEaH2gN3vqQGC58yLFL/oKBwcZWH0mjpMzBWRXdS9dLdN6GAK2Rw==} + engines: {node: '>=16.14'} + hasBin: true + dev: true + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + /postcss@8.4.28: + resolution: {integrity: sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /preact@10.17.0: + resolution: {integrity: sha512-SNsI8cbaCcUS5tbv9nlXuCfIXnJ9ysBMWk0WnB6UWwcVA3qZ2O6FxqDFECMAMttvLQcW/HaNZUe2BLidyvrVYw==} + dev: false + + /prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + dev: false + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + dependencies: + fast-diff: 1.3.0 + dev: true + + /prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + + /prism-react-renderer@1.3.5(react@18.2.0): + resolution: {integrity: sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==} + peerDependencies: + react: '>=0.14.9' + dependencies: + react: 18.2.0 + dev: true + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: false + + /process-warning@1.0.0: + resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} + dev: false + + /promise.allsettled@1.0.6: + resolution: {integrity: sha512-22wJUOD3zswWFqgwjNHa1965LvqTX87WPu/lreY2KSd7SVcERfuZ4GfUaOnJNnvtoIv2yXT/W00YIGMetXtFXg==} + engines: {node: '>= 0.4'} + dependencies: + array.prototype.map: 1.0.5 + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + get-intrinsic: 1.2.1 + iterate-value: 1.0.2 + dev: false + + /prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + /property-information@6.2.0: + resolution: {integrity: sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==} + dev: true + + /proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + dev: false + + /protobufjs@6.11.4: + resolution: {integrity: sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==} + hasBin: true + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/long': 4.0.2 + '@types/node': 20.3.1 + long: 4.0.0 + + /protocols@2.0.1: + resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} + dev: false + + /proxy-agent@6.2.1: + resolution: {integrity: sha512-OIbBKlRAT+ycCm6wAYIzMwPejzRtjy8F3QiDX0eKOA3e4pe3U9F/IvzcHP42bmgQxVv97juG+J8/gx+JIeCX/Q==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4(supports-color@5.5.0) + http-proxy-agent: 7.0.0 + https-proxy-agent: 7.0.1 + lru-cache: 7.18.3 + pac-proxy-agent: 6.0.4 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /proxy-compare@2.5.1: + resolution: {integrity: sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA==} + dev: false + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false + + /punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + dev: true + + /pupa@3.1.0: + resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==} + engines: {node: '>=12.20'} + dependencies: + escape-goat: 4.0.0 + dev: false + + /qr-code-styling@1.6.0-rc.1: + resolution: {integrity: sha512-ModRIiW6oUnsP18QzrRYZSc/CFKFKIdj7pUs57AEVH20ajlglRpN3HukjHk0UbNMTlKGuaYl7Gt6/O5Gg2NU2Q==} + dependencies: + qrcode-generator: 1.4.4 + dev: false + + /qrcode-generator@1.4.4: + resolution: {integrity: sha512-HM7yY8O2ilqhmULxGMpcHSF1EhJJ9yBj8gvDEuZ6M+KGJ0YY2hKpnXvRD+hZPLrDVck3ExIGhmPtSdcjC+guuw==} + dev: false + + /qrcode@1.5.3: + resolution: {integrity: sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==} + engines: {node: '>=10.13.0'} + hasBin: true + dependencies: + dijkstrajs: 1.0.3 + encode-utf8: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 + dev: false + + /qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: false + + /query-string@6.14.1: + resolution: {integrity: sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==} + engines: {node: '>=6'} + dependencies: + decode-uri-component: 0.2.2 + filter-obj: 1.1.0 + split-on-first: 1.1.0 + strict-uri-encode: 2.0.0 + dev: false + + /query-string@7.1.3: + resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} + engines: {node: '>=6'} + dependencies: + decode-uri-component: 0.2.2 + filter-obj: 1.1.0 + split-on-first: 1.1.0 + strict-uri-encode: 2.0.0 + dev: false + + /query-string@8.1.0: + resolution: {integrity: sha512-BFQeWxJOZxZGix7y+SByG3F36dA0AbTy9o6pSmKFcFz7DAj0re9Frkty3saBn3nHo3D0oZJ/+rx3r8H8r8Jbpw==} + engines: {node: '>=14.16'} + dependencies: + decode-uri-component: 0.4.1 + filter-obj: 5.1.0 + split-on-first: 3.0.0 + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + /quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + dev: false + + /quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + + /quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + dev: false + + /rabin-wasm@0.1.5: + resolution: {integrity: sha512-uWgQTo7pim1Rnj5TuWcCewRDTf0PEFTSlaUjWP4eY9EbLV9em08v89oCz/WO+wRxpYuO36XEHp4wgYQnAgOHzA==} + hasBin: true + dependencies: + '@assemblyscript/loader': 0.9.4 + bl: 5.1.0 + debug: 4.3.4(supports-color@5.5.0) + minimist: 1.2.8 + node-fetch: 2.6.12 + readable-stream: 3.6.2 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: false + + /react-aria@3.25.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-nvahN6tUCnES9CXCKEzEHkWy7mH39KsQoCk6eehIT3eG1pw/eYUqXFAmmWIL3g2VDCiGavpSf1/BUTnAXE2VsQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/breadcrumbs': 3.5.4(react@18.2.0) + '@react-aria/button': 3.8.1(react@18.2.0) + '@react-aria/calendar': 3.4.1(react-dom@18.2.0)(react@18.2.0) + '@react-aria/checkbox': 3.10.0(react@18.2.0) + '@react-aria/combobox': 3.6.3(react-dom@18.2.0)(react@18.2.0) + '@react-aria/datepicker': 3.6.0(react-dom@18.2.0)(react@18.2.0) + '@react-aria/dialog': 3.5.4(react-dom@18.2.0)(react@18.2.0) + '@react-aria/dnd': 3.4.0(react-dom@18.2.0)(react@18.2.0) + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/gridlist': 3.5.1(react-dom@18.2.0)(react@18.2.0) + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/label': 3.6.1(react@18.2.0) + '@react-aria/link': 3.5.3(react@18.2.0) + '@react-aria/listbox': 3.10.1(react@18.2.0) + '@react-aria/menu': 3.10.1(react-dom@18.2.0)(react@18.2.0) + '@react-aria/meter': 3.4.4(react@18.2.0) + '@react-aria/numberfield': 3.7.0(react-dom@18.2.0)(react@18.2.0) + '@react-aria/overlays': 3.16.0(react-dom@18.2.0)(react@18.2.0) + '@react-aria/progress': 3.4.4(react@18.2.0) + '@react-aria/radio': 3.7.0(react@18.2.0) + '@react-aria/searchfield': 3.5.4(react@18.2.0) + '@react-aria/select': 3.12.0(react-dom@18.2.0)(react@18.2.0) + '@react-aria/selection': 3.16.1(react@18.2.0) + '@react-aria/separator': 3.3.4(react@18.2.0) + '@react-aria/slider': 3.6.0(react@18.2.0) + '@react-aria/ssr': 3.7.1(react@18.2.0) + '@react-aria/switch': 3.5.3(react@18.2.0) + '@react-aria/table': 3.11.0(react-dom@18.2.0)(react@18.2.0) + '@react-aria/tabs': 3.6.2(react@18.2.0) + '@react-aria/tag': 3.1.1(react-dom@18.2.0)(react@18.2.0) + '@react-aria/textfield': 3.11.0(react@18.2.0) + '@react-aria/tooltip': 3.6.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-aria/visually-hidden': 3.8.3(react@18.2.0) + '@react-types/shared': 3.18.1(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /react-dom@18.2.0(react@18.2.0): + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + + /react-frame-component@5.2.4(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-4xpZFcLNS6LCEYSlWgsUy81v7LjdgbvB0VHIq7sNSD25PK+e5YYCrdy5557ebGwNLKNLEpYVfAkT3pVzFLPb1g==} + peerDependencies: + prop-types: ^15.5.9 + react: '>= 16.3' + react-dom: '>= 16.3' + dependencies: + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /react-inspector@6.0.2(react@18.2.0): + resolution: {integrity: sha512-x+b7LxhmHXjHoU/VrFAzw5iutsILRoYyDq97EDYdFpPLcvqtEzk4ZSZSQjnFPbr5T57tLXnHcqFYoN1pI6u8uQ==} + peerDependencies: + react: ^16.8.4 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: true + + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: true + + /react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + + /react-native-fetch-api@3.0.0: + resolution: {integrity: sha512-g2rtqPjdroaboDKTsJCTlcmtw54E25OjyaunUP0anOZn4Fuo2IKs8BVfe02zVggA/UysbmfSnRJIqtNkAgggNA==} + dependencies: + p-defer: 3.0.0 + dev: true + + /react-number-format@5.2.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-wCh64Z1HCwXcO2dbgkeYIaB+Rmp/fcsH8kAeRtUkc46dv1pIrgDjie2WkOqKBw8YqyqhwNdYgNFNQuuY+iGJ/g==} + peerDependencies: + react: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + dependencies: + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /react-query@3.39.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + dependencies: + '@babel/runtime': 7.22.10 + broadcast-channel: 3.7.0 + match-sorter: 6.3.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /react-redux@8.1.1(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0)(redux@4.2.1): + resolution: {integrity: sha512-5W0QaKtEhj+3bC0Nj0NkqkhIv8gLADH/2kYFMTHxCVqQILiWzLv6MaLuV5wJU3BQEdHKzTfcvPN0WMS6SC1oyA==} + peerDependencies: + '@types/react': ^16.8 || ^17.0 || ^18.0 + '@types/react-dom': ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + react-native: '>=0.59' + redux: ^4 || ^5.0.0-beta.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + react-dom: + optional: true + react-native: + optional: true + redux: + optional: true + dependencies: + '@babel/runtime': 7.22.10 + '@types/hoist-non-react-statics': 3.3.1 + '@types/react': 18.2.14 + '@types/react-dom': 18.2.6 + '@types/use-sync-external-store': 0.0.3 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-is: 18.2.0 + redux: 4.2.1 + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false + + /react-refresh@0.14.0: + resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} + engines: {node: '>=0.10.0'} + dev: true + + /react-remove-scroll-bar@2.3.4(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.14 + react: 18.2.0 + react-style-singleton: 2.2.1(@types/react@18.2.14)(react@18.2.0) + tslib: 2.6.1 + dev: false + + /react-remove-scroll@2.5.4(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.14 + react: 18.2.0 + react-remove-scroll-bar: 2.3.4(@types/react@18.2.14)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.14)(react@18.2.0) + tslib: 2.6.1 + use-callback-ref: 1.3.0(@types/react@18.2.14)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.14)(react@18.2.0) + dev: false + + /react-remove-scroll@2.5.5(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.14 + react: 18.2.0 + react-remove-scroll-bar: 2.3.4(@types/react@18.2.14)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.14)(react@18.2.0) + tslib: 2.6.1 + use-callback-ref: 1.3.0(@types/react@18.2.14)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.14)(react@18.2.0) + dev: false + + /react-router-dom@6.14.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-YEwlApKwzMMMbGbhh+Q7MsloTldcwMgHxUY/1g0uA62+B1hZo2jsybCWIDCL8zvIDB1FA0pBKY9chHbZHt+2dQ==} + engines: {node: '>=14'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + dependencies: + '@remix-run/router': 1.7.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-router: 6.14.0(react@18.2.0) + dev: false + + /react-router@6.14.0(react@18.2.0): + resolution: {integrity: sha512-OD+vkrcGbvlwkspUFDgMzsu1RXwdjNh83YgG/28lBnDzgslhCgxIqoExLlxsfTpIygp7fc+Hd3esloNwzkm2xA==} + engines: {node: '>=14'} + peerDependencies: + react: '>=16.8' + dependencies: + '@remix-run/router': 1.7.0 + react: 18.2.0 + dev: false + + /react-stately@3.23.0(react@18.2.0): + resolution: {integrity: sha512-nk2ihInebz5s+eDcXeEL+e2AbP9g0Mp9Gx5GEgqfICc8CKoYWERQsukXphGc6WEvFpAjVde7Q33hqusIqAO5gA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/calendar': 3.3.1(react@18.2.0) + '@react-stately/checkbox': 3.4.4(react@18.2.0) + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/combobox': 3.6.0(react@18.2.0) + '@react-stately/data': 3.10.1(react@18.2.0) + '@react-stately/datepicker': 3.6.0(react@18.2.0) + '@react-stately/dnd': 3.2.3(react@18.2.0) + '@react-stately/list': 3.9.1(react@18.2.0) + '@react-stately/menu': 3.5.4(react@18.2.0) + '@react-stately/numberfield': 3.6.0(react@18.2.0) + '@react-stately/overlays': 3.6.1(react@18.2.0) + '@react-stately/radio': 3.8.3(react@18.2.0) + '@react-stately/searchfield': 3.4.4(react@18.2.0) + '@react-stately/select': 3.5.3(react@18.2.0) + '@react-stately/selection': 3.13.3(react@18.2.0) + '@react-stately/slider': 3.4.1(react@18.2.0) + '@react-stately/table': 3.9.1(react@18.2.0) + '@react-stately/tabs': 3.5.1(react@18.2.0) + '@react-stately/toggle': 3.6.1(react@18.2.0) + '@react-stately/tooltip': 3.4.3(react@18.2.0) + '@react-stately/tree': 3.7.1(react@18.2.0) + '@react-types/shared': 3.18.1(react@18.2.0) + react: 18.2.0 + dev: false + + /react-style-singleton@2.2.1(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.14 + get-nonce: 1.0.1 + invariant: 2.2.4 + react: 18.2.0 + tslib: 2.6.1 + dev: false + + /react-use-measure@2.1.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==} + peerDependencies: + react: '>=16.13' + react-dom: '>=16.13' + dependencies: + debounce: 1.2.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + + /read-pkg-up@3.0.0: + resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} + engines: {node: '>=4'} + dependencies: + find-up: 2.1.0 + read-pkg: 3.0.0 + dev: false + + /read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + + /read-pkg@3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + dev: false + + /read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.1 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: false + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /readonly-date@1.0.0: + resolution: {integrity: sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ==} + dev: false + + /real-require@0.1.0: + resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==} + engines: {node: '>= 12.13.0'} + dev: false + + /receptacle@1.3.2: + resolution: {integrity: sha512-HrsFvqZZheusncQRiEE7GatOAETrARKV/lnfYicIm8lbvp/JQOdADOfhjBd2DajvoszEyxSM6RlAAIZgEoeu/A==} + dependencies: + ms: 2.1.3 + dev: true + + /rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + dependencies: + resolve: 1.22.4 + dev: false + + /recrawl-sync@2.2.3: + resolution: {integrity: sha512-vSaTR9t+cpxlskkdUFrsEpnf67kSmPk66yAGT1fZPrDudxQjoMzPgQhSMImQ0pAw5k0NPirefQfhopSjhdUtpQ==} + dependencies: + '@cush/relative': 1.0.0 + glob-regex: 0.3.2 + slash: 3.0.0 + sucrase: 3.34.0 + tslib: 1.14.1 + dev: true + + /redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + + /reduce-css-calc@1.3.0: + resolution: {integrity: sha512-0dVfwYVOlf/LBA2ec4OwQ6p3X9mYxn/wOl2xTcLwjnPYrkgEfPx3VI4eGCH3rQLlPISG5v9I9bkZosKsNRTRKA==} + dependencies: + balanced-match: 0.4.2 + math-expression-evaluator: 1.4.0 + reduce-function-call: 1.0.3 + dev: false + + /reduce-function-call@1.0.3: + resolution: {integrity: sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ==} + dependencies: + balanced-match: 1.0.2 + dev: false + + /redux-thunk@2.4.2(redux@4.2.1): + resolution: {integrity: sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==} + peerDependencies: + redux: ^4 + dependencies: + redux: 4.2.1 + dev: false + + /redux@4.2.1: + resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} + dependencies: + '@babel/runtime': 7.22.10 + dev: false + + /regenerator-runtime@0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + + /regexp.prototype.flags@1.5.0: + resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + functions-have-names: 1.2.3 + + /registry-auth-token@5.0.2: + resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} + engines: {node: '>=14'} + dependencies: + '@pnpm/npm-conf': 2.2.2 + dev: false + + /registry-url@6.0.1: + resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} + engines: {node: '>=12'} + dependencies: + rc: 1.2.8 + dev: false + + /rehype-raw@6.1.1: + resolution: {integrity: sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==} + dependencies: + '@types/hast': 2.3.5 + hast-util-raw: 7.2.3 + unified: 10.1.2 + dev: true + + /release-it@15.11.0: + resolution: {integrity: sha512-lZwoGEnKYKwGnfxxlA7vtR7vvozPrOSsIgQaHO4bgQ5ARbG3IA6Dmo0IVusv6nR1KmnjH70QIeNAgsWs6Ji/tw==} + engines: {node: '>=14.9'} + hasBin: true + dependencies: + '@iarna/toml': 2.2.5 + '@octokit/rest': 19.0.11 + async-retry: 1.3.3 + chalk: 5.2.0 + cosmiconfig: 8.1.3 + execa: 7.1.1 + git-url-parse: 13.1.0 + globby: 13.1.4 + got: 12.6.1 + inquirer: 9.2.6 + is-ci: 3.0.1 + issue-parser: 6.0.0 + lodash: 4.17.21 + mime-types: 2.1.35 + new-github-release-url: 2.0.0 + node-fetch: 3.3.1 + open: 9.1.0 + ora: 6.3.1 + os-name: 5.1.0 + promise.allsettled: 1.0.6 + proxy-agent: 6.2.1 + semver: 7.5.1 + shelljs: 0.8.5 + update-notifier: 6.0.2 + url-join: 5.0.0 + wildcard-match: 5.1.2 + yargs-parser: 21.1.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /remark-gfm@3.0.1: + resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-gfm: 2.0.2 + micromark-extension-gfm: 2.0.3 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /remark-mdx@2.3.0: + resolution: {integrity: sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==} + dependencies: + mdast-util-mdx: 2.0.1 + micromark-extension-mdxjs: 1.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /remark-parse@10.0.2: + resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-from-markdown: 1.3.1 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /remark-rehype@10.1.0: + resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} + dependencies: + '@types/hast': 2.3.5 + '@types/mdast': 3.0.12 + mdast-util-to-hast: 12.3.0 + unified: 10.1.2 + dev: true + + /remove-accents@0.4.2: + resolution: {integrity: sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==} + dev: false + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: false + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + + /require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + dev: false + + /reselect@4.1.8: + resolution: {integrity: sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==} + dev: false + + /resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + dev: false + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + /resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + dev: true + + /resolve@1.22.4: + resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} + hasBin: true + dependencies: + is-core-module: 2.13.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /resolve@2.0.0-next.4: + resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} + hasBin: true + dependencies: + is-core-module: 2.13.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /responselike@3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + engines: {node: '>=14.16'} + dependencies: + lowercase-keys: 3.0.0 + dev: false + + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: false + + /restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: false + + /retimer@2.0.0: + resolution: {integrity: sha512-KLXY85WkEq2V2bKex/LOO1ViXVn2KGYe4PYysAdYdjmraYIUsVkXu8O4am+8+5UbaaGl1qho4aqAAPHNQ4GSbg==} + dev: true + + /retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + + /ripemd160@2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + dev: false + + /rollup@3.28.0: + resolution: {integrity: sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /rpc-websockets@7.6.0: + resolution: {integrity: sha512-Jgcs8q6t8Go98dEulww1x7RysgTkzpCMelVxZW4hvuyFtOGpeUz9prpr2KjUa/usqxgFCd9Tu3+yhHEP9GVmiQ==} + dependencies: + '@babel/runtime': 7.22.10 + eventemitter3: 4.0.7 + uuid: 8.3.2 + ws: 8.13.0(bufferutil@4.0.7)(utf-8-validate@5.0.10) + optionalDependencies: + bufferutil: 4.0.7 + utf-8-validate: 5.0.10 + dev: false + + /run-applescript@5.0.0: + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} + dependencies: + execa: 5.1.1 + + /run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + dev: false + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + + /rxjs@6.6.7: + resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} + engines: {npm: '>=2.0.0'} + dependencies: + tslib: 1.14.1 + dev: false + + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + dependencies: + tslib: 2.6.1 + dev: false + + /sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + dependencies: + mri: 1.2.0 + dev: true + + /safe-array-concat@1.0.0: + resolution: {integrity: sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + isarray: 2.0.5 + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: false + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /safe-json-utils@1.1.1: + resolution: {integrity: sha512-SAJWGKDs50tAbiDXLf89PDwt9XYkWyANFWVzn4dTXl5QyI8t2o/bW5/OJl3lvc2WVU4MEpTo9Yz5NVFNsp+OJQ==} + dev: false + + /safe-regex-test@1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-regex: 1.1.4 + + /safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + dev: false + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + /scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + dependencies: + loose-envify: 1.4.0 + + /schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/json-schema': 7.0.12 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + dev: true + + /schema-utils@4.2.0: + resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} + engines: {node: '>= 12.13.0'} + dependencies: + '@types/json-schema': 7.0.12 + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) + ajv-keywords: 5.1.0(ajv@8.12.0) + dev: true + + /scrypt-js@3.0.1: + resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + dev: false + + /semver-diff@4.0.0: + resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==} + engines: {node: '>=12'} + dependencies: + semver: 7.5.4 + dev: false + + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + /semver@7.5.1: + resolution: {integrity: sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: false + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /serialize-javascript@6.0.1: + resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} + dependencies: + randombytes: 2.1.0 + dev: true + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: false + + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: true + + /sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: false + + /shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + /shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + dependencies: + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + dev: false + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + object-inspect: 1.12.3 + + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: true + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + /simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + dependencies: + is-arrayish: 0.3.2 + dev: false + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + + /smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + dev: false + + /socks-proxy-agent@8.0.1: + resolution: {integrity: sha512-59EjPbbgg8U3x62hhKOFVAmySQUcfRQ4C7Q/D5sEHnZTQRrQlNKINks44DMR1gwXp0p4LaVIeccX2KHTTcHVqQ==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4(supports-color@5.5.0) + socks: 2.7.1 + transitivePeerDependencies: + - supports-color + dev: false + + /socks@2.7.1: + resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} + engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} + dependencies: + ip: 2.0.0 + smart-buffer: 4.2.0 + dev: false + + /sonic-boom@2.8.0: + resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} + dependencies: + atomic-sleep: 1.0.0 + dev: false + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + dev: true + + /space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + dev: true + + /sparse-array@1.3.2: + resolution: {integrity: sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg==} + dev: true + + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.13 + + /spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.13 + + /spdx-license-ids@3.0.13: + resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + + /split-on-first@1.1.0: + resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} + engines: {node: '>=6'} + dev: false + + /split-on-first@3.0.0: + resolution: {integrity: sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==} + engines: {node: '>=12'} + dev: true + + /split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + dependencies: + readable-stream: 3.6.2 + dev: false + + /split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + dev: false + + /split@1.0.1: + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + dependencies: + through: 2.3.8 + dev: false + + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + + /statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + dev: true + + /std-env@3.3.3: + resolution: {integrity: sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==} + dev: true + + /stdin-discarder@0.1.0: + resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + bl: 5.1.0 + dev: false + + /stop-iteration-iterator@1.0.0: + resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} + engines: {node: '>= 0.4'} + dependencies: + internal-slot: 1.0.5 + dev: false + + /stream-browserify@3.0.0: + resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /stream-shift@1.0.1: + resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} + dev: false + + /stream-to-it@0.2.4: + resolution: {integrity: sha512-4vEbkSs83OahpmBybNJXlJd7d6/RxzkkSdT3I0mnGt79Xd2Kk+e1JqbvAvsQfCeKj3aKb0QIWkyK3/n0j506vQ==} + dependencies: + get-iterator: 1.0.2 + dev: true + + /streaming-iterables@6.2.0: + resolution: {integrity: sha512-3AYC8oB60WyD1ic7uHmN/vm2oRGzRnQ3XFBl/bFMDi1q1+nc5/vjMmiE4vroIya3jG59t87VpyAj/iXYxyw9AA==} + engines: {node: '>=10'} + dev: true + + /strict-uri-encode@2.0.0: + resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} + engines: {node: '>=4'} + dev: false + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + /string.prototype.matchall@4.0.8: + resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + regexp.prototype.flags: 1.5.0 + side-channel: 1.0.4 + dev: true + + /string.prototype.trim@1.2.7: + resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + + /string.prototype.trimend@1.0.6: + resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + + /string.prototype.trimstart@1.0.6: + resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: false + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + + /stringify-entities@4.0.3: + resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: false + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /strip-literal@1.3.0: + resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + dependencies: + acorn: 8.10.0 + dev: true + + /style-to-object@0.4.2: + resolution: {integrity: sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA==} + dependencies: + inline-style-parser: 0.1.1 + dev: true + + /styled-components@5.3.11(@babel/core@7.22.5)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==} + engines: {node: '>=10'} + peerDependencies: + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + react-is: '>= 16.8.0' + dependencies: + '@babel/helper-module-imports': 7.22.5 + '@babel/traverse': 7.22.10(supports-color@5.5.0) + '@emotion/is-prop-valid': 1.2.1 + '@emotion/stylis': 0.8.5 + '@emotion/unitless': 0.7.5 + babel-plugin-styled-components: 2.1.4(@babel/core@7.22.5)(styled-components@5.3.11) + css-to-react-native: 3.2.0 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-is: 18.2.0 + shallowequal: 1.1.0 + supports-color: 5.5.0 + transitivePeerDependencies: + - '@babel/core' + + /sucrase@3.34.0: + resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} + engines: {node: '>=8'} + hasBin: true + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + commander: 4.1.1 + glob: 7.1.6 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + dev: true + + /superjson@1.13.1: + resolution: {integrity: sha512-AVH2eknm9DEd3qvxM4Sq+LTCkSXE2ssfh1t11MHMXyYXFQyQ1HLgVvV+guLTsaQnJU3gnaVo34TohHPulY/wLg==} + engines: {node: '>=10'} + dependencies: + copy-anything: 3.0.5 + dev: false + + /superstruct@0.14.2: + resolution: {integrity: sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==} + dev: false + + /superstruct@1.0.3: + resolution: {integrity: sha512-8iTn3oSS8nRGn+C2pgXSKPI3jmpm6FExNazNpjvqS6ZUJQCej3PUXEKM8NjHBOs54ExM+LPW/FBRhymrdcCiSg==} + engines: {node: '>=14.0.0'} + dev: false + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + /svg-parser@2.0.4: + resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + dev: true + + /symbol-observable@2.0.3: + resolution: {integrity: sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==} + engines: {node: '>=0.10'} + dev: false + + /synckit@0.8.5: + resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} + engines: {node: ^14.18.0 || >=16.0.0} + dependencies: + '@pkgr/utils': 2.4.2 + tslib: 2.6.1 + dev: true + + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: true + + /terser-webpack-plugin@5.3.9(webpack@5.88.2): + resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.19 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.1 + terser: 5.19.2 + webpack: 5.88.2 + dev: true + + /terser@5.19.2: + resolution: {integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.5 + acorn: 8.10.0 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: true + + /text-encoding-utf-8@1.0.2: + resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} + dev: false + + /text-extensions@1.9.0: + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} + engines: {node: '>=0.10'} + dev: false + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: true + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: true + + /thread-stream@0.15.2: + resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} + dependencies: + real-require: 0.1.0 + dev: false + + /throttled-queue@2.1.4: + resolution: {integrity: sha512-YGdk8sdmr4ge3g+doFj/7RLF5kLM+Mi7DEciu9PHxnMJZMeVuZeTj31g4VE7ekUffx/IdbvrtOCiz62afg0mkg==} + dev: true + + /through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + dev: false + + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: false + + /time-zone@1.0.0: + resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} + engines: {node: '>=4'} + dev: true + + /timeout-abort-controller@1.1.1: + resolution: {integrity: sha512-BsF9i3NAJag6T0ZEjki9j654zoafI2X6ayuNd6Tp8+Ul6Tr5s4jo973qFeiWrRSweqvskC+AHDKUmIW4b7pdhQ==} + dependencies: + abort-controller: 3.0.0 + retimer: 2.0.0 + dev: true + + /timestamp-nano@1.0.1: + resolution: {integrity: sha512-4oGOVZWTu5sl89PtCDnhQBSt7/vL1zVEwAfxH1p49JhTosxzVQWYBYFRFZ8nJmo0G6f824iyP/44BFAwIoKvIA==} + engines: {node: '>= 4.5.0'} + dev: true + + /tiny-secp256k1@1.1.6: + resolution: {integrity: sha512-FmqJZGduTyvsr2cF3375fqGHUovSwDi/QytexX1Se4BPuPZpTE5Ftp5fg+EFSuEf3lhZqgCRjEG3ydUQ/aNiwA==} + engines: {node: '>=6.0.0'} + requiresBuild: true + dependencies: + bindings: 1.5.0 + bn.js: 4.12.0 + create-hmac: 1.1.7 + elliptic: 6.5.4 + nan: 2.17.0 + dev: false + + /tinybench@2.5.0: + resolution: {integrity: sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==} + dev: true + + /tinypool@0.5.0: + resolution: {integrity: sha512-paHQtnrlS1QZYKF/GnLoOM/DN9fqaGOFbCbxzAhwniySnzl9Ebk8w73/dd34DAhe/obUbPAOldTyYXQZxnPBPQ==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@2.1.1: + resolution: {integrity: sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==} + engines: {node: '>=14.0.0'} + dev: true + + /titleize@3.0.0: + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} + + /tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: 1.0.2 + dev: false + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + + /toggle-selection@1.0.6: + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + dev: false + + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: true + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + /trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + dev: true + + /trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + + /trough@2.1.0: + resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} + dev: true + + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + dev: true + + /tsconfig-paths@3.14.2: + resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + /tslib@2.4.0: + resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + dev: false + + /tslib@2.6.1: + resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} + + /tsscmp@1.0.6: + resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} + engines: {node: '>=0.6.x'} + dev: true + + /tsutils@3.21.0(typescript@5.1.3): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + 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' + dependencies: + tslib: 1.14.1 + typescript: 5.1.3 + dev: true + + /type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + dev: false + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: false + + /type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + /type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + /type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + dev: false + + /type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + /type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: true + + /typed-array-buffer@1.0.0: + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-typed-array: 1.1.12 + + /typed-array-byte-length@1.0.0: + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + + /typed-array-byte-offset@1.0.0: + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + + /typed-array-length@1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + is-typed-array: 1.1.12 + + /typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + dev: false + + /typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + dev: false + + /typeforce@1.18.0: + resolution: {integrity: sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==} + dev: false + + /typescript@5.1.3: + resolution: {integrity: sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==} + engines: {node: '>=14.17'} + hasBin: true + + /ufo@1.2.0: + resolution: {integrity: sha512-RsPyTbqORDNDxqAdQPQBpgqhWle1VcTSou/FraClYlHf6TZnQcGslpLcAphNR+sQW4q5lLWLbOsRlh9j24baQg==} + dev: true + + /uglify-js@3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + engines: {node: '>=0.8.0'} + hasBin: true + requiresBuild: true + dev: false + optional: true + + /uint8arrays@3.1.1: + resolution: {integrity: sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==} + dependencies: + multiformats: 9.9.0 + + /unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.2 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + + /unified@10.1.2: + resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + dependencies: + '@types/unist': 2.0.7 + bail: 2.0.2 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 4.1.0 + trough: 2.1.0 + vfile: 5.3.7 + dev: true + + /unique-string@3.0.0: + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} + dependencies: + crypto-random-string: 4.0.0 + dev: false + + /unist-util-generated@2.0.1: + resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} + dev: true + + /unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + dependencies: + '@types/unist': 2.0.7 + dev: true + + /unist-util-position-from-estree@1.1.2: + resolution: {integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==} + dependencies: + '@types/unist': 2.0.7 + dev: true + + /unist-util-position@4.0.4: + resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} + dependencies: + '@types/unist': 2.0.7 + dev: true + + /unist-util-remove-position@4.0.2: + resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==} + dependencies: + '@types/unist': 2.0.7 + unist-util-visit: 4.1.2 + dev: true + + /unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + dependencies: + '@types/unist': 2.0.7 + dev: true + + /unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + dependencies: + '@types/unist': 2.0.7 + unist-util-is: 5.2.1 + dev: true + + /unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + dependencies: + '@types/unist': 2.0.7 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + dev: true + + /universal-user-agent@6.0.0: + resolution: {integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==} + dev: false + + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: false + + /unload@2.2.0: + resolution: {integrity: sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==} + dependencies: + '@babel/runtime': 7.22.10 + detect-node: 2.1.0 + dev: false + + /untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + + /update-browserslist-db@1.0.11(browserslist@4.21.10): + resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.10 + escalade: 3.1.1 + picocolors: 1.0.0 + + /update-notifier@6.0.2: + resolution: {integrity: sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==} + engines: {node: '>=14.16'} + dependencies: + boxen: 7.1.1 + chalk: 5.2.0 + configstore: 6.0.0 + has-yarn: 3.0.0 + import-lazy: 4.0.0 + is-ci: 3.0.1 + is-installed-globally: 0.4.0 + is-npm: 6.0.0 + is-yarn-global: 0.4.1 + latest-version: 7.0.0 + pupa: 3.1.0 + semver: 7.5.4 + semver-diff: 4.0.0 + xdg-basedir: 5.1.0 + dev: false + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.0 + dev: true + + /url-join@5.0.0: + resolution: {integrity: sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /url-polyfill@1.1.12: + resolution: {integrity: sha512-mYFmBHCapZjtcNHW0MDq9967t+z4Dmg5CJ0KqysK3+ZbyoNOWQHksGCTWwDhxGXllkWlOc10Xfko6v4a3ucM6A==} + dev: true + + /use-callback-ref@1.3.0(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.14 + react: 18.2.0 + tslib: 2.6.1 + dev: false + + /use-isomorphic-layout-effect@1.1.2(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.14 + react: 18.2.0 + dev: false + + /use-latest@1.2.1(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.14 + react: 18.2.0 + use-isomorphic-layout-effect: 1.1.2(@types/react@18.2.14)(react@18.2.0) + dev: false + + /use-sidecar@1.1.2(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.14 + detect-node-es: 1.1.0 + react: 18.2.0 + tslib: 2.6.1 + dev: false + + /use-sync-external-store@1.2.0(react@18.2.0): + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + + /utf-8-validate@5.0.10: + resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + engines: {node: '>=6.14.2'} + requiresBuild: true + dependencies: + node-gyp-build: 4.6.0 + dev: false + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + /util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + dependencies: + inherits: 2.0.4 + is-arguments: 1.1.1 + is-generator-function: 1.0.10 + is-typed-array: 1.1.12 + which-typed-array: 1.1.11 + + /utility-types@3.10.0: + resolution: {integrity: sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==} + engines: {node: '>= 4'} + dev: false + + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + dev: false + + /uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + dequal: 2.0.3 + diff: 5.1.0 + kleur: 4.1.5 + sade: 1.8.1 + dev: true + + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + /valtio@1.10.5(react@18.2.0): + resolution: {integrity: sha512-jTp0k63VXf4r5hPoaC6a6LCG4POkVSh629WLi1+d5PlajLsbynTMd7qAgEiOSPxzoX5iNvbN7iZ/k/g29wrNiQ==} + engines: {node: '>=12.20.0'} + peerDependencies: + react: '>=16.8' + peerDependenciesMeta: + react: + optional: true + dependencies: + proxy-compare: 2.5.1 + react: 18.2.0 + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false + + /valtio@1.10.6(react@18.2.0): + resolution: {integrity: sha512-SxN1bHUmdhW6V8qsQTpCgJEwp7uHbntuH0S9cdLQtiohuevwBksbpXjwj5uDMA7bLwg1WKyq9sEpZrx3TIMrkA==} + engines: {node: '>=12.20.0'} + peerDependencies: + react: '>=16.8' + peerDependenciesMeta: + react: + optional: true + dependencies: + proxy-compare: 2.5.1 + react: 18.2.0 + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false + + /varint@6.0.0: + resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} + dev: true + + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: true + + /vfile-location@4.1.0: + resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} + dependencies: + '@types/unist': 2.0.7 + vfile: 5.3.7 + dev: true + + /vfile-message@3.1.4: + resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + dependencies: + '@types/unist': 2.0.7 + unist-util-stringify-position: 3.0.3 + dev: true + + /vfile@5.3.7: + resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + dependencies: + '@types/unist': 2.0.7 + is-buffer: 2.0.5 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + dev: true + + /viem@1.1.6(typescript@5.1.3): + resolution: {integrity: sha512-7nK3HMucLr1Yz0QnDXiD6viigKS6QeYD/YhRHpi3Bby/g0hCyZqK8+YJNtp3/Ri64tpl4kaTIeCScJWV2jqXHQ==} + peerDependencies: + typescript: '>=5.0.4' + dependencies: + '@adraffy/ens-normalize': 1.9.0 + '@noble/curves': 1.0.0 + '@noble/hashes': 1.3.0 + '@scure/bip32': 1.3.0 + '@scure/bip39': 1.2.0 + '@wagmi/chains': 1.2.0(typescript@5.1.3) + abitype: 0.8.7(typescript@5.1.3) + isomorphic-ws: 5.0.0(ws@8.12.0) + typescript: 5.1.3 + ws: 8.12.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + dev: false + + /vite-node@0.32.2(@types/node@20.3.1): + resolution: {integrity: sha512-dTQ1DCLwl2aEseov7cfQ+kDMNJpM1ebpyMMMwWzBvLbis8Nla/6c9WQcqpPssTwS6Rp/+U6KwlIj8Eapw4bLdA==} + engines: {node: '>=v14.18.0'} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4(supports-color@5.5.0) + mlly: 1.4.0 + pathe: 1.1.1 + picocolors: 1.0.0 + vite: 4.3.9(@types/node@20.3.1) + transitivePeerDependencies: + - '@types/node' + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite-plugin-svgr@3.2.0(vite@4.3.9): + resolution: {integrity: sha512-Uvq6niTvhqJU6ga78qLKBFJSDvxWhOnyfQSoKpDPMAGxJPo5S3+9hyjExE5YDj6Lpa4uaLkGc1cBgxXov+LjSw==} + peerDependencies: + vite: ^2.6.0 || 3 || 4 + dependencies: + '@rollup/pluginutils': 5.0.3 + '@svgr/core': 7.0.0 + '@svgr/plugin-jsx': 7.0.0 + vite: 4.3.9(@types/node@20.3.1) + transitivePeerDependencies: + - rollup + - supports-color + dev: true + + /vite-tsconfig-paths@3.6.0(vite@4.3.9): + resolution: {integrity: sha512-UfsPYonxLqPD633X8cWcPFVuYzx/CMNHAjZTasYwX69sXpa4gNmQkR0XCjj82h7zhLGdTWagMjC1qfb9S+zv0A==} + peerDependencies: + vite: '>2.0.0-0' + dependencies: + debug: 4.3.4(supports-color@5.5.0) + globrex: 0.1.2 + recrawl-sync: 2.2.3 + tsconfig-paths: 4.2.0 + vite: 4.3.9(@types/node@20.3.1) + transitivePeerDependencies: + - supports-color + dev: true + + /vite@4.3.9(@types/node@20.3.1): + resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 20.3.1 + esbuild: 0.17.19 + postcss: 8.4.28 + rollup: 3.28.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /vitest@0.32.2: + resolution: {integrity: sha512-hU8GNNuQfwuQmqTLfiKcqEhZY72Zxb7nnN07koCUNmntNxbKQnVbeIS6sqUgR3eXSlbOpit8+/gr1KpqoMgWCQ==} + engines: {node: '>=v14.18.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.5 + '@types/chai-subset': 1.3.3 + '@types/node': 20.3.1 + '@vitest/expect': 0.32.2 + '@vitest/runner': 0.32.2 + '@vitest/snapshot': 0.32.2 + '@vitest/spy': 0.32.2 + '@vitest/utils': 0.32.2 + acorn: 8.10.0 + acorn-walk: 8.2.0 + cac: 6.7.14 + chai: 4.3.7 + concordance: 5.0.4 + debug: 4.3.4(supports-color@5.5.0) + local-pkg: 0.4.3 + magic-string: 0.30.2 + pathe: 1.1.1 + picocolors: 1.0.0 + std-env: 3.3.3 + strip-literal: 1.3.0 + tinybench: 2.5.0 + tinypool: 0.5.0 + vite: 4.3.9(@types/node@20.3.1) + vite-node: 0.32.2(@types/node@20.3.1) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vm2@3.9.19: + resolution: {integrity: sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg==} + engines: {node: '>=6.0'} + deprecated: The library contains critical security issues and should not be used for production! The maintenance of the project has been discontinued. Consider migrating your code to isolated-vm. + hasBin: true + dependencies: + acorn: 8.10.0 + acorn-walk: 8.2.0 + dev: false + + /w3name@1.0.8: + resolution: {integrity: sha512-MjCUGATeNm70YE1Zro4mykaoRI9dTTlr44AB83Qt6OaRlcLvH9g0gyLwAMd3gBm8oDVU/RrDAxsDGcO8r+RIuQ==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + '@web-std/fetch': 4.1.2 + cborg: 1.10.2 + ipns: 0.16.0 + libp2p-crypto: 0.21.2 + throttled-queue: 2.1.4 + uint8arrays: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /wagmi@1.3.7(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3)(viem@1.1.6): + resolution: {integrity: sha512-n4Qwby0QB8/JSGjc0gGn4MWZ0BT229agEg6saPGS6VswmPjJLdkLq9qxKn1JptXxPREmb/ZvwHxU++3Z+gQJVA==} + peerDependencies: + react: '>=17.0.0' + typescript: '>=5.0.4' + viem: '>=0.3.35' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@tanstack/query-sync-storage-persister': 4.32.6 + '@tanstack/react-query': 4.32.6(react-dom@18.2.0)(react@18.2.0) + '@tanstack/react-query-persist-client': 4.32.6(@tanstack/react-query@4.32.6) + '@wagmi/core': 1.3.6(@types/react@18.2.14)(react@18.2.0)(typescript@5.1.3)(viem@1.1.6) + abitype: 0.8.7(typescript@5.1.3) + react: 18.2.0 + typescript: 5.1.3 + use-sync-external-store: 1.2.0(react@18.2.0) + viem: 1.1.6(typescript@5.1.3) + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + - '@types/react' + - bufferutil + - encoding + - immer + - lokijs + - react-dom + - react-native + - supports-color + - utf-8-validate + - zod + dev: false + + /watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + dev: true + + /wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + dependencies: + defaults: 1.0.4 + dev: false + + /web-encoding@1.1.5: + resolution: {integrity: sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==} + dependencies: + util: 0.12.5 + optionalDependencies: + '@zxing/text-encoding': 0.9.0 + dev: true + + /web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + dev: true + + /web-streams-polyfill@3.2.1: + resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} + engines: {node: '>= 8'} + + /web3.storage@4.5.4(node-fetch@3.3.1): + resolution: {integrity: sha512-QSdiPEMgXCkk9Y0y3U1pyTu8n1TOOctwq7h9Loz7NYPla9QZesbg4lSxe0XWPltzyJEkI43yC1hy8gNxNEiizA==} + dependencies: + '@ipld/car': 3.2.4 + '@web-std/blob': 3.0.4 + '@web-std/fetch': 3.0.3 + '@web-std/file': 3.0.2 + '@web3-storage/parse-link-header': 3.1.0 + browser-readablestream-to-it: 1.0.3 + carbites: 1.0.6 + cborg: 1.10.2 + files-from-path: 0.2.6 + ipfs-car: 0.7.0(node-fetch@3.3.1) + libp2p-crypto: 0.21.2 + p-retry: 4.6.2 + streaming-iterables: 6.2.0 + throttled-queue: 2.1.4 + uint8arrays: 3.1.1 + w3name: 1.0.8 + transitivePeerDependencies: + - encoding + - node-fetch + - supports-color + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + /webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + dev: true + + /webpack@5.88.2: + resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.4 + '@types/estree': 1.0.1 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/wasm-edit': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + acorn: 8.10.0 + acorn-import-assertions: 1.9.0(acorn@8.10.0) + browserslist: 4.21.10 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.15.0 + es-module-lexer: 1.3.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.9(webpack@5.88.2) + watchpack: 2.4.0 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + dev: true + + /well-known-symbols@2.0.0: + resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} + engines: {node: '>=6'} + dev: true + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + + /which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + dev: false + + /which-typed-array@1.1.11: + resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + + /why-is-node-running@2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + dev: true + + /widest-line@4.0.1: + resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + + /wif@2.0.6: + resolution: {integrity: sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ==} + dependencies: + bs58check: 2.1.2 + dev: false + + /wildcard-match@5.1.2: + resolution: {integrity: sha512-qNXwI591Z88c8bWxp+yjV60Ch4F8Riawe3iGxbzquhy8Xs9m+0+SLFBGb/0yCTIDElawtaImC37fYZ+dr32KqQ==} + dev: false + + /windows-release@5.1.1: + resolution: {integrity: sha512-NMD00arvqcq2nwqc5Q6KtrSRHK+fVD31erE5FEMahAw5PmVCgD7MUXodq3pdZSUkqA9Cda2iWx6s1XYwiJWRmw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + execa: 5.1.1 + dev: false + + /word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + dev: false + + /wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + dev: false + + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + dev: false + + /ws@7.4.6: + resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false + + /ws@7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false + + /ws@8.12.0: + resolution: {integrity: sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==} + 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 + dev: false + + /ws@8.13.0(bufferutil@4.0.7)(utf-8-validate@5.0.10): + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + 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 + dependencies: + bufferutil: 4.0.7 + utf-8-validate: 5.0.10 + dev: false + + /ws@8.5.0: + resolution: {integrity: sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==} + 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 + dev: false + + /xdg-basedir@5.1.0: + resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} + engines: {node: '>=12'} + dev: false + + /xstream@11.14.0: + resolution: {integrity: sha512-1bLb+kKKtKPbgTK6i/BaoAn03g47PpFstlbe1BA+y3pNS/LfvcaghS5BFf9+EE1J+KwSQsEpfJvFN5GqFtiNmw==} + dependencies: + globalthis: 1.0.3 + symbol-observable: 2.0.3 + dev: false + + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: false + + /y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + dev: false + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: false + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + dev: false + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: false + + /yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + dev: false + + /yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + dev: false + + /ylru@1.3.2: + resolution: {integrity: sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==} + engines: {node: '>= 4.0.0'} + dev: true + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true + + /zustand@4.4.1(@types/react@18.2.14)(react@18.2.0): + resolution: {integrity: sha512-QCPfstAS4EBiTQzlaGP1gmorkh/UL1Leaj2tdj+zZCZ/9bm0WS7sI2wnfD5lpOszFqWJ1DcPnGoY8RDL61uokw==} + engines: {node: '>=12.7.0'} + peerDependencies: + '@types/react': '>=16.8' + immer: '>=9.0' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + dependencies: + '@types/react': 18.2.14 + react: 18.2.0 + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false + + /zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + dev: true + + github.com/release-it/conventional-changelog/a4acfeac76369937a6566d698a5ae9180eceb413(release-it@15.11.0): + resolution: {tarball: https://codeload.github.com/release-it/conventional-changelog/tar.gz/a4acfeac76369937a6566d698a5ae9180eceb413} + id: github.com/release-it/conventional-changelog/a4acfeac76369937a6566d698a5ae9180eceb413 + name: '@release-it/conventional-changelog' + version: 7.0.0 + engines: {node: '>=16'} + peerDependencies: + release-it: ^16.0.0 + dependencies: + concat-stream: 2.0.0 + conventional-changelog: 4.0.0 + conventional-recommended-bump: 7.0.1 + release-it: 15.11.0 + semver: 7.5.1 + dev: false diff --git a/public/.well-known/apple-app-site-association b/public/.well-known/apple-app-site-association new file mode 100644 index 0000000..5327918 --- /dev/null +++ b/public/.well-known/apple-app-site-association @@ -0,0 +1,81 @@ +{ + "applinks": { + "apps": [], + "details": [ + { + "appIDs": [ + "75C6UARB5H.exchangeV4.dydx.trading" + ], + "components": [ + { + "/": "/trade/*" + }, + { + "/": "/r/*" + }, + { + "/": "/portfolio/overview" + }, + { + "/": "/portfolio/positions" + }, + { + "/": "/portfolio/orders" + }, + { + "/": "/portfolio/fees" + }, + { + "/": "/portfolio/history" + }, + { + "/": "/portfolio/history/trades" + }, + { + "/": "/portfolio/history/transfers" + }, + { + "/": "/portfolio/history/funding" + }, + { + "/": "/rewards" + }, + { + "/": "/my-profile" + }, + { + "/": "/rankings/hedgies" + }, + { + "/": "/rankings/competition" + }, + { + "/": "/rankings/diamond" + }, + { + "/": "/rankings/platinum" + }, + { + "/": "/rankings/gold" + }, + { + "/": "/rankings/silver" + }, + { + "/": "/rankings/bronze" + }, + { + "/": "/rankings/pnl-absolute" + }, + { + "/": "/rankings/pnl-percent" + }, + { + "/": "/walletsegue", + "comment": "Callback link for WalletSegue/Coinbase SDK" + } + ] + } + ] + } +} diff --git a/public/chart-background.png b/public/chart-background.png new file mode 100644 index 0000000..b432435 Binary files /dev/null and b/public/chart-background.png differ diff --git a/public/currencies/1inch.svg b/public/currencies/1inch.svg new file mode 100644 index 0000000..e36edef --- /dev/null +++ b/public/currencies/1inch.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/currencies/aave.svg b/public/currencies/aave.svg new file mode 100644 index 0000000..2a53a2f --- /dev/null +++ b/public/currencies/aave.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/currencies/ada.svg b/public/currencies/ada.svg new file mode 100644 index 0000000..d71c076 --- /dev/null +++ b/public/currencies/ada.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/currencies/algo.svg b/public/currencies/algo.svg new file mode 100644 index 0000000..36af390 --- /dev/null +++ b/public/currencies/algo.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/currencies/atom.svg b/public/currencies/atom.svg new file mode 100644 index 0000000..1875c4e --- /dev/null +++ b/public/currencies/atom.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/currencies/avax.svg b/public/currencies/avax.svg new file mode 100644 index 0000000..5881cae --- /dev/null +++ b/public/currencies/avax.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/currencies/bch.svg b/public/currencies/bch.svg new file mode 100644 index 0000000..704fbe2 --- /dev/null +++ b/public/currencies/bch.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/currencies/btc.svg b/public/currencies/btc.svg new file mode 100644 index 0000000..2a279b8 --- /dev/null +++ b/public/currencies/btc.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/currencies/celo.svg b/public/currencies/celo.svg new file mode 100644 index 0000000..46fdaef --- /dev/null +++ b/public/currencies/celo.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/currencies/comp.svg b/public/currencies/comp.svg new file mode 100644 index 0000000..396dd3f --- /dev/null +++ b/public/currencies/comp.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/currencies/crv.svg b/public/currencies/crv.svg new file mode 100644 index 0000000..a2b652a --- /dev/null +++ b/public/currencies/crv.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/currencies/dai.svg b/public/currencies/dai.svg new file mode 100644 index 0000000..3eef327 --- /dev/null +++ b/public/currencies/dai.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/currencies/doge.svg b/public/currencies/doge.svg new file mode 100644 index 0000000..9b64d2a --- /dev/null +++ b/public/currencies/doge.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/currencies/dot.svg b/public/currencies/dot.svg new file mode 100644 index 0000000..832e601 --- /dev/null +++ b/public/currencies/dot.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/currencies/dydx.svg b/public/currencies/dydx.svg new file mode 100644 index 0000000..8b76522 --- /dev/null +++ b/public/currencies/dydx.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/currencies/enj.svg b/public/currencies/enj.svg new file mode 100644 index 0000000..c20170e --- /dev/null +++ b/public/currencies/enj.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/currencies/eos.svg b/public/currencies/eos.svg new file mode 100644 index 0000000..5d41cef --- /dev/null +++ b/public/currencies/eos.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/currencies/etc.svg b/public/currencies/etc.svg new file mode 100644 index 0000000..4ab7fdd --- /dev/null +++ b/public/currencies/etc.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/currencies/eth.svg b/public/currencies/eth.svg new file mode 100644 index 0000000..bafa3fb --- /dev/null +++ b/public/currencies/eth.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/currencies/fil.svg b/public/currencies/fil.svg new file mode 100644 index 0000000..4a976fc --- /dev/null +++ b/public/currencies/fil.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/currencies/icp.svg b/public/currencies/icp.svg new file mode 100644 index 0000000..f72ae2a --- /dev/null +++ b/public/currencies/icp.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/currencies/link.svg b/public/currencies/link.svg new file mode 100644 index 0000000..791620a --- /dev/null +++ b/public/currencies/link.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/currencies/ltc.svg b/public/currencies/ltc.svg new file mode 100644 index 0000000..72b91b1 --- /dev/null +++ b/public/currencies/ltc.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/currencies/luna.svg b/public/currencies/luna.svg new file mode 100644 index 0000000..8bc974e --- /dev/null +++ b/public/currencies/luna.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/currencies/matic.svg b/public/currencies/matic.svg new file mode 100644 index 0000000..7c57c76 --- /dev/null +++ b/public/currencies/matic.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/currencies/mkr.svg b/public/currencies/mkr.svg new file mode 100644 index 0000000..ef4ed96 --- /dev/null +++ b/public/currencies/mkr.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/currencies/near.svg b/public/currencies/near.svg new file mode 100644 index 0000000..24924fd --- /dev/null +++ b/public/currencies/near.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/currencies/rune.svg b/public/currencies/rune.svg new file mode 100644 index 0000000..d440bcc --- /dev/null +++ b/public/currencies/rune.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/currencies/snx.svg b/public/currencies/snx.svg new file mode 100644 index 0000000..cc17b6c --- /dev/null +++ b/public/currencies/snx.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/currencies/sol.svg b/public/currencies/sol.svg new file mode 100644 index 0000000..945180d --- /dev/null +++ b/public/currencies/sol.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/public/currencies/sushi.svg b/public/currencies/sushi.svg new file mode 100644 index 0000000..0aaf816 --- /dev/null +++ b/public/currencies/sushi.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/currencies/trx.svg b/public/currencies/trx.svg new file mode 100644 index 0000000..5264027 --- /dev/null +++ b/public/currencies/trx.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/currencies/uma.svg b/public/currencies/uma.svg new file mode 100644 index 0000000..7018b44 --- /dev/null +++ b/public/currencies/uma.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/public/currencies/uni.svg b/public/currencies/uni.svg new file mode 100644 index 0000000..ee75b27 --- /dev/null +++ b/public/currencies/uni.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/currencies/usdc.svg b/public/currencies/usdc.svg new file mode 100644 index 0000000..f9d1daf --- /dev/null +++ b/public/currencies/usdc.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/currencies/usdt.svg b/public/currencies/usdt.svg new file mode 100644 index 0000000..c0fb8ac --- /dev/null +++ b/public/currencies/usdt.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/currencies/wbtc.svg b/public/currencies/wbtc.svg new file mode 100644 index 0000000..851bc71 --- /dev/null +++ b/public/currencies/wbtc.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/public/currencies/weth.svg b/public/currencies/weth.svg new file mode 100644 index 0000000..5e6f777 --- /dev/null +++ b/public/currencies/weth.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/public/currencies/xlm.svg b/public/currencies/xlm.svg new file mode 100644 index 0000000..c8199e7 --- /dev/null +++ b/public/currencies/xlm.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/currencies/xmr.svg b/public/currencies/xmr.svg new file mode 100644 index 0000000..094d88e --- /dev/null +++ b/public/currencies/xmr.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/currencies/xtz.svg b/public/currencies/xtz.svg new file mode 100644 index 0000000..d1db8cc --- /dev/null +++ b/public/currencies/xtz.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/currencies/yfi.svg b/public/currencies/yfi.svg new file mode 100644 index 0000000..76d50cd --- /dev/null +++ b/public/currencies/yfi.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/currencies/zec.svg b/public/currencies/zec.svg new file mode 100644 index 0000000..cd96550 --- /dev/null +++ b/public/currencies/zec.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/currencies/zrx.svg b/public/currencies/zrx.svg new file mode 100644 index 0000000..ec94152 --- /dev/null +++ b/public/currencies/zrx.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/dydx-testnet.png b/public/dydx-testnet.png new file mode 100644 index 0000000..ee14ca4 Binary files /dev/null and b/public/dydx-testnet.png differ diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..cacd0d9 --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/public/grid-loader.svg b/public/grid-loader.svg new file mode 100644 index 0000000..939b972 --- /dev/null +++ b/public/grid-loader.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/logos/logo-mark-dark.svg b/public/logos/logo-mark-dark.svg new file mode 100644 index 0000000..2ab74e8 --- /dev/null +++ b/public/logos/logo-mark-dark.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/logos/logo-mark-light.svg b/public/logos/logo-mark-light.svg new file mode 100644 index 0000000..6422cf4 --- /dev/null +++ b/public/logos/logo-mark-light.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/scripts/inject-amplitude.js b/scripts/inject-amplitude.js new file mode 100644 index 0000000..6848b45 --- /dev/null +++ b/scripts/inject-amplitude.js @@ -0,0 +1,35 @@ +import fs from 'fs/promises'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const AMPLITUDE_API_KEY = process.env.AMPLITUDE_API_KEY; + +const currentPath = fileURLToPath(import.meta.url); +const projectRoot = path.dirname(currentPath); +const htmlFilePath = path.resolve(projectRoot, '../dist/index.html'); + +if(AMPLITUDE_API_KEY){ + try { + const html = await fs.readFile(htmlFilePath, 'utf-8'); + + const amplitudeCdnScript = ` + `; + + const amplitudeListenerScript = ``; + + const injectedHtml = html.replace( + '
', + `
\n${amplitudeCdnScript}\n${amplitudeListenerScript}` + ); + + await fs.writeFile(htmlFilePath, injectedHtml, 'utf-8'); + + console.log('Amplitude scripts successfully injected.'); + } catch (err) { + console.error('Error injecting Amplitude scripts:', err); + } +} diff --git a/scripts/inject-bugsnag.js b/scripts/inject-bugsnag.js new file mode 100644 index 0000000..114ec87 --- /dev/null +++ b/scripts/inject-bugsnag.js @@ -0,0 +1,81 @@ +import fs from 'fs/promises'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const BUGSNAG_API_KEY = process.env.BUGSNAG_API_KEY; + +const currentPath = fileURLToPath(import.meta.url); +const projectRoot = path.dirname(currentPath); +const htmlFilePath = path.resolve(projectRoot, '../dist/index.html'); + +try { + const html = await fs.readFile(htmlFilePath, 'utf-8'); + + const scripts = ` + + + + + `; + + const injectedHtml = html.replace( + '
', + `
\n${scripts}\n` + ); + + await fs.writeFile(htmlFilePath, injectedHtml, 'utf-8'); + + console.log('Bugsnag scripts successfully injected.'); +} catch (err) { + console.error('Error injecting Bugsnag scripts:', err); +} diff --git a/scripts/inject-statuspage.js b/scripts/inject-statuspage.js new file mode 100644 index 0000000..0315cbf --- /dev/null +++ b/scripts/inject-statuspage.js @@ -0,0 +1,28 @@ +import fs from 'fs/promises'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const STATUS_PAGE_SCRIPT_URI = process.env.STATUS_PAGE_SCRIPT_URI; + +const currentPath = fileURLToPath(import.meta.url); +const projectRoot = path.dirname(currentPath); +const htmlFilePath = path.resolve(projectRoot, '../dist/index.html'); + +if (STATUS_PAGE_SCRIPT_URI) { + try { + const html = await fs.readFile(htmlFilePath, 'utf-8'); + + const statusPageScript = ``; + + const injectedHtml = html.replace( + '
', + `
\n${statusPageScript}\n` + ); + + await fs.writeFile(htmlFilePath, injectedHtml, 'utf-8'); + + console.log('StatusPage script successfully injected.'); + } catch (err) { + console.error('Error injecting StatusPage scripts:', err); + } +} diff --git a/scripts/update-ipns.js b/scripts/update-ipns.js new file mode 100644 index 0000000..dc68562 --- /dev/null +++ b/scripts/update-ipns.js @@ -0,0 +1,72 @@ +/** + * Updates an existing IPNS record or creates a new IPNS record using w3name. + * @param {string} cid The CID to publish to IPNS + * @param {string} keyPath The path to the signing key + * @param {boolean} newIpns Whether to create a new IPNS record + * @param {boolean} verbose Whether to print verbose output + */ + +import * as Name from 'w3name'; +import fs from 'fs'; +import minimist from 'minimist'; +import process from 'process'; + +const SIGNING_KEY_PATH = '.web3name.key'; + +async function saveSigningKey(name, outputFilename = SIGNING_KEY_PATH) { + const bytes = name.key.bytes; + await fs.promises.writeFile(outputFilename, bytes); +} + +async function loadSigningKey(filename) { + const bytes = await fs.promises.readFile(filename); + const name = await Name.from(bytes); + return name; +} + +const { + cid, + key: keyPath, + newIpns, + verbose, +} = minimist(process.argv.slice(2), { + string: ['cid', 'key'], + boolean: ['newIpns', 'verbose'], + default: { verbose: false }, + alias: { c: 'cid', k: 'key' }, +}); + +if (!cid) { + console.error('Error: Provide the CID with the --cid flag.'); + process.exit(1); +} + +if (!keyPath && !newIpns) { + console.error( + 'Error: To update an existing IPNS record, provide the path to the key file with the --key flag or create a new IPNS record with the --newIpns flag.' + ); + process.exit(1); +} + +let name; +let newRevision; + +if (newIpns) { + if (verbose) console.log(`Creating new IPNS record with cid ${cid}...`); + name = await Name.create(); + newRevision = await Name.v0(name, `/ipfs/${cid}`); + + await saveSigningKey(name, keyPath); + if (verbose) + console.log(`The associated signing key is saved to ${keyPath ?? SIGNING_KEY_PATH}`); +} else { + if (verbose) console.log(`Updating existing IPNS record with cid ${cid}...`); + name = await loadSigningKey(keyPath); + const latestRevision = await Name.resolve(name); + newRevision = await Name.increment(latestRevision, `/ipfs/${cid}`); +} + +if (verbose) console.log('Publishing...'); +await Name.publish(newRevision, name.key); + +console.log(`ipns://${name.toString()}`); diff --git a/scripts/upload-ipfs.js b/scripts/upload-ipfs.js new file mode 100644 index 0000000..34ce151 --- /dev/null +++ b/scripts/upload-ipfs.js @@ -0,0 +1,48 @@ +/** + * Uploads contents of the build directory to web3.storage, + * and returns the CID, which is available over the IPFS network. + * @param {boolean} rebuild Whether to rebuild the site before uploading, defaults to true + * @param {string} env The environment to build for, defaults to 'staging' + * @param {boolean} verbose Whether to print verbose output + */ + +import fs from 'fs'; +import minimist from 'minimist'; +import process from 'process'; +import { Web3Storage, getFilesFromPath } from 'web3.storage'; +import { execSync } from 'child_process'; + +const BUILD_DIR_PATH = 'dist'; +const API_TOKEN = process.env.WEB3_STORAGE_TOKEN; + +const { rebuild, env, verbose } = minimist(process.argv.slice(2), { + string: ['env'], + boolean: ['rebuild', 'verbose'], + default: { env: 'staging', rebuild: true, verbose: false }, + alias: { e: 'env' }, +}); + +if (!API_TOKEN) { + console.error( + 'Error: An API token is required. Create one at https://web3.storage and set the WEB3_STORAGE_TOKEN environment variable.' + ); + process.exit(1); +} + +if (rebuild || !fs.existsSync(BUILD_DIR_PATH)) { + if (verbose) console.log(`Building ${env}...`); + execSync(`pnpm run build --mode ${env} > /dev/null 2>&1`, { stdio: 'inherit' }); +} + +const client = new Web3Storage({ token: API_TOKEN }); +const files = await getFilesFromPath(BUILD_DIR_PATH); + +if (verbose) console.log(`Uploading ${files.length} files to web3.storage...`); +const cid = await client.put(files, { wrapWithDirectory: false }); + +if (verbose) { + console.log('Content added with CID:', cid); + console.log(`https://dweb.link/ipfs/${cid}`); +} else { + console.log(cid); +} diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..e1ccfe3 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,198 @@ +import { Suspense } from 'react'; +import { Navigate, Route, Routes } from 'react-router-dom'; +import styled, { AnyStyledComponent, css } from 'styled-components'; +import { WagmiConfig } from 'wagmi'; +import { QueryClient, QueryClientProvider } from 'react-query'; +import { GrazProvider } from 'graz'; + +import { AppRoute, DEFAULT_TRADE_ROUTE } from '@/constants/routes'; + +import { useBreakpoints, useInitializePage, useShouldShowFooter, useAnalytics } from '@/hooks'; +import { DydxProvider } from '@/hooks/useDydxClient'; +import { AccountsProvider } from '@/hooks/useAccounts'; +import { SubaccountProvider } from './hooks/useSubaccount'; +import { DialogAreaProvider, useDialogArea } from './hooks/useDialogArea'; +import { NotificationsProvider } from './hooks/useNotifications'; + +import { GuardedMobileRoute } from '@/components/GuardedMobileRoute'; + +import MarketsPage from '@/pages/markets/Markets'; +import PortfolioPage from '@/pages/portfolio/Portfolio'; +import { AlertsPage } from '@/pages/AlertsPage'; +import ProfilePage from '@/pages/Profile'; +import { SettingsPage } from '@/pages/settings/Settings'; +import TradePage from '@/pages/trade/Trade'; +import { RewardsPage } from '@/pages/rewards/RewardsPage'; + +import { HeaderDesktop } from '@/layout/Header/HeaderDesktop'; +import { FooterDesktop } from '@/layout/Footer/FooterDesktop'; +import { FooterMobile } from '@/layout/Footer/FooterMobile'; +import { NotificationsToastArea } from '@/layout/NotificationsToastArea'; +import { DialogManager } from '@/layout/DialogManager'; +import { GlobalCommandDialog } from '@/views/dialogs/GlobalCommandDialog'; + +import { config } from '@/lib/wagmi'; + +import { breakpoints } from '@/styles'; +import { layoutMixins } from '@/styles/layoutMixins'; + +import '@/styles/constants.css'; +import '@/styles/fonts.css'; +import '@/styles/web3modal.css'; + +const queryClient = new QueryClient(); + +const Content = () => { + const { setDialogArea } = useDialogArea(); + + useInitializePage(); + useAnalytics(); + + const { isTablet, isNotTablet } = useBreakpoints(); + const isShowingHeader = isNotTablet; + const isShowingFooter = useShouldShowFooter(); + + return ( + + {isNotTablet && } + + + + + + } /> + } + /> + + } /> + {import.meta.env.MODE !== 'production' && ( + } /> + )} + {isTablet && ( + <> + } /> + } /> + } /> + + )} + + }> + } /> + + } /> + + + + + {isTablet ? : } + + + + + + + + + + ); +}; + +const App = () => ( + + + + + + + + + + + + + + + + + +); + +const Styled: Record = {}; + +Styled.Content = styled.div<{ isShowingHeader: boolean; isShowingFooter: boolean }>` + /* Computed */ + --page-currentHeaderHeight: 0px; + --page-currentFooterHeight: 0px; + + ${({ isShowingHeader }) => + isShowingHeader && + css` + --page-currentHeaderHeight: var(--page-header-height); + + @media ${breakpoints.tablet} { + --page-currentHeaderHeight: var(--page-header-height-mobile); + } + `} + + ${({ isShowingFooter }) => + isShowingFooter && + css` + --page-currentFooterHeight: var(--page-footer-height); + + @media ${breakpoints.tablet} { + --page-currentFooterHeight: var(--page-footer-height-mobile); + } + `} + + /* Rules */ + ${layoutMixins.contentContainer} + + ${layoutMixins.scrollArea} + --scrollArea-height: 100vh; + + @supports (-webkit-touch-callout: none) { + height: -webkit-fill-available; + } + + ${layoutMixins.stickyArea0} + --stickyArea0-topHeight: var(--page-currentHeaderHeight); + --stickyArea0-topGap: var(--border-width); + --stickyArea0-bottomGap: var(--border-width); + --stickyArea0-bottomHeight: var(--page-currentFooterHeight); + + ${layoutMixins.withOuterAndInnerBorders} + display: grid; + grid-template: + 'Header' var(--page-currentHeaderHeight) + 'Main' minmax(min-content, 1fr) + 'Footer' var(--page-currentFooterHeight) + / 100%; + + transition: 0.3s var(--ease-out-expo); +`; + +Styled.Main = styled.main` + ${layoutMixins.contentSectionAttached} + + grid-area: Main; + + isolation: isolate; + + position: relative; +`; + +Styled.NotificationsToastArea = styled(NotificationsToastArea)` + grid-area: Main; + z-index: 2; +`; + +Styled.DialogArea = styled.aside` + position: absolute; + inset: 0; + overflow: clip; + ${layoutMixins.noPointerEvents} +`; + +export default App; diff --git a/src/components/AlertMessage.stories.tsx b/src/components/AlertMessage.stories.tsx new file mode 100644 index 0000000..b876a8e --- /dev/null +++ b/src/components/AlertMessage.stories.tsx @@ -0,0 +1,30 @@ +import type { Story } from '@ladle/react'; + +import { AlertType } from '@/constants/alerts'; + +import { + AlertMessage as AlertMessageComponent, + AlertMessageProps, +} from '@/components/AlertMessage'; + +import { StoryWrapper } from '.ladle/components'; + +export const AlertMessage: Story = (args) => { + return ( + + + + ); +}; + +AlertMessage.args = { + children: 'This is an alert message', +}; + +AlertMessage.argTypes = { + type: { + options: Object.values(AlertType), + control: { type: 'select' }, + defaultValue: AlertType.Success, + }, +}; diff --git a/src/components/AlertMessage.tsx b/src/components/AlertMessage.tsx new file mode 100644 index 0000000..ba30b00 --- /dev/null +++ b/src/components/AlertMessage.tsx @@ -0,0 +1,81 @@ +import styled, { css } from 'styled-components'; + +import { AlertType } from '@/constants/alerts'; +import { layoutMixins } from '@/styles/layoutMixins'; + +type StyleProps = { + className?: string; + type: AlertType; +}; + +type ElementProps = { + children: React.ReactNode; +}; + +export type AlertMessageProps = ElementProps & StyleProps; + +export const AlertMessage: React.FC = ({ className, children, type }) => { + return ( + + {children} + + ); +}; + +const AlertContainer = styled.div` + ${layoutMixins.column} + + --alert-accent-color: transparent; + --alert-default-background-opacity: 0.1; + --alert-background: linear-gradient(transparent, var(--alert-accent-color)) 0 + clamp(0%, var(--alert-default-background-opacity) * 100%, 100%) / auto 10000vmax; + + ${({ type }) => { + switch (type) { + case AlertType.Error: { + return css` + --alert-accent-color: var(--color-error); + `; + } + case AlertType.Info: { + return css` + --alert-accent-color: var(--color-text-1); + + --alert-default-background-opacity: 0.133; // Relative + // --alert-background: var(--color-layer-6); // Absolute + `; + } + case AlertType.Success: { + return css` + --alert-accent-color: var(--color-success); + `; + } + case AlertType.Warning: { + return css` + --alert-accent-color: var(--color-warning); + `; + } + default: + return ''; + } + }} + + overflow: auto; + position: relative; + max-height: 12.5rem; + gap: 0.25em; + + font-size: 0.8125em; + + padding: 0.625em 0.75em; + + color: var(--color-text-2); + + background: var(--alert-background); + border-left: 0.25em solid var(--alert-accent-color); + border-radius: 0.25em; + + white-space: pre-wrap; + + user-select: all; +`; diff --git a/src/components/AssetIcon.stories.tsx b/src/components/AssetIcon.stories.tsx new file mode 100644 index 0000000..00f9445 --- /dev/null +++ b/src/components/AssetIcon.stories.tsx @@ -0,0 +1,17 @@ +import type { Story } from '@ladle/react'; + +import { AssetIcon as AssetIconComponent } from '@/components/AssetIcon'; + +import { StoryWrapper } from '.ladle/components'; + +export const AssetIcon: Story<{ symbol: string }> = (args) => { + return ( + + + + ); +}; + +AssetIcon.args = { + symbol: 'ETH', +}; diff --git a/src/components/AssetIcon.tsx b/src/components/AssetIcon.tsx new file mode 100644 index 0000000..085376b --- /dev/null +++ b/src/components/AssetIcon.tsx @@ -0,0 +1,72 @@ +import styled, { type AnyStyledComponent } from 'styled-components'; + +export type AssetSymbol = keyof typeof assetIcons; + +const assetIcons = { + '1INCH': '/currencies/1inch.svg', + 'AAVE': '/currencies/aave.svg', + 'ADA': '/currencies/ada.svg', + 'ALGO': '/currencies/algo.svg', + 'ATOM': '/currencies/atom.svg', + 'AVAX': '/currencies/avax.svg', + 'BCH': '/currencies/bch.svg', + 'BTC': '/currencies/btc.svg', + 'CELO': '/currencies/celo.svg', + 'COMP': '/currencies/comp.svg', + 'CRV': '/currencies/crv.svg', + 'DAI': '/currencies/dai.svg', + 'DOGE': '/currencies/doge.svg', + 'DOT': '/currencies/dot.svg', + 'DYDX': '/currencies/dydx.svg', + 'ENJ': '/currencies/enj.svg', + 'EOS': '/currencies/eos.svg', + 'ETC': '/currencies/etc.svg', + 'ETH': '/currencies/eth.svg', + 'FIL': '/currencies/fil.svg', + 'ICP': '/currencies/icp.svg', + 'LINK': '/currencies/link.svg', + 'LTC': '/currencies/ltc.svg', + 'LUNA': '/currencies/luna.svg', + 'MATIC': '/currencies/matic.svg', + 'MKR': '/currencies/mkr.svg', + 'NEAR': '/currencies/near.svg', + 'RUNE': '/currencies/rune.svg', + 'SNX': '/currencies/snx.svg', + 'SOL': '/currencies/sol.svg', + 'SUSHI': '/currencies/sushi.svg', + 'TRX': '/currencies/trx.svg', + 'UMA': '/currencies/uma.svg', + 'UNI': '/currencies/uni.svg', + 'USDC': '/currencies/usdc.svg', + 'USDT': '/currencies/usdt.svg', + 'WBTC': '/currencies/wbtc.svg', + 'WETH': '/currencies/weth.svg', + 'XLM': '/currencies/xlm.svg', + 'XMR': '/currencies/xmr.svg', + 'XTZ': '/currencies/xtz.svg', + 'YFI': '/currencies/yfi.svg', + 'ZEC': '/currencies/zec.svg', + 'ZRX': '/currencies/zrx.svg', +} as const; + +export const AssetIcon = ({ + symbol, + className +}: { + symbol?: AssetSymbol, + className?: string +}) => ( + symbol ? ( + + ) : null +); + +const Styled: Record = {}; + +Styled.Img = styled.img` + width: auto; + height: 1em; +`; diff --git a/src/components/BackButton.stories.tsx b/src/components/BackButton.stories.tsx new file mode 100644 index 0000000..6ec220f --- /dev/null +++ b/src/components/BackButton.stories.tsx @@ -0,0 +1,22 @@ +import type { Story } from '@ladle/react'; +import { MemoryRouter } from 'react-router-dom'; + +import { BackButton } from '@/components/BackButton'; + +import { StoryWrapper } from '.ladle/components'; + +export const BackButtonStory: Story = () => { + return ( + + + + ); +}; + +BackButtonStory.decorators = [ + (Story) => ( + + + + ), +]; diff --git a/src/components/BackButton.tsx b/src/components/BackButton.tsx new file mode 100644 index 0000000..9c40b64 --- /dev/null +++ b/src/components/BackButton.tsx @@ -0,0 +1,31 @@ +import { ButtonAction, ButtonSize } from '@/constants/buttons'; + +import { IconName } from '@/components/Icon'; +import { IconButton } from '@/components/IconButton'; + +type ElementProps = { + onClick?: () => void; +}; + +export const BackButton = ({ + onClick = () => { + // @ts-ignore + const navigation = globalThis.navigation; + + if (!navigation) { + globalThis.history?.back(); + // @ts-ignore + } else if (navigation.canGoBack) { + navigation.back(); + } else { + navigation.navigate('/', { replace: true }); + } + }, +}: ElementProps) => ( + +); diff --git a/src/components/BaseButton.tsx b/src/components/BaseButton.tsx new file mode 100644 index 0000000..c8cf630 --- /dev/null +++ b/src/components/BaseButton.tsx @@ -0,0 +1,198 @@ +import { forwardRef } from 'react'; +import styled, { css } from 'styled-components'; + +import { ButtonShape, ButtonSize, ButtonType } from '@/constants/buttons'; + +type ElementProps = { + disabled?: boolean; + type?: ButtonType; + children?: React.ReactNode; + href?: string; + onClick?: React.MouseEventHandler | React.MouseEventHandler; +}; + +type StyleProps = { + size?: ButtonSize; + shape?: ButtonShape; + className?: string; +}; + +export type BaseButtonProps = ElementProps & Omit; + +export const BaseButton = forwardRef( + ( + { + disabled, + type = ButtonType.Button, + size, + shape, + + href, + + onClick, + + children, + className, + + ...otherProps + }, + ref + ) => { + return type === ButtonType.Link ? ( + } + // Native + href={href} + rel={href ? 'noopener noreferrer' : undefined} + target={href ? '_blank' : undefined} + // Style + size={size} + shape={shape} + className={className} + // Events + onClick={onClick as React.MouseEventHandler} + // Other + {...otherProps} + > + {children} + + ) : ( + } + // Native + type={type} + disabled={disabled} + // Style + size={size} + shape={shape} + className={className} + // Events + onClick={onClick as React.MouseEventHandler} + // Other + {...otherProps} + > + {children} + + ); + } +); + +const buttonSizeVariants = { + [ButtonSize.XSmall]: css` + --button-font: var(--font-mini-book); + --button-height: 1.75rem; + `, + [ButtonSize.Small]: css` + --button-font: var(--font-small-book); + --button-height: 2.25rem; + `, + [ButtonSize.Base]: css` + --button-font: var(--font-base-book); + --button-height: 2.75rem; + `, + [ButtonSize.Medium]: css` + --button-font: var(--font-medium-medium); + --button-height: 3.25rem; + `, + [ButtonSize.Large]: css` + --button-font: var(--font-large-book); + --button-height: 3.5rem; + `, + [ButtonSize.XLarge]: css` + --button-font: var(--font-large-medium); + --button-height: 3.75rem; + `, +}; + +const buttonShapeVariants = { + [ButtonShape.Circle]: css` + --button-width: var(--button-height); + --button-radius: 50%; + `, + [ButtonShape.Rectangle]: css` + --button-radius: 0.5em; + `, + [ButtonShape.Square]: css` + --button-width: var(--button-height); + --button-radius: 0.5em; + `, + [ButtonShape.Pill]: css` + --button-radius: 6em; + `, +}; + +const ButtonStyle = css` + // Props/defaults + + --button-font: var(--font-base-book); + + --button-width: auto; + --button-height: 2.75rem; + --button-padding: 0 0.625em; + + --button-textColor: var(--color-text-0); + --button-backgroundColor: transparent; + --button-active-filter: brightness(0.9); + --button-hover-filter: brightness(1.1); + --button-hover-textColor: var(--button-textColor); + + --button-radius: 0.5em; + --button-border: solid var(--border-width) var(--color-layer-6); + + --button-cursor: pointer; + + // Variants + + ${({ size }) => size && buttonSizeVariants[size]} + ${({ shape }) => shape && buttonShapeVariants[shape]} + + // Rules + + font: var(--button-font); + + display: inline-flex; + flex-direction: row; + justify-content: center; + align-items: center; + width: var(--button-width); + height: var(--button-height); + padding: var(--button-padding); + gap: 0.5ch; + + background-color: var(--button-backgroundColor); + border: var(--button-border); + border-radius: var(--button-radius); + + color: var(--button-textColor); + text-align: center; + white-space: nowrap; + + cursor: var(--button-cursor); + + &:hover:not(:disabled) { + color: var(--button-hover-textColor); + filter: var(--button-hover-filter); + } + + &:active:not(:disabled) { + filter: var(--button-active-filter); + } +`; + +const StyledButton = styled.button` + ${ButtonStyle} +`; + +const StyledLinkButton = styled.a` + ${ButtonStyle} + + &:hover { + text-decoration: none; + } + + &:visited { + color: var(--button-textColor); + } +`; diff --git a/src/components/Button.stories.tsx b/src/components/Button.stories.tsx new file mode 100644 index 0000000..6e42d85 --- /dev/null +++ b/src/components/Button.stories.tsx @@ -0,0 +1,48 @@ +import type { Story } from '@ladle/react'; + +import { ButtonAction, ButtonShape, ButtonSize, ButtonState, ButtonType } from '@/constants/buttons'; + +import { Button, type ButtonProps } from '@/components/Button'; + +import { StoryWrapper } from '.ladle/components'; + +export const ButtonStory: Story = (args) => { + return ( + + } + value={value} + /> + + ); +}; + +FormInputStoryWithSlotOuterRight.args = { + decimals: 2, + max: '', + min: '', + placeholder: '', + validationConfig: { + attached: false, + type: AlertType.Error, + message: 'Error message', + }, +}; + +FormInputStoryWithSlotOuterRight.argTypes = { + type: { + options: Object.values(InputType), + control: { type: 'select' }, + defaultValue: InputType.Number, + }, +}; diff --git a/src/components/FormInput.tsx b/src/components/FormInput.tsx new file mode 100644 index 0000000..da0591f --- /dev/null +++ b/src/components/FormInput.tsx @@ -0,0 +1,95 @@ +import { forwardRef } from 'react'; +import styled, { AnyStyledComponent, css } from 'styled-components'; + +import { AlertType } from '@/constants/alerts'; +import { layoutMixins } from '@/styles/layoutMixins'; +import { formMixins } from '@/styles/formMixins'; + +import { AlertMessage } from '@/components/AlertMessage'; +import { Input, InputProps } from '@/components/Input'; +import { WithLabel } from '@/components/WithLabel'; + +type StyleProps = { + className?: string; +}; + +type ElementProps = { + label: React.ReactNode; + slotRight?: React.ReactNode; + validationConfig?: { + attached?: boolean; + type: AlertType; + message: string; + }; +}; + +export type FormInputProps = ElementProps & StyleProps & InputProps; + +export const FormInput = forwardRef( + ({ id, label, slotRight, className, validationConfig, ...otherProps }, ref) => ( + + + + + + {slotRight} + + {validationConfig && ( + + {validationConfig.message} + + )} + + ) +); + +const Styled: Record = {}; + +Styled.AlertMessage = styled(AlertMessage)``; + +Styled.FormInputContainer = styled.div<{ isValidationAttached?: boolean }>` + ${layoutMixins.flexColumn} + gap: 0.5rem; + + ${({ isValidationAttached }) => + isValidationAttached && + css` + --input-radius: 0.5em 0.5em 0 0; + + ${Styled.AlertMessage} { + border-left: none; + margin: 0; + border-radius: 0 0 0.5em 0.5em; + } + `} +`; + +Styled.InputContainer = styled.div<{ hasSlotRight?: boolean }>` + ${formMixins.inputContainer} + + input { + padding: var(--form-input-paddingY) var(--form-input-paddingX); + padding-top: 0; + } + + ${({ hasSlotRight }) => + hasSlotRight && + css` + padding-right: var(--form-input-paddingX); + input { + padding-right: 0; + } + `} +`; + +Styled.WithLabel = styled(WithLabel)` + ${formMixins.inputLabel} + + label { + cursor: text; + padding: var(--form-input-paddingY) var(--form-input-paddingX) 0; + } +`; diff --git a/src/components/GreenCheckCircle.tsx b/src/components/GreenCheckCircle.tsx new file mode 100644 index 0000000..c114b3e --- /dev/null +++ b/src/components/GreenCheckCircle.tsx @@ -0,0 +1,43 @@ +import styled, { AnyStyledComponent } from 'styled-components'; + +import { layoutMixins } from '@/styles/layoutMixins'; + +import { Icon, IconName } from '@/components/Icon'; + +export const GreenCheckCircle = ({ className }: { className?: string }) => ( + + + +); + +const Styled: Record = {}; + +Styled.GreenCheckCircle = styled.div` + ${layoutMixins.stack} + + --icon-size: 1.25rem; + --icon-border-width: 3px; + + width: var(--icon-size); + height: var(--icon-size); + border-radius: 50%; + + align-items: center; + + &:before { + content: ''; + width: calc(var(--icon-size) - var(--icon-border-width) * 2); + height: calc(var(--icon-size) - var(--icon-border-width) * 2); + border: solid var(--icon-border-width) var(--color-positive); + border-radius: 50%; + opacity: 0.6; + } + + svg { + width: calc(var(--icon-size) / 3); + height: calc(var(--icon-size) / 3); + + color: var(--color-positive); + justify-self: center; + } +`; diff --git a/src/components/GuardedMobileRoute.tsx b/src/components/GuardedMobileRoute.tsx new file mode 100644 index 0000000..dec5d75 --- /dev/null +++ b/src/components/GuardedMobileRoute.tsx @@ -0,0 +1,38 @@ +import { useEffect, useRef } from 'react'; +import { Outlet, useNavigate } from 'react-router-dom'; +import { shallowEqual, useDispatch, useSelector } from 'react-redux'; + +import { DialogTypes } from '@/constants/dialogs'; + +import { useBreakpoints } from '@/hooks'; + +import { openDialog } from '@/state/dialogs'; + +import { getActiveDialog } from '@/state/dialogsSelectors'; + +import { calculateCanAccountTrade } from '@/state/accountCalculators'; + +export const GuardedMobileRoute = () => { + const { isTablet } = useBreakpoints(); + const navigate = useNavigate(); + const dispatch = useDispatch(); + const canAccountTrade = useSelector(calculateCanAccountTrade, shallowEqual); + const activeDialog = useSelector(getActiveDialog, shallowEqual); + const prevActiveDialog = useRef(activeDialog?.type); + + useEffect(() => { + if (isTablet && !canAccountTrade) { + dispatch(openDialog({ type: DialogTypes.Onboarding })); + } + }, []); + + useEffect(() => { + const dialogClosed = !activeDialog && prevActiveDialog.current === DialogTypes.Onboarding; + if (isTablet && !canAccountTrade && dialogClosed) { + navigate('/'); + } + prevActiveDialog.current = activeDialog?.type; + }, [activeDialog, canAccountTrade, isTablet]); + + return ; +}; diff --git a/src/components/Icon.stories.tsx b/src/components/Icon.stories.tsx new file mode 100644 index 0000000..808ef50 --- /dev/null +++ b/src/components/Icon.stories.tsx @@ -0,0 +1,23 @@ +import type { Story } from '@ladle/react'; + +import { Icon, IconName } from '@/components/Icon'; + +import { StoryWrapper } from '.ladle/components'; + +export const IconStory: Story> = (args) => { + return ( + + + + ); +}; + +const iconNames = Object.values(IconName); + +IconStory.argTypes = { + iconName: { + options: iconNames, + control: { type: 'select' }, + defaultValue: iconNames[0], + }, +}; diff --git a/src/components/Icon.tsx b/src/components/Icon.tsx new file mode 100644 index 0000000..935bd3c --- /dev/null +++ b/src/components/Icon.tsx @@ -0,0 +1,220 @@ +import { type ElementType } from 'react'; + +import styled from 'styled-components'; + +import { + AddressConnectorIcon, + ArrowIcon, + Bar3Icon, + BoxCloseIcon, + CalculatorIcon, + CaretIcon, + CautionCircleStrokeIcon, + CautionCircleIcon, + CheckIcon, + ChevronLeftIcon, + ChevronRightIcon, + ClockIcon, + CloseIcon, + CoinMarketCapIcon, + CoinsIcon, + CommentIcon, + CopyIcon, + CubeIcon, + DiscordIcon, + EtherscanIcon, + DepthChartIcon, + ExportKeysIcon, + FeedbackIcon, + FileIcon, + FundingChartIcon, + GearIcon, + GiftboxIcon, + HelpCircleIcon, + HideIcon, + HistoryIcon, + LinkOutIcon, + LockIcon, + LogoShortIcon, + MenuIcon, + MintscanIcon, + OrderbookIcon, + OrderCanceledIcon, + OrderFilledIcon, + OrderOpenIcon, + OrderPartiallyFilledIcon, + OrderPendingIcon, + OrderUntriggeredIcon, + OverviewIcon, + PencilIcon, + PositionsIcon, + PriceChartIcon, + PrivacyIcon, + QrIcon, + SearchIcon, + SendIcon, + ShareIcon, + ShowIcon, + TogglesMenuIcon, + StarIcon, + TerminalIcon, + TradeIcon, + TransferIcon, + TriangleIcon, + TryAgainIcon, + WarningIcon, + WebsiteIcon, + WhitepaperIcon, +} from '@/icons'; + +export enum IconName { + AddressConnector = 'AddressConnector', + Arrow = 'Arrow', + Bar3 = 'Bar3', + BoxClose = 'BoxClose', + Calculator = 'Calculator', + Caret = 'Caret', + CautionCircle = 'CautionCircle', + CautionCircleStroked = 'CautionCircleStroked', + Check = 'Check', + ChevronLeft = 'ChevronLeft', + ChevronRight = 'ChevronRight', + Clock = 'Clock', + Close = 'Close', + CoinMarketCap = 'CoinMarketCap', + Coins = 'Coins', + Comment = 'Comment', + Copy = 'Copy', + Cube = 'Cube', + DepthChart = 'DepthChart', + Discord = 'Discord', + Etherscan = 'Etherscan', + ExportKeys = 'ExportKeys', + Feedback = 'Feedback', + File = 'File', + FundingChart = 'FundingChart', + Gear = 'Gear', + Giftbox = 'Giftbox', + HelpCircle = 'HelpCircle', + Hide = 'Hide', + History = 'History', + LinkOut = 'LinkOut', + Lock = 'Lock', + LogoShort = 'LogoShort', + Menu = 'Menu', + Mintscan = 'Mintscan', + Onboarding = 'Onboarding', + Orderbook = 'OrderbookIcon', + OrderCanceled = 'OrderCanceled', + OrderFilled = 'OrderFilled', + OrderOpen = 'OrderOpen', + OrderPartiallyFilled = 'OrderPartiallyFilled', + OrderPending = 'OrderPending', + OrderUntriggered = 'OrderUntriggered', + Overview = 'Overview', + Pencil = 'Pencil', + Positions = 'Positions', + PriceChart = 'PriceChart', + Privacy = 'Privacy', + Qr = 'Qr', + Search = 'Search', + Send = 'Send', + Share = 'Share', + Show = 'Show', + Star = 'Star', + Terminal = 'Terminal', + TogglesMenu = 'TogglesMenu', + Trade = 'Trade', + Transfer = 'Transfer', + Triangle = 'Triangle', + TryAgain = 'TryAgain', + Warning = 'Warning', + Website = 'Website', + Whitepaper = 'Whitepaper', +} + +const icons = { + [IconName.AddressConnector]: AddressConnectorIcon, + [IconName.Arrow]: ArrowIcon, + [IconName.Bar3]: Bar3Icon, + [IconName.BoxClose]: BoxCloseIcon, + [IconName.Calculator]: CalculatorIcon, + [IconName.Caret]: CaretIcon, + [IconName.CautionCircle]: CautionCircleIcon, + [IconName.CautionCircleStroked]: CautionCircleStrokeIcon, + [IconName.Check]: CheckIcon, + [IconName.ChevronLeft]: ChevronLeftIcon, + [IconName.ChevronRight]: ChevronRightIcon, + [IconName.Clock]: ClockIcon, + [IconName.Close]: CloseIcon, + [IconName.CoinMarketCap]: CoinMarketCapIcon, + [IconName.Coins]: CoinsIcon, + [IconName.Comment]: CommentIcon, + [IconName.Copy]: CopyIcon, + [IconName.Cube]: CubeIcon, + [IconName.DepthChart]: DepthChartIcon, + [IconName.Discord]: DiscordIcon, + [IconName.Etherscan]: EtherscanIcon, + [IconName.ExportKeys]: ExportKeysIcon, + [IconName.Feedback]: FeedbackIcon, + [IconName.File]: FileIcon, + [IconName.FundingChart]: FundingChartIcon, + [IconName.Gear]: GearIcon, + [IconName.Giftbox]: GiftboxIcon, + [IconName.HelpCircle]: HelpCircleIcon, + [IconName.Hide]: HideIcon, + [IconName.History]: HistoryIcon, + [IconName.LinkOut]: LinkOutIcon, + [IconName.Lock]: LockIcon, + [IconName.LogoShort]: LogoShortIcon, + [IconName.Menu]: MenuIcon, + [IconName.Mintscan]: MintscanIcon, + [IconName.Orderbook]: OrderbookIcon, + [IconName.OrderCanceled]: OrderCanceledIcon, + [IconName.OrderFilled]: OrderFilledIcon, + [IconName.OrderOpen]: OrderOpenIcon, + [IconName.OrderPartiallyFilled]: OrderPartiallyFilledIcon, + [IconName.OrderPending]: OrderPendingIcon, + [IconName.OrderUntriggered]: OrderUntriggeredIcon, + [IconName.Overview]: OverviewIcon, + [IconName.Pencil]: PencilIcon, + [IconName.Positions]: PositionsIcon, + [IconName.PriceChart]: PriceChartIcon, + [IconName.Privacy]: PrivacyIcon, + [IconName.Qr]: QrIcon, + [IconName.Search]: SearchIcon, + [IconName.Send]: SendIcon, + [IconName.Share]: ShareIcon, + [IconName.Show]: ShowIcon, + [IconName.Star]: StarIcon, + [IconName.Terminal]: TerminalIcon, + [IconName.TogglesMenu]: TogglesMenuIcon, + [IconName.Trade]: TradeIcon, + [IconName.Transfer]: TransferIcon, + [IconName.Triangle]: TriangleIcon, + [IconName.TryAgain]: TryAgainIcon, + [IconName.Warning]: WarningIcon, + [IconName.Website]: WebsiteIcon, + [IconName.Whitepaper]: WhitepaperIcon, +} as Record; + +type ElementProps = { + iconName?: IconName; + iconComponent?: ElementType; +}; + +type StyleProps = { + className?: string; +}; + +export const Icon = styled( + ({ + iconName, + iconComponent: Component = iconName && icons[iconName], + className, + ...props + }: ElementProps & StyleProps) => (Component ? : null) +)` + width: 1em; + height: 1em; +`; diff --git a/src/components/IconButton.stories.tsx b/src/components/IconButton.stories.tsx new file mode 100644 index 0000000..9f22807 --- /dev/null +++ b/src/components/IconButton.stories.tsx @@ -0,0 +1,58 @@ +import type { Story } from '@ladle/react'; + +import { ButtonAction, ButtonShape, ButtonSize, ButtonState, ButtonType } from '@/constants/buttons'; + +import { IconName } from '@/components/Icon'; +import { IconButton, type IconButtonProps } from '@/components/IconButton'; + +import { StoryWrapper } from '.ladle/components'; + +export const IconButtonStory: Story = (args) => { + return ( + + + + ); +}; + +IconButtonStory.args = { + href: '', +}; + +IconButtonStory.argTypes = { + iconName: { + options: Object.values(IconName), + control: { type: 'select' }, + defaultValue: IconName.Caret, + }, + type: { + options: Object.values(ButtonType), + control: { type: 'select' }, + defaultValue: ButtonType.Button, + }, + action: { + options: Object.values(ButtonAction), + control: { type: 'select' }, + defaultValue: ButtonAction.Primary, + }, + state: { + options: Object.values(ButtonState), + control: { type: 'select' }, + defaultValue: ButtonState.Default, + }, + size: { + options: Object.values(ButtonSize), + control: { type: 'select' }, + defaultValue: ButtonSize.Base, + }, + shape: { + options: Object.values(ButtonShape), + control: { type: 'select' }, + defaultValue: ButtonShape.Circle, + }, + isToggle: { + options: [true, false], + control: { type: 'select' }, + defaultValue: false, + } +}; diff --git a/src/components/IconButton.tsx b/src/components/IconButton.tsx new file mode 100644 index 0000000..cba0570 --- /dev/null +++ b/src/components/IconButton.tsx @@ -0,0 +1,83 @@ +import { forwardRef, type ElementType } from 'react'; +import styled, { AnyStyledComponent, css } from 'styled-components'; + +import { ButtonShape, ButtonSize } from '@/constants/buttons'; + +import { Button, type ButtonProps } from '@/components/Button'; +import { Icon, IconName } from '@/components/Icon'; +import { ToggleButton, type ToggleButtonProps } from '@/components/ToggleButton'; + +type ElementProps = { + isToggle?: boolean; + iconName?: IconName; + iconComponent?: ElementType; +}; + +export type IconButtonProps = ElementProps & ButtonProps & ToggleButtonProps; + +export const IconButton = forwardRef( + ( + { + size = ButtonSize.XSmall, + shape = ButtonShape.Circle, + + href, + isToggle, + iconName, + iconComponent, + + onClick, + onPressedChange, + className, + + ...otherProps + }, + ref + ) => { + return isToggle ? ( + + + + ) : ( + + + + ); + } +); + +const Styled: Record = {}; + +const buttonMixin = css` + // Params + --button-icon-size: 1.125em; + + // Rules + > * { + font-size: var(--button-icon-size); + } +`; + +Styled.IconButton = styled(Button)` + ${buttonMixin} +`; + +Styled.IconToggleButton = styled(ToggleButton)` + ${buttonMixin} +`; diff --git a/src/components/Input.stories.tsx b/src/components/Input.stories.tsx new file mode 100644 index 0000000..f6c61f6 --- /dev/null +++ b/src/components/Input.stories.tsx @@ -0,0 +1,34 @@ +import { useState } from 'react'; +import type { Story } from '@ladle/react'; + +import { Input, InputType, InputProps } from '@/components/Input'; + +import { StoryWrapper } from '.ladle/components'; + +export const InputStory: Story = (args) => { + const [value, setValue] = useState(''); + return ( + + ) => setValue(e.target.value)} + value={value} + /> + + ); +}; + +InputStory.args = { + decimals: 2, + max: '', + min: '', + placeholder: '', +}; + +InputStory.argTypes = { + type: { + options: Object.values(InputType), + control: { type: 'select' }, + defaultValue: InputType.Number, + }, +}; diff --git a/src/components/Input.tsx b/src/components/Input.tsx new file mode 100644 index 0000000..5184433 --- /dev/null +++ b/src/components/Input.tsx @@ -0,0 +1,219 @@ +import { Dispatch, forwardRef, SetStateAction } from 'react'; +import styled, { type AnyStyledComponent, css } from 'styled-components'; +import { NumericFormat, type NumberFormatValues, type SourceInfo } from 'react-number-format'; +import type { SyntheticInputEvent } from 'react-number-format/types/types'; + +import { + LEVERAGE_DECIMALS, + PERCENT_DECIMALS, + TOKEN_DECIMALS, + USD_DECIMALS, +} from '@/constants/numbers'; + +import { BIG_NUMBERS, MustBigNumber } from '@/lib/numbers'; +import { useLocaleSeparators } from '@/hooks'; + +export enum InputType { + Currency = 'Currency', + Leverage = 'Leverage', + Number = 'Number', + Percent = 'Percent', + Text = 'Text', + Search = 'Search', +} + +type StyleProps = { + className?: string; +}; + +type ElementProps = { + type?: InputType; + value?: string | number | null; + + allowNegative?: boolean; + decimals?: number; + disabled?: boolean; + id?: string; + max?: number; + onBlur?: () => void; + onChange?: + | Dispatch> + | React.ReactEventHandler + | ((values: NumberFormatValues, e: SourceInfo) => void); + onFocus?: () => void; + onInput?: ({ + value, + floatValue, + formattedValue, + }: { + value: string; + floatValue?: number; + formattedValue: string; + }) => void; + placeholder?: string; +}; + +export type InputProps = ElementProps & StyleProps; + +export const Input = forwardRef( + ( + { + className, + allowNegative = false, + decimals, + disabled, + id, + max, + placeholder, + value, + onBlur, + onChange, + onFocus, + onInput, + type = InputType.Number, + ...otherProps + }, + ref + ) => { + const { decimal: LOCALE_DECIMAL_SEPARATOR } = useLocaleSeparators(); + + const numberFormatConfig = { + [InputType.Currency]: { + defaultDecimals: USD_DECIMALS, + prefix: '$', + }, + [InputType.Leverage]: { + defaultDecimals: LEVERAGE_DECIMALS, + suffix: '×', + }, + [InputType.Number]: { + defaultDecimals: TOKEN_DECIMALS, + }, + [InputType.Percent]: { + defaultDecimals: PERCENT_DECIMALS, + suffix: '%', + }, + [InputType.Text]: null, + [InputType.Search]: null, + }[type]; + + decimals = decimals !== undefined ? decimals : numberFormatConfig?.defaultDecimals; + + const defaultNumberPlaceholder = `${numberFormatConfig?.prefix ?? ''}${BIG_NUMBERS.ZERO.toFixed( + decimals !== undefined ? decimals : USD_DECIMALS + )}${numberFormatConfig?.suffix ?? ''}`; + + const formattedValue = + typeof value === 'string' + ? value + : value != null + ? Intl.NumberFormat(navigator.language || 'en-US', { + maximumFractionDigits: decimals, + }).format(value) + : ''; + + return ( + + {type === InputType.Text || type === InputType.Search ? ( + } + id={id} + // Events + onBlur={onBlur} + onChange={onChange} + onFocus={onFocus} + onInput={onInput} + // Native + disabled={disabled} + placeholder={placeholder} + value={value} + // Other + {...otherProps} + /> + ) : ( + >} + id={id} + // NumericFormat + allowNegative={allowNegative} + decimalScale={decimals} + decimalSeparator={LOCALE_DECIMAL_SEPARATOR} + isAllowed={({ floatValue }: NumberFormatValues) => + floatValue ? floatValue <= (max || Number.MAX_VALUE) : true + } + prefix={numberFormatConfig?.prefix} + suffix={numberFormatConfig?.suffix} + // Events + onBlur={onBlur} + onValueChange={onChange} + onFocus={onFocus} + onInput={(e: SyntheticInputEvent) => { + if (!onInput) return; + const value = e.target.value; + const { prefix = '', suffix = '' } = numberFormatConfig || {}; + // Remove prefix and suffix, replace commas with periods + const formattedValue = value.replace(prefix, '').replace(suffix, ''); + + const floatValue: number | undefined = isNaN(Number(formattedValue.replace(',', '.'))) + ? undefined + : Number(formattedValue.replace(',', '.')); + + onInput?.({ value, floatValue, formattedValue }); + }} + // Native + disabled={disabled} + placeholder={placeholder || defaultNumberPlaceholder} + value={formattedValue} + autoComplete="off" + autoCorrect="off" + {...otherProps} + /> + )} + + ); + } +); + +const Styled: Record = {}; + +Styled.InputContainer = styled.div` + width: 100%; + min-height: 100%; + height: 100%; + overflow: hidden; + + background-color: inherit; + border-radius: inherit; + + input { + user-select: all; + flex: 1; + width: 100%; + } +`; + +const InputStyle = css` + font: var(--font-base-book); + outline: none; + border: none; + background-color: var(--input-backgroundColor); + color: var(--color-text-2); + min-width: 0; + height: 100%; + + ::placeholder { + color: var(--color-text-0); + opacity: 1; + } +`; + +Styled.NumericFormat = styled(NumericFormat)` + ${InputStyle} + font-feature-settings: var(--fontFeature-monoNumbers); +`; + +Styled.Input = styled.input` + ${InputStyle} +`; diff --git a/src/components/Link.stories.tsx b/src/components/Link.stories.tsx new file mode 100644 index 0000000..46721c6 --- /dev/null +++ b/src/components/Link.stories.tsx @@ -0,0 +1,34 @@ +import styled, { AnyStyledComponent } from 'styled-components'; +import type { Story } from '@ladle/react'; + +import { Link } from '@/components/Link'; + +import { StoryWrapper } from '.ladle/components'; +import { layoutMixins } from '@/styles/layoutMixins'; + +export const LinkStory: Story> = (args) => { + return ( + + + Trade Now + + + ); +}; + +LinkStory.args = { + href: 'https://trade.dydx.exchange', +}; + +const Styled: Record = {}; + +Styled.Container = styled.section` + background: var(--color-layer-3); + + ${layoutMixins.container} + + padding: 10px; + display: flex; + align-items: center; + gap: 8px; +`; diff --git a/src/components/Link.tsx b/src/components/Link.tsx new file mode 100644 index 0000000..ee5bef0 --- /dev/null +++ b/src/components/Link.tsx @@ -0,0 +1,73 @@ +import { forwardRef } from 'react'; +import styled, { type AnyStyledComponent } from 'styled-components'; + +import { Icon, IconName } from '@/components/Icon'; + +import { layoutMixins } from '@/styles/layoutMixins'; + +type ElementProps = { + analyticsConfig?: { + event: string; + meta?: any; + }; + children: React.ReactNode; + href?: string; + onClick?: () => void; + withIcon?: boolean; +}; + +type StyleProps = { + className?: string; +}; + +export const Link = forwardRef( + ( + { + analyticsConfig, + children, + className, + href, + onClick, + withIcon = false, + ...props + }: ElementProps & StyleProps, + ref + ) => ( + { + if (analyticsConfig) { + console.log(analyticsConfig); + } + + onClick?.(); + }} + rel="noopener noreferrer" + target="_blank" + {...props} + > + {children} + {withIcon && } + + ) +); + +const Styled: Record = {}; + +Styled.A = styled.a` + --link-color: inherit; + color: var(--link-color); + + ${layoutMixins.spacedRow} + gap: 0.25em; + + &:hover { + text-decoration: underline; + } + + &:visited { + color: var(--link-color); + } +`; diff --git a/src/components/Loading/Loading.stories.tsx b/src/components/Loading/Loading.stories.tsx new file mode 100644 index 0000000..c0e5942 --- /dev/null +++ b/src/components/Loading/Loading.stories.tsx @@ -0,0 +1,38 @@ +import type { Story } from '@ladle/react'; + +import { LoadingDots, LoadingDotsProps } from '@/components/Loading/LoadingDots'; +import { LoadingSpinner } from '@/components/Loading/LoadingSpinner'; +import { LoadingOutput } from '@/components/Loading/LoadingOutput'; +import { StoryWrapper } from '.ladle/components'; + +export const Dots: Story = (args) => { + return ( + + + + ); +}; + +Dots.args = { + size: 4, +}; + +export const Spinner: Story = (args) => { + return ( + + + + ); +}; + +Spinner.args = {}; + +export const Output: Story = (args) => { + return ( + + + + ); +}; + +Output.args = {}; diff --git a/src/components/Loading/LoadingDots.tsx b/src/components/Loading/LoadingDots.tsx new file mode 100644 index 0000000..7d8b94a --- /dev/null +++ b/src/components/Loading/LoadingDots.tsx @@ -0,0 +1,63 @@ +import styled, { css } from 'styled-components'; + +// Types/constants +export type LoadingDotsProps = { + size?: number; +}; + +// Component +export const LoadingDots: React.FC = ({ size = 1 }) => ( + + + + + +); + +// Style +const LoadingDotsContainer = styled.div<{ size: number }>` + // Props/defaults + --size: 1; + + // Variants + ${({ size }) => css` + --size: ${size}; + `} + + // Calculations + --dot-size: calc(var(--size) * 0.0875em); + + // Rules + display: inline-grid; + grid-auto-flow: column; + gap: var(--dot-size); + user-select: none; + + > * { + width: var(--dot-size); + height: var(--dot-size); + background-color: currentColor; + border-radius: 50%; + animation: Dot 1.4s infinite both; + + &:nth-child(2) { + animation-delay: 0.2s; + } + + &:nth-child(3) { + animation-delay: 0.4s; + } + } + + @keyframes Dot { + 0% { + opacity: 0.2; + } + 20% { + opacity: 1; + } + 100% { + opacity: 0.2; + } + } +`; diff --git a/src/components/Loading/LoadingOutput.tsx b/src/components/Loading/LoadingOutput.tsx new file mode 100644 index 0000000..9167d0c --- /dev/null +++ b/src/components/Loading/LoadingOutput.tsx @@ -0,0 +1,27 @@ +import styled, { keyframes } from 'styled-components'; + +export const LoadingOutput = styled.div` + --loadingOutput-width: 4em; + --loadingOutput-color: currentColor; + + background: linear-gradient( + 116deg, + hsla(245, 11%, 55%, 0.4) 0%, + var(--loadingOutput-color) 50%, + hsla(245, 11%, 55%, 0.4) 100% + ); + background-size: 200% auto; + border-radius: 0.5em; + height: 1em; + width: var(--loadingOutput-width); + opacity: 0.6; + + animation: ${keyframes` + from { + background-position: 0 0; + } + to { + background-position: -200% 0; + } + `} 1.5s linear infinite; +`; diff --git a/src/components/Loading/LoadingSpinner.tsx b/src/components/Loading/LoadingSpinner.tsx new file mode 100644 index 0000000..d4bb299 --- /dev/null +++ b/src/components/Loading/LoadingSpinner.tsx @@ -0,0 +1,68 @@ +import { layoutMixins } from '@/styles/layoutMixins'; +import styled, { type AnyStyledComponent, keyframes } from 'styled-components'; + +// In some strange cases, hiding a spinner on one part of the page causes the linearGradient to +// be hidden on all other instances of the page. An id can be passed in to prevent this. +export const LoadingSpinner: React.FC<{ + id?: string; + className?: string; + disabled?: boolean; +}> = ({ id, className, disabled = false }) => { + return ( + + + + {!disabled && ( + + )} + + + ); +}; + +export const LoadingSpace: React.FC<{ className?: string; id: string }> = ({ className, id }) => ( + + + +); + +const Styled: Record = {}; + +Styled.LoadingSpaceContainer = styled.div` + ${layoutMixins.centered} +`; + +Styled.Spinner = styled.div` + --spinner-width: auto; + + line-height: 0; + color: var(--color-text-0); +`; + +Styled.LoadingSpinnerSvg = styled.svg` + width: var(--spinner-width); + + animation: ${keyframes` + to { + transform: rotate(1turn); + } + `} 1.5s linear infinite; +`; diff --git a/src/components/MarginUsageRing.stories.tsx b/src/components/MarginUsageRing.stories.tsx new file mode 100644 index 0000000..ae13f99 --- /dev/null +++ b/src/components/MarginUsageRing.stories.tsx @@ -0,0 +1,53 @@ +import styled, { AnyStyledComponent } from 'styled-components'; +import type { Story } from '@ladle/react'; + +import { layoutMixins } from '@/styles/layoutMixins'; + +import { MarginUsageRing } from '@/components/MarginUsageRing'; + +import { StoryWrapper } from '.ladle/components'; + +export const MarginUsageRingStory: Story<{ value: number }> = (args) => { + return ( + + + + + + ); +}; + +MarginUsageRingStory.args = { + value: 0, +}; + +export const MarginUsageRingStyled: Story<{ value: number }> = (args) => { + return ( + + + + + + ); +}; + +MarginUsageRingStyled.args = { + value: 0, +}; + +const Styled: Record = {}; + +Styled.MarginUsageRing = styled(MarginUsageRing)` + color: var(--color-accent); +`; + +Styled.Container = styled.section` + background: var(--color-layer-3); + + ${layoutMixins.container} + + padding: 10px; + display: flex; + align-items: center; + gap: 8px; +`; diff --git a/src/components/MarginUsageRing.tsx b/src/components/MarginUsageRing.tsx new file mode 100644 index 0000000..51483f1 --- /dev/null +++ b/src/components/MarginUsageRing.tsx @@ -0,0 +1,32 @@ +import styled, { type AnyStyledComponent } from 'styled-components'; + +import { RiskLevels } from '@/constants/abacus'; +import { UsageColorFromRiskLevel } from '@/styles/colors'; + +import { Ring } from '@/components/Ring'; + +import { abacusHelper } from '@/lib/abacus'; + +type ElementProps = { + value: number; +}; + +type StyleProps = { + className?: string; +}; + +export const MarginUsageRing = ({ className, value }: ElementProps & StyleProps) => ( + +); + +const Styled: Record = {}; + +Styled.MarginUsageRing = styled(Ring)<{ riskLevel: RiskLevels }>` + ${({ riskLevel }) => UsageColorFromRiskLevel(riskLevel)} + width: 1rem; + height: 1rem; +`; diff --git a/src/components/NavigationMenu.stories.tsx b/src/components/NavigationMenu.stories.tsx new file mode 100644 index 0000000..290b0fa --- /dev/null +++ b/src/components/NavigationMenu.stories.tsx @@ -0,0 +1,124 @@ +import type { Story } from '@ladle/react'; + +import { NavigationMenu } from '@/components/NavigationMenu'; +import { HashRouter } from 'react-router-dom'; + +import { StoryWrapper } from '.ladle/components'; + +export const NavigationMenuStory: Story> = (args) => { + const exampleItems = [ + { + group: 'navigation', + groupLabel: 'Views', + items: [ + { + value: 'markets', + label: 'Markets', + href: './markets', + subitems: [ + { + value: 'ETH', + label: 'Ethereum', + href: './markets/ETH', + }, + { + value: 'BTC', + label: 'Bitcoin', + href: './markets/BTC', + }, + ], + }, + { + value: 'trade', + label: 'Trade', + href: './trade', + subitems: [ + { + value: 'ETH-USD', + label: 'ETH', + href: './trade/ETH-USD', + }, + { + value: 'BTC-USD', + label: 'BTC', + href: './trade/BTC-USD', + }, + ], + }, + { + value: 'portfolio', + label: 'Portfolio', + href: './portfolio', + subitems: [ + { + value: 'overview', + label: 'Overview', + href: './portfolio/overview', + }, + { + value: 'positions', + label: 'Positions', + href: './portfolio/positions', + }, + { + value: 'history', + label: 'History', + href: './portfolio/history', + subitems: [ + { + value: 'trades', + label: 'Trades', + href: './portfolio/overview/trades', + subitems: [ + { + value: 'transfers', + label: 'Transfers', + href: './portfolio/positions/transfers', + }, + ], + }, + { + value: 'transfers', + label: 'Transfers', + href: './portfolio/positions/transfers', + }, + { + value: 'payments', + label: 'Payments', + href: './portfolio/history/payments', + }, + ], + }, + ], + }, + ], + }, + ]; + + return ( + + + Menu + + } + /> + + ); +}; + +NavigationMenuStory.args = {}; + +NavigationMenuStory.argTypes = { + orientation: { + options: ['vertical', 'horizontal'], + control: { type: 'select' }, + defaultValue: 'vertical', + }, + submenuPlacement: { + options: ['inline', 'viewport'], + control: { type: 'select' }, + defaultValue: 'inline', + }, +}; diff --git a/src/components/NavigationMenu.tsx b/src/components/NavigationMenu.tsx new file mode 100644 index 0000000..1e2f16e --- /dev/null +++ b/src/components/NavigationMenu.tsx @@ -0,0 +1,531 @@ +import { forwardRef, Ref, useEffect, useRef, useState } from 'react'; +import styled, { type AnyStyledComponent, css, keyframes } from 'styled-components'; +import { NavLink, matchPath, useLocation } from 'react-router-dom'; + +import { MenuConfig, MenuItem } from '@/constants/menus'; + +import { isExternalLink } from '@/lib/isExternalLink'; + +import { popoverMixins } from '@/styles/popoverMixins'; + +import { + Root, + List, + Trigger, + Content, + Item, + Link, + Sub, + Viewport, +} from '@radix-ui/react-navigation-menu'; + +import { layoutMixins } from '@/styles/layoutMixins'; + +import { isTruthy } from '@/lib/isTruthy'; + +import { Tag } from './Tag'; +import { Icon, IconName } from './Icon'; + +type ElementProps = { + items: MenuConfig; + onSelectItem?: (value: MenuItemValue) => void; + onSelectGroup?: (value: MenuGroupValue) => void; +}; + +type StyleProps = { + orientation?: 'vertical' | 'horizontal'; + itemOrientation?: 'vertical' | 'horizontal'; + submenuPlacement?: 'inline' | 'viewport'; + dir?: 'ltr' | 'rtl'; + className?: string; +}; + +const NavItem = forwardRef( + ( + { + value, + slotBefore, + label, + tag, + href, + slotAfter = isExternalLink(href) ? : undefined, + onSelect, + subitems, + ...props + }: MenuItem, + ref: Ref | Ref | Ref + ) => { + const location = useLocation(); + + const children = ( + <> + {slotBefore} + + {/* {`${label}${subitems?.length ? ' ' : ''}`} */} + {label} + {tag && ( + <> + {' '} + {tag} + + )} + + {slotAfter} + {subitems?.length && } + + ); + + return href ? ( + onSelect?.(value)} + asChild + target={isExternalLink(href) ? '_blank' : undefined} + > + } {...props}> + {children} + + + ) : props.onClick ? ( + onSelect?.(value)}> + + + ) : ( +
} {...props}> + {children} +
+ ); + } +); + +type TriggerRef = HTMLAnchorElement | HTMLDivElement | HTMLButtonElement | null; + +export const NavigationMenu = ({ + onSelectItem, + onSelectGroup, + items, + orientation = 'vertical', + itemOrientation = 'horizontal', + submenuPlacement = 'inline', // orientation === 'horizontal' ? 'viewport' : 'inline', + dir = 'ltr', + className, +}: ElementProps & StyleProps) => { + // Disable click (close) in the first 500ms after hover (open) + // https://github.com/radix-ui/primitives/issues/1630#issuecomment-1545995075 + const [clickIsDisabled, setClickIsDisabled] = useState(false); + const triggerRefs = useRef({} as { [value: string]: TriggerRef }); + + useEffect(() => { + const observer = new MutationObserver((mutationsList) => { + for (const mutation of mutationsList) { + if ( + mutation.type === 'attributes' && + mutation.attributeName === 'data-state' && + (mutation.target as unknown as HTMLOrSVGElement).dataset.state === 'open' && + mutation.target !== document.activeElement + ) { + setClickIsDisabled(true); + setTimeout(() => setClickIsDisabled(false), 500); + } + } + }); + + for (const element of Object.values(triggerRefs.current).filter(isTruthy)) { + observer.observe(element, { attributes: true }); + } + + return () => observer.disconnect(); + }, []); + + const renderSubitems = ({ + item, + depth = 0, + }: { + item: MenuItem; + depth: number; + }) => ( + <> + 0} + ref={(ref: TriggerRef) => (triggerRefs.current[item.value] = ref)} + onClick={(e: MouseEvent) => { + if (clickIsDisabled) { + e.preventDefault(); + } + }} + > + + + + + + 0 ? 'menu' : orientation === 'vertical' ? 'vertical' : 'menu'} + > + {item?.subitems?.map((subitem) => ( + + {subitem?.subitems ? ( + renderSubitems({ item: subitem, depth: depth + 1 }) + ) : ( + + )} + + ))} + + + + + ); + + return ( + + {items.map((group) => ( + + {group.groupLabel && ( + +

{group.groupLabel}

+
+ )} + + + {group.items.map((item) => ( + + {item.subitems ? ( + renderSubitems({ item, depth: 0 }) + ) : ( + + )} + + ))} + +
+ ))} + + {submenuPlacement === 'viewport' && } +
+ ); +}; + +const Styled: Record = {}; + +Styled.Root = styled(Root)` + /* Params */ + --navigationMenu-height: auto; + + --navigationMenu-item-height: 2rem; + + --navigationMenu-item-checked-backgroundColor: var(--color-layer-1); + --navigationMenu-item-checked-textColor: var(--color-text-2); + --navigationMenu-item-highlighted-backgroundColor: var(--color-layer-4); + --navigationMenu-item-highlighted-textColor: var(--color-text-2); + --navigationMenu-item-radius: 0.5rem; + --navigationMenu-item-padding: 0.5rem 1rem; + + /* Rules */ + align-self: stretch; + + --submenu-side-offset: 0.75rem; // placement="viewport" + // --submenu-side-offset: 1rem; // placement="inline" + + position: relative; + + &[data-orientation='horizontal'] { + ${layoutMixins.row} + align-items: stretch; + + margin: calc((var(--navigationMenu-height) - var(--navigationMenu-item-height)) / 2) 0; + height: max-content; + } + &[data-orientation='vertical'] { + ${layoutMixins.column} + } + + div[style='position: relative;'] { + display: grid; + } +`; + +Styled.Viewport = styled(Viewport)` + ${popoverMixins.popover} + ${popoverMixins.popoverAnimation} + --popover-origin: center top; + + ${layoutMixins.stack} + align-content: start; + justify-items: center; + + width: var(--radix-navigation-menu-viewport-width); + height: var(--radix-navigation-menu-viewport-height); + max-height: var(--radix-navigation-menu-viewport-height); + transition: 0.3s; + box-sizing: content-box; + + position: absolute; + + &[data-orientation='horizontal'] { + top: calc(100% + var(--submenu-side-offset)); + left: 0; + right: 0; + margin: auto; + display: grid; + justify-content: center; + + z-index: 2; + } + + &[data-orientation='vertical'] { + left: 100%; + /* top: 100%; */ + } +`; + +Styled.Content = styled(Content)` + ${popoverMixins.popoverAnimation} + transform-origin: center top; + + &[data-placement='inline'] { + max-height: 100vh; + + ${Styled.List}[data-orientation="horizontal"] & { + /* position: absolute; + top: calc(100% + var(--submenu-side-offset)); + left: 50%; + right: 50%; */ + + position: relative; + width: 0; + left: 50%; + right: 50%; + + display: grid; + justify-content: center; + + z-index: 2; + } + + ${Styled.List}[data-orientation="menu"] & { + position: absolute; + left: 100%; + top: 0; + right: auto; + display: grid; + justify-content: start; + } + } + + &[data-placement='viewport'] { + position: absolute; + + &[data-motion='from-start'] { + animation: ${keyframes` + from { + filter: blur(3px); + opacity: 0; + } + `} var(--ease-out-circ) 0.2s; + } + &[data-motion='from-end'] { + animation: ${keyframes` + from { + filter: blur(3px); + opacity: 0; + } + `} var(--ease-out-circ) 0.2s; + } + &[data-motion='to-start'] { + animation: ${keyframes` + to { + filter: blur(3px); + opacity: 0; + } + `} var(--ease-out-circ) 0.2s; + } + &[data-motion='to-end'] { + animation: ${keyframes` + to { + filter: blur(3px); + opacity: 0; + } + `} var(--ease-out-circ) 0.2s; + } + } +`; + +Styled.Sub = styled(Sub)` + &[data-placement='inline'] { + ${popoverMixins.popover} + --popover-width: max-content; + overflow: visible; + + ${Styled.List}[data-orientation="vertical"] > & { + margin-top: var(--gap, 0.25rem); + + padding: 0.5rem; + } + + ${Styled.List}[data-orientation="menu"] & { + border-top-left-radius: 0 !important; + } + } +`; + +Styled.Group = styled.section` + ${Styled.Root}[data-orientation="vertical"] & { + ${layoutMixins.stickyArea0} + --stickyArea0-topHeight: 3rem; + } + + ${layoutMixins.column} + + color: var(--color-text-0); +`; + +Styled.GroupHeader = styled.header` + ${layoutMixins.stickyHeader} + ${layoutMixins.row} + + padding: 0.5rem 0.75rem 0rem; + font: var(--font-small-medium); +`; + +Styled.List = styled(List)` + align-self: center; + + &[data-orientation='horizontal'] { + ${layoutMixins.row} + gap: 0.5rem; + align-items: start; + } + + &[data-orientation='vertical'] { + ${layoutMixins.flexColumn} + gap: 0.25rem; + } +`; + +Styled.ListItem = styled(Item)` + /* display: contents; */ + display: grid; + position: relative; + + ${Styled.List}[data-orientation="horizontal"] > & { + gap: var(--submenu-side-offset); + } + + /* ${Styled.List}[data-orientation="menu"] > & { + grid-template-columns: 1fr 0; + align-items: start; + gap: 2rem; + } */ + + /* &:has([data-state="open"]) { + position: sticky; + left: 0; + right: 0; + } */ +`; + +Styled.SubMenuTrigger = styled(Trigger)` + border-radius: var(--navigationMenu-item-radius); + outline-offset: -2px; + + &[data-state='open'] { + div { + background-color: var(--navigationMenu-item-checked-backgroundColor); + color: var(--navigationMenu-item-checked-textColor); + } + + svg { + rotate: 0.5turn; + } + } +`; + +Styled.NavItem = styled(NavItem)<{ orientation: 'horizontal' | 'vertical' }>` + ${({ subitems }) => + subitems?.length + ? css` + ${popoverMixins.trigger} + --trigger-backgroundColor: transparent; + --trigger-open-backgroundColor: var(--color-layer-3); + ` + : css` + &:hover:not(.active) { + background-color: var(--navigationMenu-item-highlighted-backgroundColor); + color: var(--navigationMenu-item-highlighted-textColor); + } + `} + + ${popoverMixins.item} + --item-checked-backgroundColor: var(--navigationMenu-item-checked-backgroundColor); + --item-checked-textColor: var(--navigationMenu-item-checked-textColor); + --item-highlighted-backgroundColor: var(--navigationMenu-item-highlighted-backgroundColor); + --item-highlighted-textColor: var(--navigationMenu-item-highlighted-textColor); + --item-radius: var(--navigationMenu-item-radius); + --item-padding: var(--navigationMenu-item-padding); + + /* ${popoverMixins.backdropOverlay} */ + + ${layoutMixins.scrollSnapItem} + + min-height: var(--navigationMenu-item-height); + + ${({ orientation }) => + ({ + horizontal: css` + ${layoutMixins.row} + `, + vertical: css` + ${layoutMixins.column} + justify-items: center; + align-content: center; + `, + }[orientation])} + gap: 0.7rem 0.5rem; + + > span { + flex: 1; + + display: inline-flex; + align-items: center; + gap: 0.5ch; + } + + /* Border-radius! */ + + ${Styled.List}[data-orientation="menu"] & { + --item-radius: 0; + } + + ${Styled.List}[data-orientation="menu"] > ${Styled.ListItem}:first-child > & { + border-top-left-radius: var(--popover-radius); + + &:not([data-state='open']) { + border-top-right-radius: var(--popover-radius); + } + } + + ${Styled.List}[data-orientation="menu"] > ${Styled.ListItem}:last-child > & { + border-bottom-left-radius: var(--popover-radius); + + &:not([data-state='open']) { + border-bottom-right-radius: var(--popover-radius); + } + } + + ${Styled.List}[data-orientation="menu"] ${Styled.List}[data-orientation="menu"] > ${Styled.ListItem}:first-child > & { + border-top-left-radius: 0; + } +`; + +Styled.Icon = styled(Icon)` + ${Styled.List}[data-orientation="menu"] & { + rotate: -0.25turn; + } +`; diff --git a/src/components/OrderSideTag.stories.tsx b/src/components/OrderSideTag.stories.tsx new file mode 100644 index 0000000..7901238 --- /dev/null +++ b/src/components/OrderSideTag.stories.tsx @@ -0,0 +1,30 @@ +import type { Story } from '@ladle/react'; +import { OrderSide } from '@dydxprotocol/v4-client'; + +import { OrderSideTag } from '@/components/OrderSideTag'; + +import { StoryWrapper } from '.ladle/components'; + +export const BuyTagStory: Story<{ orderSide: OrderSide }> = (args) => { + return ( + + + + ); +}; + +BuyTagStory.args = { + orderSide: OrderSide.BUY, +}; + +export const SellTagStory: Story<{ orderSide: OrderSide }> = (args) => { + return ( + + + + ); +}; + +SellTagStory.args = { + orderSide: OrderSide.SELL, +}; diff --git a/src/components/OrderSideTag.tsx b/src/components/OrderSideTag.tsx new file mode 100644 index 0000000..47b3630 --- /dev/null +++ b/src/components/OrderSideTag.tsx @@ -0,0 +1,34 @@ +import { OrderSide } from '@dydxprotocol/v4-client'; + +import { STRING_KEYS } from '@/constants/localization'; +import { useStringGetter } from '@/hooks'; + +import { Tag, TagSign, TagSize, TagType } from './Tag'; + +type ElementProps = { + orderSide: OrderSide; +}; + +type StyleProps = { + size?: TagSize; +}; + +export const orderSideTagSign: Record = { + [OrderSide.BUY]: TagSign.Positive, + [OrderSide.SELL]: TagSign.Negative, +}; + +export const OrderSideTag = ({ size, orderSide }: ElementProps & StyleProps) => { + const stringGetter = useStringGetter(); + + return ( + + {stringGetter({ + key: { + [OrderSide.BUY]: STRING_KEYS.BUY, + [OrderSide.SELL]: STRING_KEYS.SELL, + }[orderSide], + })} + + ); +}; diff --git a/src/components/Output.tsx b/src/components/Output.tsx new file mode 100644 index 0000000..f475bc1 --- /dev/null +++ b/src/components/Output.tsx @@ -0,0 +1,365 @@ +import { useContext } from 'react'; +import styled, { type AnyStyledComponent, css } from 'styled-components'; +import BigNumber from 'bignumber.js'; +import { useSelector } from 'react-redux'; +import { DateTime } from 'luxon'; + +import { + LEVERAGE_DECIMALS, + PERCENT_DECIMALS, + SMALL_PERCENT_DECIMALS, + SMALL_USD_DECIMALS, + TOKEN_DECIMALS, + USD_DECIMALS, +} from '@/constants/numbers'; + +import { UNICODE } from '@/constants/unicode'; +import { useLocaleSeparators, useStringGetter } from '@/hooks'; +import { layoutMixins } from '@/styles/layoutMixins'; + +import { LoadingOutput } from './Loading/LoadingOutput'; +import { RelativeTime } from '@/components/RelativeTime'; +import { Tag } from '@/components/Tag'; + +import { LoadingContext } from '@/contexts/LoadingContext'; + +import { getSelectedLocale } from '@/state/localizationSelectors'; + +import { type BigNumberish, MustBigNumber, isNumber } from '@/lib/numbers'; +import { getStringsForDateTimeDiff, getTimestamp } from '@/lib/timeUtils'; + +export enum OutputType { + Text = 'Text', + CompactNumber = 'CompactNumber', + Number = 'Number', + Fiat = 'Fiat', + SmallFiat = 'SmallFiat', + CompactFiat = 'CompactFiat', + Asset = 'Asset', + Percent = 'Percent', + SmallPercent = 'SmallPercent', + Multiple = 'Multiple', + RelativeTime = 'RelativeTime', + DateTime = 'DateTime', + Date = 'Date', + Time = 'Time', +} + +export enum ShowSign { + Both = 'Both', + Negative = 'Negative', + None = 'None', +} + +type ElementProps = { + type: OutputType; + value?: BigNumberish | null; + isLoading?: boolean; + fractionDigits?: number | null; + showSign?: ShowSign; + slotRight?: React.ReactNode; + useGrouping?: boolean; + roundingMode?: BigNumber.RoundingMode; + relativeTimeFormatOptions?: { + format: 'long' | 'short' | 'narrow' | 'singleCharacter'; + resolution?: number; + stripRelativeWords?: boolean; + }; + tag?: React.ReactNode; + withParentheses?: boolean; + locale?: string; +}; + +type StyleProps = { + className?: string; + withBaseFont?: boolean; +}; + +export type OutputProps = ElementProps & StyleProps; + +export const Output = ({ + type, + value, + isLoading, + fractionDigits, + showSign = ShowSign.Negative, + slotRight, + useGrouping = true, + roundingMode = BigNumber.ROUND_HALF_UP, + relativeTimeFormatOptions = { + format: 'singleCharacter', + }, + tag, + withParentheses, + locale = navigator.language || 'en-US', + className, + withBaseFont, +}: OutputProps) => { + const selectedLocale = useSelector(getSelectedLocale); + const stringGetter = useStringGetter(); + const isDetailsLoading = useContext(LoadingContext); + const { decimal: LOCALE_DECIMAL_SEPARATOR, group: LOCALE_GROUP_SEPARATOR } = + useLocaleSeparators(); + + if (isLoading || isDetailsLoading) { + return ; + } + + switch (type) { + case OutputType.Text: { + return ( + + {value?.toString() ?? null} + + {tag && {tag}} + + ); + } + case OutputType.RelativeTime: { + const timestamp = getTimestamp(value); + if (!timestamp) return null; + + if (relativeTimeFormatOptions.format === 'singleCharacter') { + const { timeString, unitStringKey } = getStringsForDateTimeDiff( + DateTime.fromMillis(timestamp) + ); + + return ( + + + + {tag && {tag}} + + ); + } + + return ( + + + + {tag && {tag}} + + ); + } + case OutputType.Date: + case OutputType.Time: + case OutputType.DateTime: { + if ((typeof value !== 'string' && typeof value !== 'number') || !value) return null; + const date = new Date(value); + const dateString = { + [OutputType.Date]: date.toLocaleString(selectedLocale, { dateStyle: 'medium' }), + [OutputType.DateTime]: date.toLocaleString(selectedLocale, { + dateStyle: 'short', + timeStyle: 'short', + }), + [OutputType.Time]: date.toLocaleString(selectedLocale, { + hour12: false, + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + }), + }[type]; + + return ( + + {dateString} + + ); + } + case OutputType.CompactNumber: + case OutputType.Number: + case OutputType.Fiat: + case OutputType.SmallFiat: + case OutputType.CompactFiat: + case OutputType.Asset: + case OutputType.Percent: + case OutputType.SmallPercent: + case OutputType.Multiple: { + const hasValue = value !== null && value !== undefined; + const valueBN = MustBigNumber(value).abs(); + const isNegative = MustBigNumber(value).isNegative(); + const isPositive = MustBigNumber(value).isPositive() && !MustBigNumber(value).isZero(); + + const sign: string | undefined = { + [ShowSign.Both]: isNegative ? UNICODE.MINUS : isPositive ? UNICODE.PLUS : undefined, + [ShowSign.Negative]: isNegative ? UNICODE.MINUS : undefined, + [ShowSign.None]: undefined, + }[showSign]; + + const format = { + decimalSeparator: LOCALE_DECIMAL_SEPARATOR, + ...(useGrouping + ? { + groupSeparator: LOCALE_GROUP_SEPARATOR, + groupSize: 3, + secondaryGroupSize: 0, + fractionGroupSeparator: ' ', + fractionGroupSize: 0, + } + : {}), + }; + + return ( + + )[type] ?? '' + }${tag ? ` ${tag}` : ''}`} + className={className} + withParentheses={withParentheses} + withBaseFont={withBaseFont} + > + {sign && {sign}} + {hasValue && + { + [OutputType.CompactNumber]: () => { + if (!isNumber(value)) { + throw new Error('value must be a number for compact number output'); + } + + return Intl.NumberFormat(locale, { + style: 'decimal', + notation: 'compact', + maximumSignificantDigits: 3, + }) + .format(Math.abs(value)) + .toLowerCase(); + }, + [OutputType.Number]: () => + valueBN.toFormat(fractionDigits ?? 0, roundingMode, { + ...format, + }), + [OutputType.Fiat]: () => + valueBN.toFormat(fractionDigits ?? USD_DECIMALS, roundingMode, { + ...format, + prefix: '$', + }), + [OutputType.SmallFiat]: () => + valueBN.toFormat(fractionDigits ?? SMALL_USD_DECIMALS, roundingMode, { + ...format, + prefix: '$', + }), + [OutputType.CompactFiat]: () => { + if (!isNumber(value)) { + throw new Error('value must be a number for compact fiat output'); + } + return Intl.NumberFormat(locale, { + style: 'currency', + currency: 'USD', + notation: 'compact', + maximumSignificantDigits: 3, + }) + .format(Math.abs(value)) + .toLowerCase(); + }, + [OutputType.Asset]: () => + valueBN.toFormat(fractionDigits ?? TOKEN_DECIMALS, roundingMode, { + ...format, + }), + [OutputType.Percent]: () => + valueBN.times(100).toFormat(fractionDigits ?? PERCENT_DECIMALS, roundingMode, { + ...format, + suffix: '%', + }), + [OutputType.SmallPercent]: () => + valueBN + .times(100) + .toFormat(fractionDigits ?? SMALL_PERCENT_DECIMALS, roundingMode, { + ...format, + suffix: '%', + }), + [OutputType.Multiple]: () => + valueBN.toFormat(fractionDigits ?? LEVERAGE_DECIMALS, roundingMode, { + ...format, + suffix: '×', + }), + }[type]()} + {slotRight} + {tag && {tag}} + + ); + } + default: + return null; + } +}; + +const Styled: Record = {}; + +Styled.Output = styled.output<{ withParentheses?: boolean }>` + --output-beforeString: ''; + --output-afterString: ''; + --output-sign-color: currentColor; + + ${layoutMixins.inlineRow} + gap: 0; + + &:empty { + color: var(--color-text-0); + opacity: 0.5; + + &:after { + content: '-' var(--output-afterString); + } + } + + &:before { + content: var(--output-beforeString); + } + + &:after { + content: var(--output-afterString); + } + + ${({ withParentheses }) => + withParentheses && + css` + --output-beforeString: '('; + --output-afterString: ')'; + `} +`; + +Styled.Tag = styled(Tag)` + margin-left: 0.5ch; +`; + +Styled.Sign = styled.span` + color: var(--output-sign-color); +`; + +Styled.Text = styled(Styled.Output)``; + +Styled.Number = styled(Styled.Output)<{ withBaseFont?: boolean }>` + ${({ withBaseFont }) => + !withBaseFont && + css` + font-feature-settings: var(--fontFeature-monoNumbers); + `} +`; diff --git a/src/components/PageMenu.stories.tsx b/src/components/PageMenu.stories.tsx new file mode 100644 index 0000000..00222d2 --- /dev/null +++ b/src/components/PageMenu.stories.tsx @@ -0,0 +1,65 @@ +import { MemoryRouter } from 'react-router-dom'; +import type { Story } from '@ladle/react'; + +import type { MenuGroup } from '@/constants/menus'; + +import { PageMenu } from '@/components/PageMenu'; +import { PageMenuItemType } from './PageMenu/PageMenuItem'; + +import { StoryWrapper } from '.ladle/components'; + +export const PageMenuStory: Story> = (args) => { + return ( + + + + ); +}; + +PageMenuStory.args = { + group: 'story', + items: [ + { + value: 'language-nav-item', + type: PageMenuItemType.Navigation, + href: '', + label: 'Language', + labelRight: 'English', + }, + { + value: 'notification-nav-item', + type: PageMenuItemType.Navigation, + href: '', + label: 'Notifications', + }, + { + value: 'network-nav-item', + type: PageMenuItemType.Navigation, + href: '', + label: 'Network', + }, + { + type: PageMenuItemType.RadioGroup, + value: 'english', + label: 'Language', + subitems: [ + { + value: 'english', + label: 'English', + }, + { + value: 'spanish', + label: 'Spanish', + }, + ], + }, + ], +}; + +PageMenuStory.decorators = [ + (Story) => ( + + + + ), +]; diff --git a/src/components/PageMenu.tsx b/src/components/PageMenu.tsx new file mode 100644 index 0000000..d505bea --- /dev/null +++ b/src/components/PageMenu.tsx @@ -0,0 +1,26 @@ +import styled, { AnyStyledComponent } from 'styled-components'; + +import type { MenuGroup } from '@/constants/menus'; + +import { layoutMixins } from '@/styles/layoutMixins'; + +import { PageMenuItem, type PageMenuItemType } from './PageMenu/PageMenuItem'; + +export const PageMenu = ({ + items, +}: MenuGroup) => ( + + {items.map((item) => ( + + ))} + +); + +const Styled: Record = {}; + +Styled.PageMenu = styled.menu` + ${layoutMixins.flexColumn} + ${layoutMixins.withInnerHorizontalBorders} + + font: var(--font-medium-book); +`; diff --git a/src/components/PageMenu/PageMenuItem.tsx b/src/components/PageMenu/PageMenuItem.tsx new file mode 100644 index 0000000..5cafbc6 --- /dev/null +++ b/src/components/PageMenu/PageMenuItem.tsx @@ -0,0 +1,27 @@ +import type { MenuItem } from '@/constants/menus'; + +import { PageMenuNavigationItem } from './PageMenuNavigationItem'; +import { PageMenuRadioGroupItem } from './PageMenuRadioGroup'; + +export enum PageMenuItemType { + Navigation = 'navigation', + Toggle = 'toggle', + RadioGroup = 'radioGroup', +} + +export const PageMenuItem = ({ + type, + ...props +}: MenuItem) => { + switch (type) { + case PageMenuItemType.Navigation: + return ; + case PageMenuItemType.Toggle: + // TODO: implement toggle item component when needed for notifications settings + return null; + case PageMenuItemType.RadioGroup: + return ; + default: + return null; + } +}; diff --git a/src/components/PageMenu/PageMenuNavigationItem.tsx b/src/components/PageMenu/PageMenuNavigationItem.tsx new file mode 100644 index 0000000..0ea4525 --- /dev/null +++ b/src/components/PageMenu/PageMenuNavigationItem.tsx @@ -0,0 +1,51 @@ +import styled, { AnyStyledComponent } from 'styled-components'; +import { Link } from 'react-router-dom'; + +import type { MenuItem } from '@/constants/menus'; + +import { Icon, IconName } from '@/components/Icon'; + +import { layoutMixins } from '@/styles/layoutMixins'; +import { popoverMixins } from '@/styles/popoverMixins'; + +export const PageMenuNavigationItem = < + MenuItemValue extends string, + PageMenuItemType extends string +>({ + href, + label, + labelRight, +}: MenuItem) => ( + + +
{label}
+ + {labelRight && {labelRight}} + + +
+ +); + +const Styled: Record = {}; + +Styled.MenuItem = styled.ul` + ${popoverMixins.item} + + --item-padding: 1.25rem 1.625rem; + /* --item-border-width: var(--border-width); */ + + ${layoutMixins.spacedRow} +`; + +Styled.RightRow = styled.div` + ${layoutMixins.row} + gap: 1rem; + + font: var(--font-base-book); + color: var(--color-text-0); +`; + +Styled.Icon = styled(Icon)` + color: var(--color-text-0); +`; diff --git a/src/components/PageMenu/PageMenuRadioGroup.tsx b/src/components/PageMenu/PageMenuRadioGroup.tsx new file mode 100644 index 0000000..5df5dea --- /dev/null +++ b/src/components/PageMenu/PageMenuRadioGroup.tsx @@ -0,0 +1,72 @@ +import styled, { AnyStyledComponent } from 'styled-components'; +import { Root, Item } from '@radix-ui/react-radio-group'; + +import type { MenuItem } from '@/constants/menus'; + +import { Icon, IconName } from '@/components/Icon'; + +import { layoutMixins } from '@/styles/layoutMixins'; +import { popoverMixins } from '@/styles/popoverMixins'; + +export const PageMenuRadioGroupItem = < + MenuItemValue extends string, + PageMenuItemType extends string +>({ + value: curentValue, + onSelect, + subitems, +}: MenuItem) => + subitems?.length ? ( + + {subitems.map(({ disabled, value, label, slotBefore }) => ( + +
+ <>{slotBefore} + {label} +
+ {value === curentValue ? ( + + ) : ( + + )} +
+ ))} +
+ ) : null; + +const Styled: Record = {}; + +Styled.Root = styled(Root)` + ${layoutMixins.flexColumn} + ${layoutMixins.withInnerHorizontalBorders} + + gap: var(--border-width); +`; + +Styled.MenuItem = styled(Item)<{ $selected: boolean }>` + ${layoutMixins.spacedRow} + ${popoverMixins.item} + + --item-padding: 1.25rem 1.625rem; + --item-checked-backgroundColor: var(--color-layer-0); +`; + +Styled.CheckIcon = styled(Icon)` + padding: 4px; + + border-radius: 50%; + + color: var(--color-text-1); + background-color: var(--color-accent); +`; + +Styled.EmptyIcon = styled.div` + width: 0.9em; + height: 0.9em; + + box-shadow: 0 0 0 0.1em var(--color-layer-5); + border-radius: 50%; + + background-color: var(--color-layer-0); +`; + diff --git a/src/components/Panel.stories.tsx b/src/components/Panel.stories.tsx new file mode 100644 index 0000000..ecdb993 --- /dev/null +++ b/src/components/Panel.stories.tsx @@ -0,0 +1,18 @@ +import type { Story } from '@ladle/react'; + +import { Panel } from '@/components/Panel'; + +import { StoryWrapper } from '.ladle/components'; + +export const PanelStory: Story<{ slotHeader: React.ReactNode, children?: React.ReactNode }> = (args) => { + return ( + + + + ); +}; + +PanelStory.args = { + slotHeader: 'Header', + children: 'Content', +}; diff --git a/src/components/Panel.tsx b/src/components/Panel.tsx new file mode 100644 index 0000000..6873f96 --- /dev/null +++ b/src/components/Panel.tsx @@ -0,0 +1,89 @@ +import styled, { AnyStyledComponent, css } from 'styled-components'; +import { Link } from 'react-router-dom'; + +import { Icon, IconName } from '@/components/Icon'; + +import { layoutMixins } from '@/styles/layoutMixins'; + +type PanelProps = { + slotHeaderContent?: string; + slotHeader?: React.ReactNode; + children?: React.ReactNode; + href?: string; + onHeaderClick?: () => void; +}; + +type PanelStyleProps = { + className?: string; + hasSeparator?: boolean; +}; + +export const Panel = ({ + slotHeaderContent, + slotHeader, + children, + href, + onHeaderClick, + hasSeparator, + className, +}: PanelProps & PanelStyleProps) => ( + + {href ? ( + + {slotHeader ? ( + slotHeader + ) : ( + + {slotHeaderContent} + + + )} + + ) : slotHeader ? ( + slotHeader + ) : ( + slotHeaderContent && ( + + {slotHeaderContent} + + ) + )} + {children} + +); + +const Styled: Record = {}; + +Styled.Panel = styled.section` + ${layoutMixins.flexColumn} + + background-color: var(--color-layer-3); + border-radius: 0.875rem; +`; + +Styled.Header = styled.header<{ hasSeparator?: boolean }>` + ${layoutMixins.spacedRow} + + padding: 0.875rem 1rem 0.625rem; + font-size: 0.875rem; + + ${({ hasSeparator }) => + hasSeparator && + css` + box-shadow: 0 var(--border-width) var(--border-color); + `} +`; + +Styled.Icon = styled(Icon)` + color: var(--color-text-0); + + font-size: 0.625rem; +`; + +Styled.Content = styled.div` + ${layoutMixins.scrollArea} + ${layoutMixins.stickyArea0} + --stickyArea0-background: transparent; + + padding: 0.5rem 1rem; +`; diff --git a/src/components/Popover.tsx b/src/components/Popover.tsx new file mode 100644 index 0000000..3f07b7d --- /dev/null +++ b/src/components/Popover.tsx @@ -0,0 +1,133 @@ +import { useMemo, useState } from 'react'; +import styled, { type AnyStyledComponent, css, keyframes } from 'styled-components'; +import { Root, Trigger, Content, Portal } from '@radix-ui/react-popover'; +import { useRect } from '@radix-ui/react-use-rect'; + +import { popoverMixins } from '@/styles/popoverMixins'; + +export enum TriggerType { + Default = 'Default', + SearchSelect = 'SearchSelect', + MarketDropdown = 'MarketDropdown', +} + +type ElementProps = { + modal?: boolean; + open?: boolean; + onOpenChange?: (open: boolean) => void; + slotTrigger: React.ReactNode; + slotAnchor?: React.ReactNode; + children: React.ReactNode; +}; + +type StyleProps = { + className?: string; + fullWidth?: boolean; + noBlur?: boolean; + sideOffset?: number; + triggerType?: TriggerType; + withPortal?: boolean; +}; + +export type PopoverProps = ElementProps & StyleProps; + +export const Popover = ({ + modal = true, + open, + onOpenChange, + slotTrigger, + slotAnchor, + sideOffset, + fullWidth, + noBlur, + triggerType = TriggerType.Default, + withPortal = false, + className, + children, +}: PopoverProps) => { + const [trigger, setTrigger] = useState(null); + const rect = useRect(trigger); + const width = useMemo(() => fullWidth && rect?.width, undefined); + + const content = ( + { + e.preventDefault(); + }} + style={{ width }} + $noBlur={noBlur} + className={className} + sideOffset={sideOffset} + > + {children} + + ); + + return ( + + + {slotTrigger} + + {slotAnchor} + {withPortal ? {content} : content} + + ); +}; + +const Styled: Record = {}; + +Styled.Trigger = styled(Trigger)<{ $noBlur?: boolean; $triggerType: TriggerType }>` + ${popoverMixins.backdropOverlay} + ${popoverMixins.trigger} + + ${({ $triggerType }) => + ({ + [TriggerType.Default]: css` + ${popoverMixins.triggerWithGrid} + `, + [TriggerType.SearchSelect]: popoverMixins.searchSelectTrigger, + [TriggerType.MarketDropdown]: popoverMixins.marketDropdownTrigger, + }[$triggerType])} + + ${({ $noBlur }) => + $noBlur && + css` + &[data-state='open']:after { + backdrop-filter: none; + } + `} + + --trigger-padding: 0; +`; + +Styled.Content = styled(Content)<{ $noBlur?: boolean }>` + ${({ $noBlur }) => + !$noBlur && + css` + @media (prefers-reduced-motion: no-preference) { + &[data-state='open'] { + @media (prefers-reduced-motion: no-preference) { + transition: var(--ease-in-expo) 0.25s; + + animation: ${keyframes` + from { + opacity: 0; + filter: blur(2px); + } + `} 0.2s; + } + } + + &[data-state='closed'] { + @media (prefers-reduced-motion: no-preference) { + animation: ${keyframes` + to { + opacity: 0; + filter: blur(2px); + } + `} 0.2s; + } + } + } + `} +`; diff --git a/src/components/PositionSideTag.stories.tsx b/src/components/PositionSideTag.stories.tsx new file mode 100644 index 0000000..dcaf1ab --- /dev/null +++ b/src/components/PositionSideTag.stories.tsx @@ -0,0 +1,43 @@ +import type { Story } from '@ladle/react'; + +import { PositionSide } from '@/constants/trade'; + +import { PositionSideTag } from '@/components/PositionSideTag'; + +import { StoryWrapper } from '.ladle/components'; + +export const LongTagStory: Story<{ positionSide: PositionSide }> = (args) => { + return ( + + + + ); +}; + +LongTagStory.args = { + positionSide: PositionSide.Long, +}; + +export const ShortTagStory: Story<{ positionSide: PositionSide }> = (args) => { + return ( + + + + ); +}; + +ShortTagStory.args = { + positionSide: PositionSide.Short, +}; + +export const NoneTagStory: Story<{ positionSide: PositionSide }> = (args) => { + return ( + + + + ); +}; + +NoneTagStory.args = { + positionSide: PositionSide.None, +}; diff --git a/src/components/PositionSideTag.tsx b/src/components/PositionSideTag.tsx new file mode 100644 index 0000000..710672f --- /dev/null +++ b/src/components/PositionSideTag.tsx @@ -0,0 +1,28 @@ +import { POSITION_SIDE_STRINGS, PositionSide } from '@/constants/trade'; +import { useStringGetter } from '@/hooks'; + +import { Tag, TagSign, TagSize, TagType } from '@/components/Tag'; + +type ElementProps = { + positionSide: PositionSide | null; +}; + +type StyleProps = { + size?: TagSize; +}; + +export const positionSideTagSign: Record = { + [PositionSide.Long]: TagSign.Positive, + [PositionSide.Short]: TagSign.Negative, + [PositionSide.None]: TagSign.Neutral, +}; + +export const PositionSideTag = ({ positionSide, size }: ElementProps & StyleProps) => { + const stringGetter = useStringGetter(); + + return ( + + {stringGetter({ key: POSITION_SIDE_STRINGS[positionSide || PositionSide.None] })} + + ); +}; diff --git a/src/components/QrCode.tsx b/src/components/QrCode.tsx new file mode 100644 index 0000000..d5bc6a6 --- /dev/null +++ b/src/components/QrCode.tsx @@ -0,0 +1,93 @@ +import { useEffect, useRef } from 'react'; +import { useSelector } from 'react-redux'; +import styled, { AnyStyledComponent } from 'styled-components'; +import QRCodeStyling from 'qr-code-styling'; + +import { getAppTheme } from '@/state/configsSelectors'; +import { AppTheme } from '@/state/configs'; + +type ElementProps = { + value: string; +}; + +type StyleProps = { + hasLogo?: boolean; + size?: number; +}; + +const DARK_LOGO_MARK_URL = '/logos/logo-mark-dark.svg'; +const LIGHT_LOGO_MARK_URL = '/logos/logo-mark-light.svg'; + +export const QrCode = ({ value, hasLogo, size = 300 }: ElementProps & StyleProps) => { + const ref = useRef(null); + const appTheme: AppTheme = useSelector(getAppTheme); + + const { current: qrCode } = useRef( + new QRCodeStyling({ + type: 'svg', + width: size, + height: size, + data: value, + margin: 8, + backgroundOptions: { + color: 'var(--color-layer-4)', + }, + imageOptions: { + imageSize: 0.4, + margin: 12, + }, + dotsOptions: { + type: 'dots', + color: 'var(--color-text-2)', + }, + cornersDotOptions: { + type: 'square', + }, + image: hasLogo + ? appTheme === AppTheme.Light + ? DARK_LOGO_MARK_URL + : LIGHT_LOGO_MARK_URL + : undefined, + cornersSquareOptions: { + type: 'extra-rounded', + color: 'var(--color-text-2)', + }, + qrOptions: { + errorCorrectionLevel: 'M', + }, + }) + ); + + useEffect(() => { + qrCode.append(ref.current || undefined); + }, []); + + useEffect(() => { + ref.current?.firstElementChild?.setAttribute('viewBox', `0 0 ${size} ${size}`); + }, [ref.current]); + + useEffect(() => { + if (hasLogo) { + qrCode.update({ + image: appTheme === AppTheme.Light ? DARK_LOGO_MARK_URL : LIGHT_LOGO_MARK_URL, + }); + } + }, [appTheme, hasLogo]); + + return ; +}; + +const Styled: Record = {}; + +Styled.QrCode = styled.div` + width: 100%; + cursor: none; + border-radius: 0.75em; + + svg { + width: 100%; + height: auto; + border-radius: inherit; + border: var(--border-width) solid var(--color-layer-6); + } +`; diff --git a/src/components/RelativeTime.tsx b/src/components/RelativeTime.tsx new file mode 100644 index 0000000..0939a74 --- /dev/null +++ b/src/components/RelativeTime.tsx @@ -0,0 +1,34 @@ +import { useEffect, useState } from 'react'; +import { useSelector } from 'react-redux'; + +import { getSelectedLocale } from '@/state/localizationSelectors'; + +import { formatRelativeTime } from '@/lib/dateTime'; + +export const RelativeTime = ({ + timestamp, + format, + resolution = 2, +}: { + timestamp?: number; + format: 'long' | 'short' | 'narrow' | 'singleCharacter'; + resolution?: number; +}) => { + const locale = useSelector(getSelectedLocale); + + const [now, setNow] = useState(Date.now()); + + useEffect(() => { + const i = setInterval(() => setNow(Date.now()), 60_000); + return () => clearInterval(i); + }, []); + + return timestamp && new Date(timestamp).valueOf() ? ( + + ) : null; +}; diff --git a/src/components/Ring.stories.tsx b/src/components/Ring.stories.tsx new file mode 100644 index 0000000..3c8b4ca --- /dev/null +++ b/src/components/Ring.stories.tsx @@ -0,0 +1,17 @@ +import type { Story } from '@ladle/react'; + +import { Ring } from '@/components/Ring'; + +import { StoryWrapper } from '.ladle/components'; + +export const RingStory: Story<{ value: number }> = (args) => { + return ( + + + + ); +}; + +RingStory.args = { + value: 0, +}; diff --git a/src/components/Ring.tsx b/src/components/Ring.tsx new file mode 100644 index 0000000..ddfe610 --- /dev/null +++ b/src/components/Ring.tsx @@ -0,0 +1,68 @@ +import styled, { css, keyframes, type AnyStyledComponent } from 'styled-components'; + +type ElementProps = { + value: number; +}; + +type StyleProps = { + className?: string; + withAnimation?: boolean; +}; + +export const Ring = ({ className, value, withAnimation }: ElementProps & StyleProps) => { + const radius = 12; + const circumference = radius * 2 * Math.PI; + const offset = Math.max(circumference - circumference * value, 0); + + return ( + + + + + ); +}; + +const Styled: Record = {}; + +Styled.Ring = styled.svg<{ withAnimation?: boolean }>` + --ring-color: currentColor; + + transform: rotate(-90deg); + width: 2rem; + height: 2rem; + + ${({ withAnimation }) => + withAnimation && + css` + animation: ${keyframes` + from{ + -webkit-transform: rotate(0deg); + } + to{ + -webkit-transform: rotate(360deg); + } + `} 2s linear infinite; + `} +`; diff --git a/src/components/ScrollAreas.stories.tsx b/src/components/ScrollAreas.stories.tsx new file mode 100644 index 0000000..a13d87f --- /dev/null +++ b/src/components/ScrollAreas.stories.tsx @@ -0,0 +1,259 @@ +import styled, { AnyStyledComponent } from 'styled-components'; +import type { Story } from '@ladle/react'; + +import { StoryWrapper } from '.ladle/components'; +import { layoutMixins } from '@/styles/layoutMixins'; + +export const ScrollAreasStory: Story<{}> = (args) => ( + + +

+ Scroll area. (layoutMixins.scrollArea) +

+ + + +
+ +

Basic sticky area:

+ + + Sticky header. + +

+ Sticky area. (layoutMixins.stickyArea0) +

+ + + + Sticky footer. +
+ + + +
+ +

Nested sticky area:

+ + + Sticky header. + +

+ Sticky area. (layoutMixins.stickyArea0) +

+ + + + + Nested sticky header. + +

+ Nested sticky area. (layoutMixins.stickyArea1) +

+ + + + Nested sticky footer. +
+ +

+ Sticky area. (layoutMixins.stickyArea1) +

+ + Sticky footer. +
+ + + +
+ +

Super-nested sticky area:

+ + + Sticky header. + +

+ Sticky area. (layoutMixins.stickyArea0) +

+ + + Nested sticky header. + + + Super-nested sticky header. + +

+ Super-nested sticky area. (layoutMixins.stickyArea2) +

+ + + + Super-nested sticky footer. +
+ + Nested sticky footer. +
+ +

+ Sticky area. (layoutMixins.stickyArea1) +

+ + Sticky footer. +
+ +
+ +

Nested scroll area:

+ + + Sticky header. + +

+ Sticky area. (layoutMixins.stickyArea0) +

+ + + Nested sticky header. + + + Super-nested sticky header. + +

+ Super-nested sticky area. (layoutMixins.stickyArea2) +

+ + +

+ Nested scroll area. (layoutMixins.scrollArea) +

+ + + Sticky header. + +

+ Sticky area. (layoutMixins.stickyArea0) +

+ + + + Sticky footer. +
+
+ + Super-nested sticky footer. +
+ + Nested sticky footer. +
+ +

+ Sticky area. (layoutMixins.stickyArea1) +

+ + Sticky footer. +
+
+
+); + +const Styled: Record = {}; + +Styled.ScrollArea = styled.section<{ width: string, height: string, }>` + ${layoutMixins.container} + ${layoutMixins.scrollArea} + + width: ${({ width }) => width}; + height: ${({ height }) => height}; + + display: grid; + padding: 1.5rem; + gap: 1rem; + + background: var(--color-layer-1); + border: 1px solid; + border-radius: 1.5rem; + + h2 { + font-size: 1.5em; + font-weight: bold; + } +`; + +Styled.StickyHeader = styled.header<{}>` + ${layoutMixins.stickyHeader} + + ${layoutMixins.row} + padding-left: 1.5rem; + padding-right: 1.5rem; + gap: 1rem; + + font-size: 1.25em; + + background: rgba(255, 255, 255, 0.1); + border-radius: 0.5rem; +`; + +Styled.StickyFooter = styled.footer<{}>` + ${layoutMixins.stickyFooter} + + ${layoutMixins.row} + padding-left: 1.5rem; + padding-right: 1.5rem; + gap: 1rem; + + background: rgba(255, 255, 255, 0.1); + border-radius: 0.5rem; +`; + +Styled.StickyArea0 = styled.section<{ topHeight: string; bottomHeight: string }>` + ${layoutMixins.stickyArea0} + --stickyArea0-topHeight: ${({ topHeight }) => topHeight}; + --stickyArea0-bottomHeight: ${({ bottomHeight }) => bottomHeight}; + --stickyArea0-background: var(--color-layer-2); + + isolation: isolate; + + display: grid; + padding: 1.5rem; + gap: 1rem; + + border-radius: 1rem; +`; + +Styled.StickyArea1 = styled.section<{ topHeight: string; bottomHeight: string }>` + ${layoutMixins.stickyArea1} + --stickyArea1-topHeight: ${({ topHeight }) => topHeight}; + --stickyArea1-bottomHeight: ${({ bottomHeight }) => bottomHeight}; + --stickyArea1-background: var(--color-layer-3); + + isolation: isolate; + + display: grid; + padding: 1.5rem; + gap: 1rem; + + border-radius: 0.5rem; +`; + +Styled.StickyArea2 = styled.section<{ topHeight: string; bottomHeight: string }>` + ${layoutMixins.stickyArea2} + --stickyArea2-topHeight: ${({ topHeight }) => topHeight}; + --stickyArea2-bottomHeight: ${({ bottomHeight }) => bottomHeight}; + --stickyArea2-background: var(--color-layer-4); + + isolation: isolate; + + display: grid; + padding: 1.5rem; + gap: 1rem; + + border-radius: 0.5rem; +`; + +Styled.PlaceholderContent = styled.p` + opacity: 0.3; + + &:before { + content: 'Content content content content content content content content content content content content content content content content content content content content content content content content content content content content content content content content content content content content content content content content content content'; + } +`; diff --git a/src/components/SearchInput.stories.tsx b/src/components/SearchInput.stories.tsx new file mode 100644 index 0000000..8a8258e --- /dev/null +++ b/src/components/SearchInput.stories.tsx @@ -0,0 +1,25 @@ +import styled, { AnyStyledComponent } from 'styled-components'; +import type { Story } from '@ladle/react'; + +import { SearchInput } from '@/components/SearchInput'; + +import { StoryWrapper } from '.ladle/components'; +import { layoutMixins } from '@/styles/layoutMixins'; +import { InputType } from './Input'; + +export const SearchInputStory: Story> = (args) => ( + + + + + +); + +const Styled: Record = {}; + +Styled.Container = styled.section` + background: var(--color-layer-3); + + ${layoutMixins.container} + width: 300px; +`; diff --git a/src/components/SearchInput.tsx b/src/components/SearchInput.tsx new file mode 100644 index 0000000..14b1772 --- /dev/null +++ b/src/components/SearchInput.tsx @@ -0,0 +1,94 @@ +import { useState } from 'react'; +import styled, { type AnyStyledComponent, css } from 'styled-components'; + +import { layoutMixins } from '@/styles/layoutMixins'; + +import { IconName } from '@/components/Icon'; +import { IconButton } from '@/components/IconButton'; +import { Input, type InputProps } from '@/components/Input'; + +type ElementProps = { + onOpenChange?: (isOpen: boolean) => void; + onTextChange?: (value: string) => void; +}; + +export type SearchInputProps = ElementProps & InputProps; + +export const SearchInput = ({ + type, + placeholder, + onOpenChange, + onTextChange, +}: SearchInputProps) => { + const [isOpen, setIsOpen] = useState(false); + const [value, setValue] = useState(''); + + return ( + + { + setIsOpen(isPressed); + onOpenChange?.(isPressed); + + if (!isPressed) { + onTextChange?.(''); + setValue(''); + } + }} + /> + ) => { + setValue(e.target.value); + onTextChange?.(e.target.value); + }} + disabled={!isOpen} + placeholder={placeholder} + /> + + ); +}; + +const Styled: Record = {}; + +Styled.Search = styled.div` + ${layoutMixins.row} + + justify-content: end; + width: 100%; + height: 100%; +`; + +Styled.Input = styled(Input)<{ isOpen: boolean }>` + max-width: 0; + + @media (prefers-reduced-motion: no-preference) { + transition: max-width 0.45s var(--ease-out-expo); + } + + ${({ isOpen }) => + isOpen && + css` + padding-left: 0.5rem; + max-width: 100%; + `} +`; + +Styled.IconButton = styled(IconButton)<{ iconName: IconName.Close | IconName.Search }>` + --button-toggle-on-backgroundColor: var(--color-layer-3); + --button-toggle-on-textColor: var(--color-text-0); + + ${({ iconName }) => + iconName === IconName.Close && + css` + svg { + height: 0.875em; + } + `} +`; diff --git a/src/components/SearchSelectMenu.stories.tsx b/src/components/SearchSelectMenu.stories.tsx new file mode 100644 index 0000000..16a81d7 --- /dev/null +++ b/src/components/SearchSelectMenu.stories.tsx @@ -0,0 +1,46 @@ +import { useState } from 'react'; +import type { Story } from '@ladle/react'; +import styled from 'styled-components'; + +import { SearchSelectMenu } from '@/components/SearchSelectMenu'; + +import { StoryWrapper } from '.ladle/components'; + +export const SearchSelectMenuStory: Story> = (args) => { + const [selectedItem, setSelectedItem] = useState(); + + const exampleItems = [ + { + group: 'items', + groupLabel: 'Group of Items', + items: Array.from({ length: 1000 }, (_, i) => ({ + value: i.toString(), + label: `Item ${i}`, + onSelect: () => setSelectedItem(`Item ${i}`), + })), + }, + ]; + + return ( + + + + {!selectedItem ? Search and Select : {selectedItem}} + + + + ); +}; + +SearchSelectMenuStory.args = { + withSearch: true, +}; + +SearchSelectMenuStory.argTypes = {}; + +const Container = styled.div` + width: 400px; +`; diff --git a/src/components/SearchSelectMenu.tsx b/src/components/SearchSelectMenu.tsx new file mode 100644 index 0000000..1fd1ef7 --- /dev/null +++ b/src/components/SearchSelectMenu.tsx @@ -0,0 +1,158 @@ +import { type ReactNode, useState, useRef } from 'react'; +import styled, { type AnyStyledComponent, css } from 'styled-components'; + +import { type MenuConfig } from '@/constants/menus'; +import { useOnClickOutside } from '@/hooks'; + +import { ComboboxMenu } from '@/components/ComboboxMenu'; +import { type DetailsItem } from '@/components/Details'; +import { Icon, IconName } from '@/components/Icon'; +import { Popover, TriggerType } from '@/components/Popover'; +import { WithDetailsReceipt } from '@/components/WithDetailsReceipt'; +import { WithLabel } from '@/components/WithLabel'; + +import { layoutMixins } from '@/styles/layoutMixins'; + +type ElementProps = { + asChild?: boolean; + children: ReactNode; + disabled?: boolean; + label?: string; + items: MenuConfig; + withSearch?: boolean; + withReceiptItems?: DetailsItem[]; +}; + +type StyleProps = { + className?: string; +}; + +export type SearchSelectMenuProps = ElementProps & StyleProps; + +export const SearchSelectMenu = ({ + asChild, + children, + className, + disabled, + label, + items, + withSearch, + withReceiptItems, +}: SearchSelectMenuProps) => { + const [open, setOpen] = useState(false); + const searchSelectMenuRef = useRef(null); + + useOnClickOutside({ + onClickOutside(e: MouseEvent) { + setOpen(false); + }, + ref: searchSelectMenuRef, + }); + + const Trigger = asChild ? ( + children + ) : ( + <> + + {children} + + + + ); + + return ( + + + + setOpen(false)} + withStickyLayout + /> + + + + ); +}; + +const Styled: Record = {}; + +Styled.MenuTrigger = styled.div` + height: 3.5rem; + + ${layoutMixins.spacedRow} + align-items: center; + padding: 0 1rem; +`; + +Styled.WithLabel = styled(WithLabel)` + --label-textColor: var(--color-text-0); + gap: 0.25rem; + + label { + font: var(--font-mini-book); + } +`; + +Styled.SearchSelectMenu = styled.div` + ${layoutMixins.column} +`; + +Styled.WithDetailsReceipt = styled(WithDetailsReceipt)` + --withReceipt-backgroundColor: var(--color-layer-2); + + abbr { + background-color: var(--withReceipt-backgroundColor); + } +`; + +Styled.Popover = styled(Popover)` + max-height: 30vh; + margin-top: 1rem; + border: 1px solid var(--color-layer-6); + border-radius: 0.5rem; + z-index: 2; + box-shadow: none; +`; + +Styled.ComboboxMenu = styled(ComboboxMenu)` + ${layoutMixins.withInnerHorizontalBorders} + + --comboboxMenu-backgroundColor: var(--color-layer-4); + + --comboboxMenu-input-backgroundColor: var(--color-layer-4); + --comboboxMenu-input-height: 1.375rem; + + --comboboxMenu-item-checked-backgroundColor: var(--color-layer-4); + --comboboxMenu-item-highlighted-backgroundColor: var(--color-layer-5); + --comboboxMenu-item-checked-textColor: var(--color-text-2); + --comboboxMenu-item-highlighted-textColor: var(--color-text-2); + + input:focus { + outline: none; + } + + border-radius: 0.5rem; + max-height: 30vh; + overflow: auto; +`; + +Styled.TriggerIcon = styled(Icon)<{ open?: boolean }>` + width: 0.625rem; + height: 0.375rem; + color: var(--color-text-0); + + ${({ open }) => + open && + css` + transform: rotate(180deg); + `} +`; diff --git a/src/components/SelectMenu.stories.tsx b/src/components/SelectMenu.stories.tsx new file mode 100644 index 0000000..d6d50a7 --- /dev/null +++ b/src/components/SelectMenu.stories.tsx @@ -0,0 +1,63 @@ +import { useState } from 'react'; +import styled, { AnyStyledComponent } from 'styled-components'; +import type { Story } from '@ladle/react'; + +import { SelectMenu, SelectItem } from '@/components/SelectMenu'; + +import { StoryWrapper } from '.ladle/components'; +import { layoutMixins } from '@/styles/layoutMixins'; + +const exampleItems: { value: string; label: string }[] = [ + { + value: '1', + label: 'Item 1', + }, + { + value: '2', + label: 'Item 2', + }, + { + value: '3', + label: 'Item 3', + }, + { + value: '4', + label: 'Item 4', + }, +]; + +export const SelectMenuStory: Story> = (args) => { + const [value, setValue] = useState(exampleItems[0].value); + const [value2, setValue2] = useState(exampleItems[2].value); + + return ( + + + + {exampleItems.map(({ value, label }) => ( + + ))} + + + + {exampleItems.map(({ value, label }) => ( + + ))} + + + + ); +}; + +const Styled: Record = {}; + +Styled.Container = styled.section` + background: var(--color-layer-3); + + ${layoutMixins.container} + + padding: 10px; + display: flex; + align-items: center; + gap: 8px; +`; diff --git a/src/components/SelectMenu.tsx b/src/components/SelectMenu.tsx new file mode 100644 index 0000000..a53d600 --- /dev/null +++ b/src/components/SelectMenu.tsx @@ -0,0 +1,117 @@ +import React from 'react'; +import styled, { type AnyStyledComponent } from 'styled-components'; + +import { + Root, + Value, + Viewport, + Trigger, + Content, + Item, + ItemText, + ItemIndicator, + Portal, + Icon as SelectIcon, +} from '@radix-ui/react-select'; + +import { popoverMixins } from '@/styles/popoverMixins'; +import { formMixins } from '@/styles/formMixins'; + +import { WithLabel } from '@/components/WithLabel'; + +export const SelectMenu = ({ + children, + className, + value, + onValueChange, + label, + withBlur, +}: { + children: React.ReactNode; + className?: string; + value: T; + onValueChange: (value: T) => void; + label?: React.ReactNode; + withBlur?: boolean; +}) => { + return ( + + + {label ? ( + + + + ) : ( + + )} + {React.Children.toArray(children).length > 1 && } + + + + {/* */} + {children} + {/* */} + + + + ); +}; + +export const SelectItem = ({ + className, + value, + label, +}: { + className?: string; + value: T; + label: string; +}) => ( + + {label} + ✔{/* */} + +); + +const Styled: Record = {}; + +Styled.Trigger = styled(Trigger)<{ $withBlur?: boolean }>` + --select-menu-trigger-maxWidth: ; + max-width: var(--select-menu-trigger-maxWidth); + ${popoverMixins.trigger} + ${({ $withBlur }) => $withBlur && popoverMixins.backdropOverlay} + + > * { + text-align: start; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } +`; + +Styled.DropdownIcon = styled(SelectIcon)` + font-size: 0.675em; + color: var(--color-text-1); +`; + +Styled.Content = styled(Content)` + --select-menu-content-maxWidth: ; + max-width: var(--select-menu-content-maxWidth); + + ${popoverMixins.popover} + ${popoverMixins.popoverAnimation} +`; + +Styled.Item = styled(Item)` + ${popoverMixins.item} +`; + +Styled.ItemIndicator = styled(ItemIndicator)` + margin-left: auto; + display: inline-flex; + transition: transform 0.3s var(--ease-out-expo); +`; + +Styled.WithLabel = styled(WithLabel)` + ${formMixins.inputLabel} + border-radius: 0; +`; diff --git a/src/components/Separator.tsx b/src/components/Separator.tsx new file mode 100644 index 0000000..64c6e6c --- /dev/null +++ b/src/components/Separator.tsx @@ -0,0 +1,106 @@ +import { Fragment } from 'react'; +import styled, { css } from 'styled-components'; + +import { Separator } from '@radix-ui/react-separator'; + +const StyledSeparator = styled(Separator)` + flex: 0 !important; + z-index: -1; + + &[data-orientation='horizontal'] { + align-self: stretch; + /* margin: 0 0 calc(-1 * var(--border-width)) 0 !important; */ + + border-bottom: solid var(--border-width) var(--color-border); + } + + &[data-orientation='vertical'] { + align-self: center; + width: 0; + height: calc(100% - 1.5rem); + margin: 0 !important; + + border-right: solid var(--border-width) var(--color-border); + } +`; + +export const HorizontalSeparator = ({ + className, + decorative = false, +}: { + className?: string; + decorative?: boolean; +}) => ; + +export const VerticalSeparator = ({ + className, + decorative = false, +}: { + className?: string; + decorative?: boolean; +}) => ; + +export const WithSeparators = ({ + layout, + children, + withSeparators = true, +}: { + layout: 'column' | 'row'; + children: React.ReactNode; + withSeparators?: boolean; +}) => ( + <> + {withSeparators + ? [children].flat().map((child, i, { length }) => ( + + {child} + {i < length - 1 && ( + + )} + + )) + : children} + +); + +export const HorizontalSeparatorWithText = styled(HorizontalSeparator)<{ contents?: string }>` + --contents: ''; + + ${({ contents }) => + contents && + css` + --contents: '${contents}'; + `} + + position: relative; + + &:before { + content: var(--contents); + position: absolute; + top: 0; + left: 50%; + transform: translate(-50%, -50%); + background-color: inherit; + padding: 0 0.5em; + } +`; + +const StyledHorizontalSeparatorFiller = styled(Separator)` + flex: 1; + height: var(--border-width); + background-color: var(--color-border); +`; + +export const HorizontalSeparatorFiller = ({ className }: { className?: string }) => ( + +); diff --git a/src/components/StepIndicator.stories.tsx b/src/components/StepIndicator.stories.tsx new file mode 100644 index 0000000..bca960b --- /dev/null +++ b/src/components/StepIndicator.stories.tsx @@ -0,0 +1,16 @@ +import type { Story } from '@ladle/react'; + +import { StoryWrapper } from '.ladle/components'; + +import { StepIndicator, type StepIndicatorProps } from './StepIndicator'; + +export const StepIndicatorStory: Story = (args) => ( + + + +); + +StepIndicatorStory.args = { + currentStepIndex: 1, + totalSteps: 3, +}; diff --git a/src/components/StepIndicator.tsx b/src/components/StepIndicator.tsx new file mode 100644 index 0000000..c83618f --- /dev/null +++ b/src/components/StepIndicator.tsx @@ -0,0 +1,86 @@ +import styled, { css, type AnyStyledComponent } from 'styled-components'; + +import { layoutMixins } from '@/styles/layoutMixins'; + +type ElementProps = { + currentStepIndex: number; + totalSteps: number; +}; + +type StyleProps = { + className?: string; +}; + +export type StepIndicatorProps = ElementProps & StyleProps; + +export const StepIndicator = ({ className, currentStepIndex, totalSteps }: StepIndicatorProps) => ( + + {[...Array(totalSteps)].map((_, i) => ( + + ))} + +); + +const Styled: Record = {}; + +Styled.StepIndicator = styled.div<{ progress: number }>` + --stepIndicator-line-backgroundColor: var(--color-layer-4); + --stepIndicator-step-backgroundColor: var(--color-layer-4); + --stepIndicator-active-step-boxShadowColor: hsla(240, 32%, 21%, 1); + --stepIndicator-progress: 0; + + ${({ progress }) => css` + --stepIndicator-progress: ${progress}%; + `} + + ${layoutMixins.inlineRow} + gap: 0.75em; + position: relative; + align-self: center; + isolation: isolate; + + &:before { + content: ''; + width: 100%; + height: 0.125rem; + background-color: var(--stepIndicator-line-backgroundColor); + position: absolute; + z-index: -1; + } + + &:after { + content: ''; + width: var(--stepIndicator-progress); + height: 0.125rem; + background-color: var(--color-accent); + position: absolute; + z-index: -1; + } +`; + +Styled.Step = styled.div<{ isActive?: boolean; isFilled?: boolean }>` + width: 0.5em; + height: 0.5em; + border-radius: 50%; + color: var(--stepIndicator-step-backgroundColor); + background-color: currentColor; + + ${({ isFilled }) => + isFilled && + css` + --stepIndicator-step-backgroundColor: var(--color-accent); + `} + + ${({ isActive }) => + isActive && + css` + box-shadow: 0 0 0 0.25rem var(--stepIndicator-active-step-boxShadowColor); + `} +`; diff --git a/src/components/Switch.stories.tsx b/src/components/Switch.stories.tsx new file mode 100644 index 0000000..a366025 --- /dev/null +++ b/src/components/Switch.stories.tsx @@ -0,0 +1,28 @@ +import { useState } from 'react'; +import type { Story } from '@ladle/react'; +import styled from 'styled-components'; + +import { StoryWrapper } from '.ladle/components'; + +import { Switch } from '@/components/Switch'; + +type SwitchProps = Parameters; + +export const SwitchStory: Story = (args: SwitchProps) => { + const [checked, setChecked] = useState(false); + return ( + + + + + ); +}; + +const StyledSwitch = styled(Switch)` + font-size: 2em; + margin-left: 1em; +`; + +SwitchStory.args = { + disabled: false, +}; diff --git a/src/components/Switch.tsx b/src/components/Switch.tsx new file mode 100644 index 0000000..103f933 --- /dev/null +++ b/src/components/Switch.tsx @@ -0,0 +1,88 @@ +import styled, { type AnyStyledComponent } from 'styled-components'; + +import { Root, Thumb } from '@radix-ui/react-switch'; + +type ElementProps = { + checked: boolean; + onCheckedChange: (checked: boolean) => void; + disabled?: boolean; + required?: boolean; + name?: string; + value?: string; +}; + +type StyleProps = { + className?: string; +}; + +export const Switch = ({ + checked, + className, + disabled, + name, + onCheckedChange, + required, + value, +}: ElementProps & StyleProps) => ( + + + +); + +const Styled: Record = {}; + +Styled.Root = styled(Root)` + --switch-width: 2.625em; + --switch-height: 1.5em; + --switch-backgroundColor: var(--color-layer-0); + --switch-thumb-backgroundColor: var(--color-layer-6); + + --switch-active-backgroundColor: var(--color-accent); + --switch-active-thumb-backgroundColor: var(--color-white); + + position: relative; + width: var(--switch-width); + height: var(--switch-height); + + background-color: var(--switch-backgroundColor); + border-radius: 100vmax; + transition: none; + -webkit-tap-highlight-color: var(--color-layer-0); + + &:disabled { + opacity: 0.75; + } + + &[data-state='checked'] { + background-color: var(--switch-active-backgroundColor); + } +`; + +Styled.Thumb = styled(Thumb)` + width: calc(var(--switch-width) / 2); + height: calc(var(--switch-height) - 0.1875em); + + display: block; + + background-color: var(--switch-thumb-backgroundColor); + border-radius: 50%; + + transform: translateX(0.125em); + + will-change: transform; + transition: transform 100ms; + + &[data-state='checked'] { + transform: translateX(calc((var(--switch-width) / 2) - 0.125em)); + background-color: var(--switch-active-thumb-backgroundColor); + } +`; diff --git a/src/components/Table.tsx b/src/components/Table.tsx new file mode 100644 index 0000000..9e2e91a --- /dev/null +++ b/src/components/Table.tsx @@ -0,0 +1,922 @@ +import React, { Fragment, Key, useCallback, useEffect, useMemo, useState } from 'react'; +import styled, { css, type AnyStyledComponent } from 'styled-components'; + +import { + useTable, + useTableCell, + useTableColumnHeader, + useTableRow, + useTableHeaderRow, + useTableRowGroup, + useTableSelectAllCheckbox, + useTableSelectionCheckbox, + mergeProps, + useFocusRing, + useCollator, +} from 'react-aria'; + +import { type ColumnSize, type TableCollection } from '@react-types/table'; +import { type GridNode } from '@react-types/grid'; + +import type { Node, SortDescriptor, SortDirection, CollectionChildren } from '@react-types/shared'; + +import { + Cell, + // CollectionBuilderContext, + Column, + Row, + TableBody, + TableHeader, + type TableState, + useTableState, +} from '@react-stately/table'; + +import { useAsyncList } from 'react-stately'; + +import { useBreakpoints } from '@/hooks'; +import { MediaQueryKeys } from '@/hooks/useBreakpoints'; + +import { Checkbox } from '@/components/Checkbox'; + +import { breakpoints } from '@/styles'; +import { layoutMixins } from '@/styles/layoutMixins'; + +import { Icon, IconName } from './Icon'; +import { Tag } from './Tag'; + +export { TableCell } from './Table/TableCell'; +export { TableColumnHeader } from './Table/TableColumnHeader'; +export { MarketTableCell } from './Table/MarketTableCell'; + +export type CustomRowConfig = { + key: string; + slotCustomRow: (..._: Parameters) => React.ReactNode; +}; + +export type TableItem = { + value: TableRowData; + + slotBefore?: () => React.ReactNode; + label: string; + tag?: React.ReactNode; + slotAfter?: () => React.ReactNode; + + onSelect?: (key: TableRowData) => void; +}; + +export type ColumnDef = { + columnKey: string; + label: React.ReactNode; + tag?: React.ReactNode; + colspan?: number; + childColumns?: ColumnDef[]; + getCellValue: (row: TableRowData) => string | number; + allowsSorting?: boolean; // Default true + allowsResizing?: boolean; + renderCell: (row: TableRowData) => React.ReactNode; + isActionable?: boolean; + hideOnBreakpoint?: MediaQueryKeys; + width?: ColumnSize; +}; + +type ElementProps = { + label?: string; + columns: ColumnDef[]; + data: TableRowData[]; + getRowKey: (rowData: TableRowData, rowIndex?: number) => TableRowKey; + getRowAttributes?: (rowData: TableRowData, rowIndex?: number) => Record; + // shouldRowRender?: (prevRowData: object, currentRowData: object) => boolean; + defaultSortDescriptor?: SortDescriptor; + selectionMode?: 'multiple' | 'single'; + selectionBehavior?: 'replace' | 'toggle'; + onRowAction?: (key: TableRowKey, row: TableRowData) => void; + slotEmpty?: React.ReactNode; + // collection: TableCollection; + // children: React.ReactNode; +}; + +type StyleProps = { + hideHeader?: boolean; + withGradientCardRows?: boolean; + withFocusStickyRows?: boolean; + withOuterBorder?: boolean; + withInnerBorders?: boolean; + withScrollSnapColumns?: boolean; + withScrollSnapRows?: boolean; + className?: string; + style?: React.CSSProperties; +}; + +export type TableConfig = TableItem[]; + +export const Table = ({ + label = '', + columns, + data = [], + getRowKey, + getRowAttributes, + onRowAction, + defaultSortDescriptor, + selectionMode = 'single', + selectionBehavior = 'toggle', + slotEmpty, + // shouldRowRender, + + // collection, + // children, + hideHeader = false, + withGradientCardRows = false, + withFocusStickyRows = false, + withOuterBorder = false, + withInnerBorders = false, + withScrollSnapColumns = false, + withScrollSnapRows = false, + className, + style, +}: ElementProps & StyleProps) => { + const [selectedKeys, setSelectedKeys] = useState(new Set()); + + const currentBreakpoints = useBreakpoints(); + const shownColumns = columns.filter( + ({ hideOnBreakpoint }) => !hideOnBreakpoint || !currentBreakpoints[hideOnBreakpoint as string] + ); + + const collator = useCollator(); + + const sortFn = ( + a: TableRowData, + b: TableRowData, + sortColumn?: Key, + sortDirection?: SortDirection + ) => { + if (!sortColumn) return 0; + + const column = columns.find((column) => column.columnKey === sortColumn); + const first = column?.getCellValue(a); + const second = column?.getCellValue(b); + + return ( + // Compare the items by the sorted column + (isNaN(first as number) + ? // String + collator.compare(first as string, second as string) + : // Number + Math.sign( + (parseInt(first as string) || (first as number)) - + (parseInt(second as string) || (second as number)) + )) * + // Flip the direction if descending order is specified. + (sortDirection === 'descending' ? -1 : 1) + ); + }; + + const list = useAsyncList({ + getKey: getRowKey, + load: async ({ sortDescriptor }) => ({ + items: sortDescriptor?.column + ? data.sort((a, b) => sortFn(a, b, sortDescriptor?.column, sortDescriptor?.direction)) + : data, + }), + + initialSortDescriptor: defaultSortDescriptor, + + sort: async ({ items, sortDescriptor }) => ({ + items: items.sort((a, b) => sortFn(a, b, sortDescriptor?.column, sortDescriptor?.direction)), + }), + }); + + useEffect(() => list.reload(), [data]); + + const isEmpty = data.length === 0; + + return ( + + {!isEmpty ? ( + onRowAction(key, data.find((row) => getRowKey(row) === key)!)) + } + // shouldRowRender={shouldRowRender} + hideHeader={hideHeader} + withGradientCardRows={withGradientCardRows} + withFocusStickyRows={withFocusStickyRows} + withOuterBorder={withOuterBorder} + withInnerBorders={withInnerBorders} + withScrollSnapColumns={withScrollSnapColumns} + withScrollSnapRows={withScrollSnapRows} + > + + {(column) => ( + + {column.label} + {column.tag && {column.tag}} + + )} + + + + {(item) => ( + + {(columnKey) => ( + + {columns.find((column) => column.columnKey === columnKey)?.renderCell?.(item)} + + )} + + )} + + + ) : ( + {slotEmpty} + )} + + ); +}; + +const TableRoot = (props: { + 'aria-label'?: string; + sortDescriptor?: SortDescriptor; + onSortChange?: (descriptor: SortDescriptor) => void; + selectionMode: 'multiple' | 'single'; + selectionBehavior: 'replace' | 'toggle'; + selectedKeys: Set; + setSelectedKeys: (selectedKeys: Set) => void; + getRowAttributes?: ( + rowData: TableRowData, + rowIndex?: number + ) => Record>; + onRowAction?: (key: TableRowKey) => void; + // shouldRowRender?: (prevRowData: object, currentRowData: object) => boolean; + children: CollectionChildren; + + hideHeader?: boolean; + withGradientCardRows?: boolean; + withFocusStickyRows?: boolean; + withOuterBorder?: boolean; + withInnerBorders?: boolean; + withScrollSnapColumns?: boolean; + withScrollSnapRows?: boolean; +}) => { + const { selectionMode, selectionBehavior } = props; + + const state = useTableState({ + ...props, + showSelectionCheckboxes: selectionMode === 'multiple' && selectionBehavior !== 'replace', + }); + + const ref = React.useRef(null); + const { collection } = state; + const { gridProps } = useTable( + { + 'aria-label': props['aria-label'], + onRowAction: props.onRowAction as (key: Key) => void, + }, + state, + ref + ); + + return ( + + + + + {/* {Array.from(collection.getChildren!(collection.body.key), (row) => */} + {[...collection.body.childNodes].map((row) => + (row.value as CustomRowConfig)?.slotCustomRow ? ( + (row.value as CustomRowConfig).slotCustomRow({ + item: row, + state, + ...props.getRowAttributes?.(row.value!), + withGradientCardRows: props.withGradientCardRows, + withFocusStickyRows: props.withFocusStickyRows, + withScrollSnapRows: props.withScrollSnapRows, + children: null, + }) + ) : ( + + {/* {Array.from(collection.getChildren!(row.key), (cell) => */} + {[...row.childNodes].map( + (cell) => ( + // cell.props.isSelectionCell ? ( + // + // ) : ( + ).column?.value as ColumnDef) + ?.isActionable + } + /> + ) + // ) + )} + + ) + )} + + + ); +}; + +const TableHeadRowGroup = ({ + children, + hidden, + withGradientCardRows, + withInnerBorders, +}: { children: React.ReactNode } & { + hidden?: boolean; + withGradientCardRows?: boolean; + withInnerBorders?: boolean; +}) => { + const { rowGroupProps } = useTableRowGroup(); + + return ( + + ); +}; + +const TableBodyRowGroup = ({ + children, + withGradientCardRows, + withInnerBorders, +}: { children: React.ReactNode } & StyleProps) => { + const { rowGroupProps } = useTableRowGroup(); + + return ( + + {children} + + ); +}; + +const TableHeaderRow = ({ + item, + state, + children, + withScrollSnapRows, +}: { + item: TableCollection['headerRows'][number]; + state: TableState; + children: React.ReactNode; + withScrollSnapRows?: boolean; +}) => { + const ref = React.useRef(null); + const { rowProps } = useTableHeaderRow({ node: item }, state, ref); + + return ( + + {children} + + ); +}; + +const TableColumnHeader = ({ + column, + state, + withScrollSnapColumns, +}: { + column: Node; + state: TableState; + withScrollSnapColumns?: boolean; +}) => { + const ref = React.useRef(null); + const { columnHeaderProps } = useTableColumnHeader({ node: column }, state, ref); + const { isFocusVisible, focusProps } = useFocusRing(); + + return ( + + + {column.rendered} + {column.props.allowsSorting && ( + + )} + + + ); +}; + +export const TableRow = ({ + item, + children, + state, + // shouldRowRender, + withGradientCardRows, + withFocusStickyRows, + withScrollSnapRows, + ...attrs +}: { + item: TableCollection['rows'][number]; + children: React.ReactNode; + state: TableState; + // shouldRowRender?: (prevRowData: TableRowData, currentRowData: TableRowData) => boolean; + withGradientCardRows?: boolean; + withFocusStickyRows?: boolean; + withScrollSnapRows?: boolean; +}) => { + const ref = React.useRef(null); + const selectionManager = state.selectionManager; + const isSelected = selectionManager.isSelected(item.key); + const isClickable = selectionManager.selectionBehavior === 'toggle'; + + const { rowProps, isPressed } = useTableRow( + { + node: item, + }, + state, + ref + ); + + const { isFocusVisible, focusProps } = useFocusRing(); + + return ( + + {children} + + ); +}; + +// const TableRowMemo = React.memo( +// TableRow, +// (a, b) => !!b.shouldRowRender?.(a.item.value, b.item.value) +// ); + +const TableCell = ({ + cell, + state, + isActionable, +}: { + cell: Node; + state: TableState; + isActionable?: boolean; +}) => { + const ref = React.useRef(null); + const { gridCellProps } = useTableCell({ node: cell }, state, ref); + const { isFocusVisible, focusProps } = useFocusRing(); + + return ( + e.stopPropagation(), + onPointerDown: (e: MouseEvent) => e.stopPropagation(), + ...gridCellProps, + } + : gridCellProps, + focusProps + )} + // data-focused={isFocusVisible || undefined} + ref={ref} + > + {/* */} + {cell.rendered} + {/* */} + + ); +}; + +// const TableSelectAllCell = ({ column, state }) => { +// const ref = React.useRef(null); +// const isSingleSelectionMode = state.selectionManager.selectionMode === 'single'; +// const { columnHeaderProps } = useTableColumnHeader({ node: column }, state, ref); +// const { checkboxProps } = useTableSelectAllCheckbox(state); + +// return ( +// +// {state.selectionManager.selectionMode === 'single' ? ( +// {inputProps['aria-label']} +// ) : ( +// +// )} +// +// ); +// }; + +// const TableCheckboxCell = ({ cell, state }: { cell; state }) => { +// const ref = React.useRef(null); +// const { gridCellProps } = useTableCell({ node: cell }, state, ref); +// const { checkboxProps } = useTableSelectionCheckbox({ key: cell.parentKey }, state); + +// return ( +// +// +// +// ); +// }; + +const Styled: Record = {}; + +Styled.TableWrapper = styled.div<{ + isEmpty: boolean; + withGradientCardRows?: boolean; + withOuterBorder: boolean; +}>` + // Params + --tableHeader-textColor: var(--color-text-0, inherit); + --tableHeader-backgroundColor: inherit; + --table-header-height: 2rem; + + --tableRow-hover-backgroundColor: var(--color-layer-3); + --tableRow-backgroundColor: ; + + --table-cell-align: start; // start | center | end + --table-firstColumn-cell-align: start; // start | center | end | var(--table-cell-align) + --table-lastColumn-cell-align: end; // start | center | end | var(--table-cell-align) + --tableCell-padding: 0 1rem; + + // Rules + + flex: 1; + + ${layoutMixins.contentSectionAttached} + scroll-snap-align: none; + + ${layoutMixins.stack} + + overflow: clip; + + ${({ isEmpty, withGradientCardRows, withOuterBorder }) => + withOuterBorder && + (!withGradientCardRows || isEmpty) && + css` + ${layoutMixins.withOuterBorderClipped} + `} +`; + +Styled.Empty = styled.div<{ withOuterBorder: boolean }>` + ${layoutMixins.column} + height: 100%; + + justify-items: center; + align-content: center; + padding: 2rem; + gap: 0.75em; + + color: var(--color-text-0); + font: var(--font-base-book); +`; + +Styled.Table = styled.table<{ + hideHeader?: boolean; + withGradientCardRows: boolean; + withOuterBorder: boolean; + withInnerBorders: boolean; + withSolidHeader: boolean; +}>` + align-self: start; + + ${layoutMixins.stickyArea1} + --stickyArea1-background: var(--color-layer-2); + --stickyArea1-topHeight: var(--table-header-height); + ${({ hideHeader }) => + hideHeader && + css` + --stickyArea1-topHeight: 0px; + `} + + border-collapse: separate; + border-spacing: 0; + + /* [data-selected] {} */ + + ${({ withInnerBorders, hideHeader }) => + withInnerBorders && + css` + border-spacing: 0 var(--border-width); + --stickyArea1-topGap: var(--border-width); + + ${hideHeader && + css` + --stickyArea1-topGap: 0px; + `} + + // Compensate for outer border (hidden and omitted from scroll with overflow: clip; on ) + margin: calc(-1 * var(--border-width)) 0; + `} + + ${({ withGradientCardRows }) => + withGradientCardRows && + css` + border-spacing: 0 0.75rem; + + // Use negative margin and 0 padding on 'th' element, so that border-spacing + // doesn't affect the header row's height + margin: -0.75rem clamp(0rem, 1rem - var(--contentContainerPage-paddingLeft, 0rem), 1rem) 0; + + th { + padding: 0; + } + `} + + @media ${breakpoints.tablet} { + min-height: 6.25rem; + } +`; + +Styled.Tr = styled.tr<{ + isClickable?: boolean; + withFocusStickyRows?: boolean; + withScrollSnapRows: boolean; +}>` + /* Computed */ + --tableRow-currentBackgroundColor: var(--tableRow-backgroundColor); + + /* Rules */ + background-color: var(--tableRow-currentBackgroundColor); + + ${({ isClickable }) => + isClickable && + css` + cursor: pointer; + + &:hover, + &:focus, + &:focus-within { + --tableRow-currentBackgroundColor: var(--tableRow-hover-backgroundColor); + filter: brightness(1.1); + } + `}; + + ${({ withFocusStickyRows }) => + withFocusStickyRows && + css` + &:focus, + &:focus-within { + ${layoutMixins.sticky} + z-index: 1; + } + `} + + ${({ withScrollSnapRows }) => + withScrollSnapRows && + css` + ${layoutMixins.scrollSnapItem} + `} +`; + +Styled.Th = styled.th<{ withScrollSnapColumns: boolean }>` + // Computed + --table-cell-currentAlign: var(--table-cell-align); + + &:first-of-type { + --table-cell-currentAlign: var(--table-firstColumn-cell-align, var(--table-cell-align)); + } + &:last-of-type { + --table-cell-currentAlign: var(--table-lastColumn-cell-align, var(--table-cell-align)); + } + + // Rules + ${({ withScrollSnapColumns }) => + withScrollSnapColumns && + css` + ${layoutMixins.scrollSnapItem} + `} + + white-space: nowrap; + text-align: var(--table-cell-currentAlign); +`; + +Styled.Td = styled.td` + // Computed + --table-cell-currentAlign: var(--table-cell-align); + + &:first-of-type { + --table-cell-currentAlign: var(--table-firstColumn-cell-align, var(--table-cell-align)); + } + &:last-of-type { + --table-cell-currentAlign: var(--table-lastColumn-cell-align, var(--table-cell-align)); + } + + // Rules + padding: var(--tableCell-padding); + + text-align: var(--table-cell-currentAlign); + + > * { + vertical-align: middle; + } +`; + +Styled.SortArrow = styled.span<{ sortDirection: 'ascending' | 'descending' }>` + float: right; + margin-left: auto; + + display: inline-flex; + transition: transform 0.3s var(--ease-out-expo), font-size 0.3s var(--ease-out-expo); + + font-size: 0.375em; + + ${Styled.Th}[aria-sort="none"] & { + visibility: hidden; + } + + ${Styled.Th}[aria-sort="ascending"] & { + transform: scaleY(-1); + } +`; + +Styled.Thead = styled.thead` + ${layoutMixins.stickyHeader} + scroll-snap-align: none; + + > * { + height: var(--stickyArea-topHeight); + } + + color: var(--tableHeader-textColor); + background-color: var(--tableHeader-backgroundColor); + + @media ${breakpoints.notTablet} { + ${({ withInnerBorders, withGradientCardRows }) => + withInnerBorders && + !withGradientCardRows && + css` + ${layoutMixins.withInnerHorizontalBorders} + `} + } +`; + +Styled.Tbody = styled.tbody` + ${layoutMixins.stickyArea2} + + // If
height is fixed with not enough rows to overflow, vertically center the rows + &:before, + &:after { + content: ''; + display: table-row; + } + + ${({ withInnerBorders, withGradientCardRows }) => + withInnerBorders && + !withGradientCardRows && + css` + ${layoutMixins.withInnerHorizontalBorders} + + --stickyArea2-paddingTop: var(--border-width); + --stickyArea2-paddingBottom: var(--border-width); + --stickyArea2-paddingLeft: var(--border-width); + --stickyArea2-paddingRight: var(--border-width); + `} + + ${({ withGradientCardRows }) => + withGradientCardRows && + css` + --table-row-default-gradient: linear-gradient( + 342.62deg, + var(--color-gradient-base-0) -9.23%, + var(--color-gradient-base-1) 110.36% + ); + + --table-row-gradient-to-color: transparent; + --tableCell-borderRadius: ; + + &:before, + &:after { + content: none; + } + + tr { + background: linear-gradient( + 270deg, + var(--table-row-gradient-to-color) -32.39%, + transparent 100% + ), + var(--table-row-default-gradient); + + @supports (background: -webkit-named-image(i)) { + background: var(--table-row-gradient-to-color); + } + + td:first-child { + --tableCell-borderRadius: 1rem 0 0 1rem; + } + + td:last-child { + --tableCell-borderRadius: 0 1rem 1rem 0; + } + + td { + height: 4.25rem; + border-radius: var(--tableCell-borderRadius); + } + } + `} +`; + +Styled.Row = styled.div` + ${layoutMixins.inlineRow} + padding: var(--tableCell-padding); +`; diff --git a/src/components/Table/MarketTableCell.tsx b/src/components/Table/MarketTableCell.tsx new file mode 100644 index 0000000..e024670 --- /dev/null +++ b/src/components/Table/MarketTableCell.tsx @@ -0,0 +1,50 @@ +import styled, { type AnyStyledComponent, css } from 'styled-components'; + +import type { Asset } from '@/constants/abacus'; +import { breakpoints } from '@/styles'; + +import { AssetIcon } from '@/components/AssetIcon'; +import { Icon, IconName } from '@/components/Icon'; +import { TableCell } from '@/components/Table'; + +export const MarketTableCell = ({ + asset, + marketId, + showFavorite, + className, +}: { + asset?: Asset; + marketId: string; + showFavorite?: boolean; + className?: string; +}) => ( + + {showFavorite && } + + + } + > + {asset?.name} + {marketId} + +); + +const Styled: Record = {}; + +Styled.AssetIcon = styled(AssetIcon)` + font-size: 1.25rem; + + @media ${breakpoints.tablet} { + font-size: 2.25rem; + } +`; + +Styled.Asset = styled.span` + @media ${breakpoints.tablet} { + color: var(--color-text-2); + } +`; diff --git a/src/components/Table/TableCell.tsx b/src/components/Table/TableCell.tsx new file mode 100644 index 0000000..7aa8596 --- /dev/null +++ b/src/components/Table/TableCell.tsx @@ -0,0 +1,34 @@ +import styled, { type AnyStyledComponent } from 'styled-components'; + +import { layoutMixins } from '@/styles/layoutMixins'; +import { tableMixins } from '@/styles/tableMixins'; + +export const TableCell = ({ + className, + children, + slotLeft, + slotRight, + stacked, +}: { + className?: string; + children?: React.ReactNode; + slotLeft?: React.ReactNode; + slotRight?: React.ReactNode; + stacked?: boolean; +}) => ( + + {slotLeft} + {stacked ? {children} : children} + {slotRight} + +); + +const Styled: Record = {}; + +Styled.CellContent = styled.div` + ${tableMixins.cellContent} +`; + +Styled.Column = styled.div` + ${tableMixins.cellContentColumn} +`; diff --git a/src/components/Table/TableColumnHeader.tsx b/src/components/Table/TableColumnHeader.tsx new file mode 100644 index 0000000..152cfa1 --- /dev/null +++ b/src/components/Table/TableColumnHeader.tsx @@ -0,0 +1,17 @@ +import styled, { type AnyStyledComponent } from 'styled-components'; + +import { tableMixins } from '@/styles/tableMixins'; + +export const TableColumnHeader = ({ + className, + children, +}: { + className?: string; + children?: React.ReactNode; +}) => {children}; + +const Styled: Record = {}; + +Styled.HeaderCellContent = styled.div` + ${tableMixins.headerCellContent} +`; diff --git a/src/components/Tabs.stories.tsx b/src/components/Tabs.stories.tsx new file mode 100644 index 0000000..6adb027 --- /dev/null +++ b/src/components/Tabs.stories.tsx @@ -0,0 +1,68 @@ +import type { Story } from '@ladle/react'; +import styled, { AnyStyledComponent } from 'styled-components'; + +import { layoutMixins } from '@/styles/layoutMixins'; + +import { Tabs } from '@/components/Tabs'; + +import { StoryWrapper } from '.ladle/components'; + +enum TabItem { + Item1 = 'Item1', + Item2 = 'Item2', + Item3 = 'Item3', +} + +const TabItems = [ + { + value: TabItem.Item1, + label: 'Item 1', + content:
Item 1 Content
, + }, + { + value: TabItem.Item2, + label: 'Item 2', + content:
Item 2 Content
, + }, + { + value: TabItem.Item3, + label: 'Item 3', + content:
Item 3 Content
, + }, +]; + +export const TabsStory: Story> = (args) => { + return ( + + + + + + ); +}; + +TabsStory.args = { + fullWidthTabs: false, +}; + +TabsStory.argTypes = { + defaultValue: { + options: Object.values(TabItem), + control: { type: 'select' }, + defaultValue: TabItem.Item1, + }, +}; + +const Styled: Record = {}; + +Styled.Container = styled.section` + background: var(--color-layer-3); + width: 400px; + + ${layoutMixins.container} + + padding: 10px; + display: flex; + align-items: center; + gap: 8px; +`; diff --git a/src/components/Tabs.tsx b/src/components/Tabs.tsx new file mode 100644 index 0000000..bb6360e --- /dev/null +++ b/src/components/Tabs.tsx @@ -0,0 +1,329 @@ +import { type ReactNode } from 'react'; +import styled, { type AnyStyledComponent, css, keyframes } from 'styled-components'; +import { Content, List, Root, Trigger } from '@radix-ui/react-tabs'; + +import { breakpoints } from '@/styles'; +import { layoutMixins } from '@/styles/layoutMixins'; + +import { type MenuItem } from '@/constants/menus'; + +import { DropdownSelectMenu } from '@/components/DropdownSelectMenu'; +import { Tag } from '@/components/Tag'; +import { Toolbar } from '@/components/Toolbar'; + +export type TabItem = { + value: TabItemsValue; + label: React.ReactNode; + forceMount?: boolean; + tag?: React.ReactNode; + slotRight?: React.ReactNode; + slotToolbar?: React.ReactNode; + content?: React.ReactNode; + subitems?: TabItem[]; + customTrigger?: ReactNode; +}; + +type ElementProps = { + defaultValue?: TabItemsValue; + value?: TabItemsValue; + items: TabItem[]; + slotToolbar?: ReactNode; + sharedContent?: ReactNode; + onValueChange?: (value: TabItemsValue) => void; + onWheel?: (event: WheelEvent) => void; +}; + +type StyleProps = { + fullWidthTabs?: boolean; + side?: 'top' | 'bottom'; + withBorders?: boolean; + withTransitions?: boolean; + className?: string; +}; + +export const Tabs = ({ + defaultValue, + value, + items, + slotToolbar, + sharedContent, + onValueChange, + onWheel, + fullWidthTabs, + side = 'top', + withBorders = true, + withTransitions = true, + className, +}: ElementProps & StyleProps) => { + const currentItem = items.find((item) => item.value === value); + + const triggers = ( + <> + + {items.map((item) => + !item.subitems ? ( + item.customTrigger ?? ( + + {item.label} + {item.tag && {item.tag}} + {item.slotRight} + + ) + ) : ( + []} + value={value} + onValueChange={onValueChange} + align="end" + $isActive={item.subitems.some((subitem) => subitem.value === value)} + slotTrigger={} + > + {item.label} + + ) + )} + + + {(currentItem?.slotToolbar || slotToolbar) && ( + {currentItem?.slotToolbar || slotToolbar} + )} + + ); + + return ( + + {triggers} + + {sharedContent ? ( + sharedContent + ) : ( + + {items.map(({ value, content, forceMount }) => ( + + {content} + + ))} + + )} + + ); +}; + +const Styled: Record = {}; + +const tabTriggerStyle = css` + ${layoutMixins.row} + justify-content: center; + gap: 0.5ch; + + align-self: stretch; + padding: 0 1.5rem; + + font: var(--trigger-font, var(--font-base-book)); + color: var(--trigger-textColor); + background-color: var(--trigger-backgroundColor); + + &[data-state='active'] { + color: var(--trigger-active-textColor); + background-color: var(--trigger-active-backgroundColor); + } +`; + +Styled.Root = styled(Root)<{ $side: 'top' | 'bottom'; $withInnerBorder?: boolean }>` + /* Overrides */ + --trigger-backgroundColor: var(--color-layer-2); + --trigger-textColor: var(--color-text-0); + + --trigger-active-backgroundColor: var(--color-layer-1); + --trigger-active-textColor: var(--color-text-2); + + /* Variants */ + --tabs-currentHeight: var(--tabs-height); + + @media ${breakpoints.tablet} { + --tabs-currentHeight: var(--tabs-height-mobile); + } + + /* Rules */ + ${layoutMixins.scrollArea} + overscroll-behavior: contain; + + ${layoutMixins.stickyArea0} + --stickyArea0-background: var(--color-layer-2); + --stickyArea0-topGap: var(--border-width); + + ${layoutMixins.contentContainer} + + ${({ $side }) => + ({ + top: css` + --stickyArea0-topHeight: var(--tabs-currentHeight); + ${layoutMixins.expandingColumnWithHeader} + `, + bottom: css` + --stickyArea0-bottomHeight: var(--tabs-currentHeight); + ${layoutMixins.expandingColumnWithFooter} + `, + }[$side])} + + ${({ $withInnerBorder }) => + $withInnerBorder && + css` + ${layoutMixins.withInnerHorizontalBorders} + `} + + @media ${breakpoints.tablet} { + overscroll-behavior: contain auto; + } +`; + +Styled.Header = styled.header<{ $side: 'top' | 'bottom' }>` + ${layoutMixins.contentSectionDetachedScrollable} + + ${({ $side }) => + ({ + top: css` + ${layoutMixins.stickyHeader} + `, + bottom: css` + ${layoutMixins.stickyFooter} + grid-row: 2; + `, + }[$side])} + + ${layoutMixins.row} + justify-content: space-between; +`; + +Styled.List = styled(List)<{ $fullWidthTabs?: boolean; $withBorders?: boolean }>` + align-self: stretch; + + ${({ $withBorders }) => + $withBorders && + css` + ${layoutMixins.withOuterAndInnerBorders} + `} + + ${({ $fullWidthTabs }) => + $fullWidthTabs + ? css` + flex: 1; + ${layoutMixins.gridEqualColumns} + ` + : css` + ${layoutMixins.row} + `} +`; + +Styled.Trigger = styled(Trigger)<{ $withBorders?: boolean }>` + ${({ $withBorders }) => + $withBorders && + css` + ${layoutMixins.withOuterBorder} + `} + + ${tabTriggerStyle} +`; + +Styled.Stack = styled.div` + ${layoutMixins.stack} + ${layoutMixins.perspectiveArea} + + box-shadow: none; +`; + +Styled.Content = styled(Content)<{ $hide?: boolean; $withTransitions: boolean }>` + ${layoutMixins.flexColumn} + outline: none; + box-shadow: none; + + &[data-state='inactive'] { + pointer-events: none; + } + + ${({ $hide }) => + $hide && + css` + display: none; + `} + + @media (prefers-reduced-motion: no-preference) { + ${({ $withTransitions }) => + $withTransitions && + css` + &[data-state='active'] { + animation: ${keyframes` + from { + translate: 0 -0.25rem -1.5rem; + opacity: 0; + /* filter: blur(3px); */ + } + `} 0.2s var(--ease-out-expo); + } + + &[data-state='inactive'] { + min-height: 0; + + animation: ${keyframes` + to { + translate: 0 -0.25rem -1.5rem; + opacity: 0; + /* filter: blur(3px); */ + } + `} 0.2s var(--ease-out-expo); + } + `} + } +`; + +Styled.DropdownTabTrigger = styled(Trigger)` + ${tabTriggerStyle} + gap: 1ch; + + height: 100%; + width: 100%; +`; + +Styled.DropdownSelectMenu = styled(DropdownSelectMenu)<{ $isActive?: boolean }>` + --trigger-radius: 0; + + ${({ $isActive }) => + $isActive && + css` + --trigger-textColor: var(--trigger-active-textColor); + --trigger-backgroundColor: var(--trigger-active-backgroundColor); + `} +`; + +export const MobileTabs = styled(Tabs)` + --trigger-backgroundColor: transparent; + --trigger-active-backgroundColor: transparent; + --tableHeader-backgroundColor: var(--color-layer-2); + --trigger-font: var(--font-extra-book); + + padding-bottom: 1rem; + gap: var(--border-width); + + > header { + padding: 0 1rem; + + button { + padding: 0 0.5rem; + } + } +`; diff --git a/src/components/Tag.stories.tsx b/src/components/Tag.stories.tsx new file mode 100644 index 0000000..b83d740 --- /dev/null +++ b/src/components/Tag.stories.tsx @@ -0,0 +1,17 @@ +import type { Story } from '@ladle/react'; + +import { Tag } from '@/components/Tag'; + +import { StoryWrapper } from '.ladle/components'; + +export const TagStory: Story> = (args) => { + return ( + + + + ); +}; + +TagStory.args = { + children: 'USDC', +}; diff --git a/src/components/Tag.tsx b/src/components/Tag.tsx new file mode 100644 index 0000000..28ad37f --- /dev/null +++ b/src/components/Tag.tsx @@ -0,0 +1,80 @@ +import styled, { css } from 'styled-components'; + +export enum TagSize { + Small, + Medium, +} + +export enum TagType { + Asset, + Side, + Number, +} + +export enum TagSign { + Positive, + Negative, + Neutral, +} + +type StyleProps = { + size?: TagSize; + type?: TagType; + sign?: TagSign; + isHighlighted?: boolean; +}; + +export const Tag = styled.span` + font-family: var(--fontFamily-base); + font-weight: var(--fontWeight-book); + display: inline-flex; + + background-color: var(--color-layer-6); + border-radius: 0.25rem; + + color: var(--color-text-2); + letter-spacing: 0.04em; + line-height: 1.3; + + user-select: none; + + ${({ type, size }) => + ({ + [TagSize.Small]: css` + padding: ${type === TagType.Number + ? '0.125rem 0.344rem' + : '0.125rem 0.219rem 0.125rem 0.25rem'}; + + font: var(--font-tiny-book); + `, + [TagSize.Medium]: css` + padding: ${type === TagType.Number + ? '0.156rem 0.438rem' + : '0.156rem 0.219rem 0.156rem 0.25rem'}; + + font: var(--font-mini-book); + `, + }[size || TagSize.Small])} + + ${({ sign }) => + sign !== undefined && + { + [TagSign.Positive]: css` + color: var(--color-positive); + background-color: var(--color-gradient-positive); + `, + [TagSign.Negative]: css` + color: var(--color-negative); + background-color: var(--color-gradient-negative); + `, + [TagSign.Neutral]: css` + background-color: var(--color-layer-3); + `, + }[sign]} + + ${({ isHighlighted }) => + isHighlighted && + css` + background-color: var(--color-accent); + `} +`; diff --git a/src/components/TimeoutButton.tsx b/src/components/TimeoutButton.tsx new file mode 100644 index 0000000..df0a7f7 --- /dev/null +++ b/src/components/TimeoutButton.tsx @@ -0,0 +1,50 @@ +import { type ReactNode, useState } from 'react'; + +import { ButtonAction, ButtonState } from '@/constants/buttons'; +import { STRING_KEYS } from '@/constants/localization'; +import { useNow, useStringGetter } from '@/hooks'; + +import { Button, type ButtonStateConfig, type ButtonProps } from '@/components/Button'; + +type ElementProps = { + timeoutInSeconds: number; +} & ButtonProps; + +export type TimeoutButtonProps = ElementProps; + +export const TimeoutButton = ({ + children, + timeoutInSeconds, + ...otherProps +}: TimeoutButtonProps) => { + const [timeoutDeadline] = useState(Date.now() + timeoutInSeconds * 1000); + const now = useNow(); + const stringGetter = useStringGetter(); + + const secondsLeft = Math.max(0, (timeoutDeadline - now) / 1000); + + return ( + + ); +}; diff --git a/src/components/TimoutButton.stories.tsx b/src/components/TimoutButton.stories.tsx new file mode 100644 index 0000000..a8dbbc8 --- /dev/null +++ b/src/components/TimoutButton.stories.tsx @@ -0,0 +1,21 @@ +import type { Story } from '@ladle/react'; + +import { StoryWrapper } from '.ladle/components'; +import { TimeoutButton, type TimeoutButtonProps } from './TimeoutButton'; + +export const TimeoutButtonStory: Story = (args) => { + return ( + + alert('Timeout button clicked!')} + > + Continue + + + ); +}; + +TimeoutButtonStory.args = { + timeoutInSeconds: 5, +}; diff --git a/src/components/Toast.tsx b/src/components/Toast.tsx new file mode 100644 index 0000000..e1ae672 --- /dev/null +++ b/src/components/Toast.tsx @@ -0,0 +1,266 @@ +import React, { useEffect, useRef, useState } from 'react'; + +import { Root, Title, Description, Action, Close } from '@radix-ui/react-toast'; + +import { ButtonShape, ButtonSize } from '@/constants/buttons'; + +import { IconButton } from './IconButton'; +import { CloseIcon } from '@/icons'; + +import styled, { keyframes } from 'styled-components'; +import { popoverMixins } from '@/styles/popoverMixins'; +import { layoutMixins } from '@/styles/layoutMixins'; + +type ElementProps = { + isOpen?: boolean; + setIsOpen?: (isOpen: boolean, isClosedFromTimeout?: boolean) => void; + slotIcon?: React.ReactNode; + slotTitle?: React.ReactNode; + slotDescription?: React.ReactNode; + slotAction?: React.ReactNode; + actionDescription?: string; + actionAltText?: string; + sensitivity?: 'foreground' | 'background'; + duration?: number; + lastUpdated?: number; +}; + +type StyleProps = {}; + +export const Toast = ({ + isOpen = true, + setIsOpen, + slotIcon, + slotTitle, + slotDescription, + slotAction, + actionDescription = '', + actionAltText = actionDescription, + sensitivity = 'background', + duration = Infinity, + lastUpdated, +}: ElementProps & StyleProps) => { + // Timeout + const timeout = useRef(); + const [isPaused, setIsPaused] = useState(false); + + useEffect(() => { + // Restart toast timer when `lastUpdated` timestamp changes or toast is paused + resumed + if (timeout.current) clearTimeout(timeout.current); + + if (isOpen && !isPaused && duration !== Infinity) + timeout.current = globalThis.setTimeout(() => { + setIsOpen?.(false, true); + }, duration) as unknown as number; + }, [isOpen, isPaused, duration, lastUpdated]); + + return ( + <$Root + type={sensitivity} + duration={Infinity} + open={isOpen} + onOpenChange={setIsOpen} + onPause={() => setIsPaused(true)} + onResume={() => setIsPaused(false)} + > +
+ <$Container> + <$Header> + {slotIcon && <$Icon>{slotIcon}} + + + <$CloseButton + iconComponent={CloseIcon} + shape={ButtonShape.Square} + size={ButtonSize.XSmall} + /> + + + <$Title>{slotTitle} + + + <$Description>{slotDescription} + + <$Action asChild altText={actionAltText}> + {slotAction} + + +
+ + ); +}; + +const $Root = styled(Root)` + // Params + --toast-transition-duration: 0.5s; + + // Computed + --x: var(--radix-toast-swipe-move-x, 0px); + --y: var(--radix-toast-swipe-move-y, 0px); + + // Rules + transition: var(--toast-transition-duration) var(--ease-out-expo); + + margin-left: calc(var(--border-width) + 0.6rem); // border + shadow + margin-right: var(--border-width); // border + + display: grid; // height transition + grid-template-rows: 1fr; // height transition + /* grid-template-rows: 1fr var(--toasts-gap); // height transition */ + + translate: var(--x) var(--y); + will-change: translate, margin-top; + + margin-bottom: var(--toasts-gap); + + &[data-swipe-direction='right'] { + &[data-state='open'] { + align-items: end; + transform-origin: left bottom; + + animation: + ${keyframes` + from { + /* scale: 0; */ + grid-template-rows: 0fr; // height transition + /* grid-template-rows: 0fr 0fr; // height transition */ + + margin-top: calc(-1 * var(--toasts-gap)); + } + `} var(--toast-transition-duration) var(--ease-out-expo), + ${keyframes` + from { + opacity: 0; + /* filter: blur(1px); */ + } + `} var(--toast-transition-duration) var(--ease-out-expo), + ${keyframes` + 33% { + /* scale: 1.05; */ + /* filter: brightness(120%); */ + filter: drop-shadow(0 0 var(--color-text-1)); + } + `} calc(var(--toast-transition-duration) * 3) 0.1s; + } + + &[data-state='closed'] { + align-items: start; + + animation: ${keyframes``} var(--toast-transition-duration) var(--ease-out-expo); // delay Radix's DOM removal for [data-state='closed'] transition + } + } + + &:focus { + outline: none; + } + + &:active[data-swipe-direction='right'] { + cursor: e-resize; + } + &:active[data-swipe-direction='up'] { + cursor: n-resize; + } + + &[data-swipe='move'] { + transition-property: opacity; + opacity: 0.98; + + cursor: grabbing; + * { + cursor: inherit; + } + } + + &[data-state='closed'], + &[data-swipe='end'] { + z-index: -1; + grid-template-rows: 0fr; // height transition + margin-top: 0; + margin-bottom: 0; + filter: blur(3px); + pointer-events: none; + + &[data-swipe-direction='right'] { + --x: calc(100% + 2rem); + } + } + + > div { + min-height: 0; // height transition + transition: scale var(--toast-transition-duration) var(--ease-out-expo); + } + + &:is(:active:not(:not(:focus):focus-within), [data-swipe='move']) > div { + scale: 0.95; + transition-duration: 5s; + } +`; + +const $Container = styled.div` + // Params + --toast-icon-size: 1.75em; + + // Rules + ${popoverMixins.popover} + padding: 1rem; + box-shadow: + 0 0 0 var(--border-width) var(--color-border), // border + 0 0 0.5rem 0.1rem var(--color-layer-2); // shadow + + ${$Root}:focus:not([data-swipe='end']) & { + outline: var(--color-accent) 1px solid; + } + + > * { + transition: opacity 0.2s; + } + ${$Root}[data-swipe='move'] & > * { + opacity: 0.5; + } +`; + +const $Header = styled.header` + display: block; +`; + +const $Icon = styled.div` + ${layoutMixins.row} + + float: left; + + width: 1em; + height: 1em; + + margin-right: 0.4em; + + line-height: 1; +`; + +const $CloseButton = styled(IconButton)` + --button-textColor: var(--color-text-0); + --button-border: none; + --button-icon-size: 0.85em; + + float: right; + margin: -0.42rem -0.42rem -0.42rem 0.42rem; +`; + +const $Title = styled(Title)` + flex: 1; + + font: var(--font-base-medium); + color: var(--color-text-2); + + overflow: hidden; + text-overflow: ellipsis; +`; + +const $Description = styled(Description)` + margin-top: 0.5rem; + color: var(--color-text-0); + font: var(--font-small-book); +`; + +const $Action = styled(Action)` + margin-top: 0.5rem; +`; diff --git a/src/components/ToastArea.tsx b/src/components/ToastArea.tsx new file mode 100644 index 0000000..eee1551 --- /dev/null +++ b/src/components/ToastArea.tsx @@ -0,0 +1,54 @@ +import { Provider, Viewport } from '@radix-ui/react-toast'; + +import styled from 'styled-components'; +import { layoutMixins } from '@/styles/layoutMixins'; + +type ElementProps = { + swipeDirection: 'up' | 'down' | 'left' | 'right'; + children: React.ReactNode; +}; + +type StyleProps = { + className?: string; +}; + +export const ToastArea = ({ swipeDirection, children, className }: ElementProps & StyleProps) => ( + <$ToastArea className={className}> + + {children} + + + +); + +const $ToastArea = styled.aside` + // Params + --toasts-gap: 0.5rem; + + // Rules + ${layoutMixins.scrollArea} + z-index: 1; + + pointer-events: none; + + > * { + display: contents; + pointer-events: none; + + > ol { + /* display: block; */ + + // Radix Toast's DOM order: earliest to latest (???) + // Radix Toast's focus order: latest to earliest (???) + // Desired display order: latest to earliest (¯\_(ツ)_/¯) + display: flex; + flex-direction: column-reverse; + + pointer-events: none; + + > * { + pointer-events: initial; + } + } + } +`; diff --git a/src/components/ToggleButton.stories.tsx b/src/components/ToggleButton.stories.tsx new file mode 100644 index 0000000..dd96fcc --- /dev/null +++ b/src/components/ToggleButton.stories.tsx @@ -0,0 +1,25 @@ +import type { Story } from '@ladle/react'; + +import { ButtonShape, ButtonSize } from '@/constants/buttons'; + +import { StoryWrapper } from '.ladle/components'; +import { ToggleButton } from './ToggleButton'; + +export const ToggleButtonStory: Story> = (args) => ( + + Toggle me + +); + +ToggleButtonStory.argTypes = { + size: { + options: Object.values(ButtonSize), + control: { type: 'select' }, + defaultValue: ButtonSize.XSmall, + }, + shape: { + options: Object.values(ButtonShape), + control: { type: 'select' }, + defaultValue: ButtonShape.Pill, + }, +}; diff --git a/src/components/ToggleButton.tsx b/src/components/ToggleButton.tsx new file mode 100644 index 0000000..80e8a34 --- /dev/null +++ b/src/components/ToggleButton.tsx @@ -0,0 +1,66 @@ +import { forwardRef } from 'react'; +import styled, { type AnyStyledComponent } from 'styled-components'; +import { Root } from '@radix-ui/react-toggle'; + +import { BaseButton, type BaseButtonProps } from '@/components/BaseButton'; + +type ElementProps = { + isPressed?: boolean; + onPressedChange?: (isPressed: boolean) => void; + disabled?: boolean; + slotLeft?: React.ReactNode; + slotRight?: React.ReactNode; + children?: React.ReactNode; +}; + +type StyleProps = { + className?: string; +}; + +export type ToggleButtonProps = BaseButtonProps & + ElementProps & + Omit; + +export const ToggleButton = forwardRef( + ( + { + isPressed, + onPressedChange, + disabled, + slotLeft = null, + slotRight = null, + children, + className, + ...buttonProps + }, + ref + ) => { + return ( + + + {slotLeft} + {children} + {slotRight} + + + ); + } +); + +const Styled: Record = {}; + +Styled.BaseButton = styled(BaseButton)` + --button-toggle-off-backgroundColor: var(--color-layer-3); + --button-toggle-off-textColor: var(--color-text-0); + --button-toggle-on-backgroundColor: var(--color-layer-1); + --button-toggle-on-textColor: var(--color-text-2); + + --button-backgroundColor: var(--button-toggle-off-backgroundColor); + --button-textColor: var(--button-toggle-off-textColor); + + &[data-state='on'], + &[data-state='active'] { + --button-backgroundColor: var(--button-toggle-on-backgroundColor); + --button-textColor: var(--button-toggle-on-textColor); + } +`; diff --git a/src/components/ToggleGroup.stories.tsx b/src/components/ToggleGroup.stories.tsx new file mode 100644 index 0000000..2e556cf --- /dev/null +++ b/src/components/ToggleGroup.stories.tsx @@ -0,0 +1,45 @@ +import { useState } from 'react'; +import type { Story } from '@ladle/react'; + +import { ButtonShape, ButtonSize } from '@/constants/buttons'; + +import { StoryWrapper } from '.ladle/components'; +import { ToggleGroup } from './ToggleGroup'; + +const ToggleGroupItems = [ + { + value: '0', + label: 'Item 1', + }, + { + value: '1', + label: 'Item 2', + }, + { + value: '2', + label: 'Item 3', + }, +]; + +export const ToggleGroupStory: Story> = (args) => { + const [value, setValue] = useState('0'); + + return ( + + + + ); +}; + +ToggleGroupStory.argTypes = { + size: { + options: Object.values(ButtonSize), + control: { type: 'select' }, + defaultValue: ButtonSize.XSmall, + }, + shape: { + options: Object.values(ButtonShape), + control: { type: 'select' }, + defaultValue: ButtonShape.Pill, + }, +}; diff --git a/src/components/ToggleGroup.tsx b/src/components/ToggleGroup.tsx new file mode 100644 index 0000000..d1541d0 --- /dev/null +++ b/src/components/ToggleGroup.tsx @@ -0,0 +1,69 @@ +import { forwardRef, type Ref } from 'react'; +import styled, { type AnyStyledComponent } from 'styled-components'; +import { Root, Item } from '@radix-ui/react-toggle-group'; + +import { type MenuItem } from '@/constants/menus'; +import { ButtonShape, ButtonSize } from '@/constants/buttons'; +import { useBreakpoints } from '@/hooks'; +import { layoutMixins } from '@/styles/layoutMixins'; + +import { type BaseButtonProps } from '@/components/BaseButton'; +import { ToggleButton } from '@/components/ToggleButton'; + +type ElementProps = { + items: MenuItem[]; + value: MenuItemValue; + onValueChange: (value: MenuItemValue) => void; +}; + +type StyleProps = { + className?: string; +}; + +export const ToggleGroup = forwardRef( + ( + { + items, + value, + onValueChange, + className, + size, + shape = ButtonShape.Pill, + ...buttonProps + }: ElementProps & StyleProps & BaseButtonProps, + ref: Ref + ) => { + const { isTablet } = useBreakpoints(); + + return ( + + {items.map((item) => ( + + + {item.slotBefore} + {item.label} + + + ))} + + ); + } +); + +const Styled: Record = {}; + +Styled.Root = styled(Root)` + ${layoutMixins.row} + gap: 0.33em; +`; diff --git a/src/components/Toolbar.tsx b/src/components/Toolbar.tsx new file mode 100644 index 0000000..1da0ec5 --- /dev/null +++ b/src/components/Toolbar.tsx @@ -0,0 +1,51 @@ +import styled, { type AnyStyledComponent } from 'styled-components'; + +import { Root, Button, Separator, Link, ToggleGroup, ToggleItem } from '@radix-ui/react-toolbar'; +import { WithSeparators } from './Separator'; +import { layoutMixins } from '@/styles/layoutMixins'; + +type ElementProps = { + children: React.ReactNode; +}; + +type StyleProps = { + layout?: 'column' | 'row'; + className?: string; + withSeparators?: boolean; +}; + +export const Toolbar = ({ + children, + layout = 'row', + withSeparators = false, + className, +}: ElementProps & StyleProps) => ( + + + {children} + + {/* Each child as a */} + {/* {[children].flat().map((child, i) => ( + + ))} */} + + +); + +const Styled: Record = {}; + +Styled.Root = styled(Root)<{ layout?: 'column' | 'row' }>` + ${({ layout }) => + layout && + { + column: layoutMixins.column, + row: layoutMixins.row, + }[layout]} + + padding: 0 1rem; +`; diff --git a/src/components/TriangleIndicator.stories.tsx b/src/components/TriangleIndicator.stories.tsx new file mode 100644 index 0000000..9e1f44f --- /dev/null +++ b/src/components/TriangleIndicator.stories.tsx @@ -0,0 +1,39 @@ +import { useEffect, useState } from 'react'; +import styled, { AnyStyledComponent } from 'styled-components'; +import type { Story } from '@ladle/react'; + +import { layoutMixins } from '@/styles/layoutMixins'; + +import { TriangleIndicator, TriangleIndicatorProps } from '@/components/TriangleIndicator'; + +import { StoryWrapper } from '.ladle/components'; +import { MustBigNumber } from '@/lib/numbers'; + +export const TriangleIndicatorStory: Story<{ value: number }> = (args) => { + const [valueBN] = useState(MustBigNumber(args.value)); + + return ( + + + + + + ); +}; + +TriangleIndicatorStory.args = { + value: 0, +}; + +const Styled: Record = {}; + +Styled.Container = styled.section` + background: var(--color-layer-3); + + ${layoutMixins.container} + + padding: 10px; + display: flex; + align-items: center; + gap: 8px; +`; diff --git a/src/components/TriangleIndicator.tsx b/src/components/TriangleIndicator.tsx new file mode 100644 index 0000000..d3fd122 --- /dev/null +++ b/src/components/TriangleIndicator.tsx @@ -0,0 +1,60 @@ +import styled, { AnyStyledComponent, css } from 'styled-components'; +import BigNumber from 'bignumber.js'; + +import { NumberSign } from '@/constants/numbers'; + +import { Icon, IconName } from './Icon'; + +type ElementProps = { + value: BigNumber; +}; + +type StyleProps = { + className?: string; +}; + +export type TriangleIndicatorProps = ElementProps & StyleProps; + +const getSign = (num: BigNumber) => + num.gt(0) ? NumberSign.Positive : num.lt(0) ? NumberSign.Negative : NumberSign.Neutral; + +export const TriangleIndicator = ({ className, value }: TriangleIndicatorProps) => { + return ( + + + + ); +}; + +const Styled: Record = {}; + +Styled.TriangleIndicator = styled.div<{ sign: NumberSign }>` + display: flex; + align-items: center; + height: 100%; + margin-top: 0.0625rem; + + svg { + width: 0.375em; + height: 0.375em; + } + + ${({ sign }) => + ({ + [NumberSign.Positive]: css` + color: var(--color-positive); + + svg { + transform: rotate(180deg); + } + `, + [NumberSign.Negative]: css` + color: var(--color-negative); + `, + [NumberSign.Neutral]: css` + svg { + transform: rotate(180deg); + } + `, + }[sign])} +`; diff --git a/src/components/UsageBars.stories.tsx b/src/components/UsageBars.stories.tsx new file mode 100644 index 0000000..0b2e324 --- /dev/null +++ b/src/components/UsageBars.stories.tsx @@ -0,0 +1,29 @@ +import styled, { AnyStyledComponent } from 'styled-components'; +import type { Story } from '@ladle/react'; + +import { layoutMixins } from '@/styles/layoutMixins'; + +import { UsageBars } from '@/components/UsageBars'; + +import { StoryWrapper } from '.ladle/components'; + +export const UsageBarsStory: Story<{ value: number }> = (args) => ( + + + + + +); + +UsageBarsStory.args = { + value: 0, +}; + +const Styled: Record = {}; + +Styled.Container = styled.section` + ${layoutMixins.container} + background: var(--color-layer-3); + + padding: 1rem; +`; diff --git a/src/components/UsageBars.tsx b/src/components/UsageBars.tsx new file mode 100644 index 0000000..07322fb --- /dev/null +++ b/src/components/UsageBars.tsx @@ -0,0 +1,56 @@ +import styled, { type AnyStyledComponent } from 'styled-components'; + +import { type RiskLevels } from '@/constants/abacus'; + +import { UsageColorFromRiskLevel } from '@/styles/colors'; + +import { abacusHelper } from '@/lib/abacus'; +type ElementProps = { + value: number; +}; + +type StyleProps = { + className?: string; +}; + +export const UsageBars = ({ value, className }: ElementProps & StyleProps) => ( + + {Array.from({ length: 3 }, (_, i) => ( + + ))} + +); + +const Styled: Record = {}; + +Styled.UsageBars = styled.div<{ riskLevel: RiskLevels }>` + ${({ riskLevel }) => UsageColorFromRiskLevel(riskLevel)} + + width: 0.875rem; + height: 0.875rem; + display: flex; + align-items: end; + justify-content: space-between; +`; + +Styled.Bar = styled.div<{ active: boolean }>` + --active-delay: calc(0.2s * calc(var(--i) + 1)); + + max-width: 3px; + height: min(calc(100% / calc(var(--l) - var(--i)) + 0.1rem), 100%); + opacity: ${({ active }) => (active ? 1 : 0.2)}; + flex: 1; + background-color: currentColor; + border-radius: 1px; + + @media (prefers-reduced-motion: no-preference) { + transition: opacity 0.3s linear var(--active-delay); + } +`; diff --git a/src/components/WithConfirmationPopover.stories.tsx b/src/components/WithConfirmationPopover.stories.tsx new file mode 100644 index 0000000..2032932 --- /dev/null +++ b/src/components/WithConfirmationPopover.stories.tsx @@ -0,0 +1,52 @@ +import { type ChangeEvent, useState } from 'react'; +import type { Story } from '@ladle/react'; + +import { + WithConfirmationPopover, + WithConfirmationPopoverProps, +} from '@/components/WithConfirmationPopover'; + +import { StoryWrapper } from '.ladle/components'; +import { Input, InputType } from './Input'; + +export const WithConfirmationPopoverStory: Story = (args) => { + const [textValue, setTextValue] = useState(''); + const [open, setOpen] = useState(false); + + return ( + + { + setOpen(false); + // alert('Cancelled!'); + }} + onConfirm={() => { + setOpen(false); + // alert('Confirmed!'); + }} + slotTrigger={
Trigger
} + > + ) => setTextValue(e.target.value)} + /> +
+
+ ); +}; + +WithConfirmationPopoverStory.args = { + sideOffset: 8, +}; + +WithConfirmationPopoverStory.argTypes = { + align: { + options: ['end', 'start', 'center'], + control: { type: 'select' }, + defaultValue: 'end', + }, +}; diff --git a/src/components/WithConfirmationPopover.tsx b/src/components/WithConfirmationPopover.tsx new file mode 100644 index 0000000..b9ac9fa --- /dev/null +++ b/src/components/WithConfirmationPopover.tsx @@ -0,0 +1,136 @@ +import { + forwardRef, + type FormEvent, + type FormEventHandler, + type MouseEventHandler, + type ReactElement, + type Ref, +} from 'react'; + +import styled, { AnyStyledComponent } from 'styled-components'; +import { Anchor, Content, Portal, Root, Trigger } from '@radix-ui/react-popover'; + +import { ButtonType } from '@/constants/buttons'; +import { layoutMixins } from '@/styles/layoutMixins'; + +import { IconName } from '@/components/Icon'; +import { IconButton } from '@/components/IconButton'; + +type ElementProps = { + children?: ReactElement; + asChild?: boolean; + onCancel?: MouseEventHandler | MouseEventHandler; + onConfirm?: FormEventHandler; + open?: boolean; + onOpenChange?: (open: boolean) => void; + slotTrigger: ReactElement; +}; + +type StyleProps = { + className?: string; + align?: 'start' | 'center' | 'end'; + sideOffset?: number; +}; + +export type WithConfirmationPopoverProps = ElementProps & StyleProps; + +export const WithConfirmationPopover = forwardRef( + ( + { + children, + className, + onCancel, + onConfirm, + + asChild, + open, + onOpenChange, + align, + sideOffset, + slotTrigger, + }: WithConfirmationPopoverProps, + ref?: Ref + ) => ( + + asChild && e.preventDefault()}> + {slotTrigger} + + + + e.preventDefault()} + > + { + e.preventDefault(); + e.stopPropagation(); + + onConfirm?.(e); + }} + > + {children} + + {onCancel && } + {onConfirm && ( + + )} + + + + + + ) +); + +const Styled: Record = {}; + +Styled.Content = styled(Content)` + z-index: 1; + + &:focus { + outline: none; + } +`; + +Styled.Form = styled.form` + ${layoutMixins.column} + gap: 0.25rem; +`; + +Styled.ConfirmationButtons = styled.div` + ${layoutMixins.row}; + + justify-content: flex-end; + gap: 0.25rem; +`; + +Styled.IconButton = styled(IconButton)` + --button-height: 1.25rem; + --button-font: var(--font-tiny-book); +`; + +Styled.ConfirmButton = styled(Styled.IconButton)` + --button-backgroundColor: hsla(203, 25%, 19%, 1); + + svg { + color: var(--color-positive); + } +`; + +Styled.CancelButton = styled(Styled.IconButton)` + --button-backgroundColor: hsla(296, 16%, 18%, 1); + + svg { + color: var(--color-negative); + width: 0.8em; + height: 0.8em; + + path { + stroke-width: 3; + } + } +`; diff --git a/src/components/WithDetailsReceipt.stories.tsx b/src/components/WithDetailsReceipt.stories.tsx new file mode 100644 index 0000000..730a78a --- /dev/null +++ b/src/components/WithDetailsReceipt.stories.tsx @@ -0,0 +1,48 @@ +import type { Story } from '@ladle/react'; + +import { Button } from '@/components/Button'; + +import { WithDetailsReceipt, WithDetailsReceiptProps } from '@/components/WithDetailsReceipt'; +import { type DetailsItem } from './Details'; + +import { StoryWrapper } from '.ladle/components'; + +const detailItems: DetailsItem[] = [ + { + key: 'item-1', + label: 'Item 1', + value: 'Value 1', + }, + { + key: 'item-2', + label: 'Item 2', + value: 'Value 2', + }, + { + key: 'item-3', + label: 'Item 3', + value: 'Value 3', + }, +]; + +export const WithDetailsReceiptStory: Story = (args) => ( + +
+ + + +
+
+); + +WithDetailsReceiptStory.args = { + detailItems, +}; + +WithDetailsReceiptStory.argTypes = { + side: { + options: ['top', 'bottom'], + control: { type: 'select' }, + defaultValue: 'top', + }, +}; diff --git a/src/components/WithDetailsReceipt.tsx b/src/components/WithDetailsReceipt.tsx new file mode 100644 index 0000000..6f733cd --- /dev/null +++ b/src/components/WithDetailsReceipt.tsx @@ -0,0 +1,44 @@ +import styled, { type AnyStyledComponent } from 'styled-components'; + +import { Details, type DetailsItem } from '@/components/Details'; +import { WithReceipt } from '@/components/WithReceipt'; + +type ElementProps = { + detailItems?: DetailsItem[]; + children: React.ReactNode; +}; + +type StyleProps = { + className?: string; + hideReceipt?: boolean; + side?: 'top' | 'bottom'; +}; + +export type WithDetailsReceiptProps = ElementProps & StyleProps; + +export const WithDetailsReceipt = ({ + children, + className, + hideReceipt, + detailItems, + side, +}: WithDetailsReceiptProps) => ( + } + > + {children} + +); + +const Styled: Record = {}; + +Styled.Details = styled(Details)` + --details-item-backgroundColor: var(--withReceipt-backgroundColor); + + padding: 0.375rem 0.75rem 0.25rem; + + font-size: 0.8125em; +`; diff --git a/src/components/WithLabel.stories.tsx b/src/components/WithLabel.stories.tsx new file mode 100644 index 0000000..fc8fa84 --- /dev/null +++ b/src/components/WithLabel.stories.tsx @@ -0,0 +1,49 @@ +import { useState } from 'react'; +import type { Story } from '@ladle/react'; + +import { Input, InputType } from '@/components/Input'; +import { WithLabel } from '@/components/WithLabel'; + +import { StoryWrapper } from '.ladle/components'; + +import styled, { type AnyStyledComponent } from 'styled-components'; +import { layoutMixins } from '@/styles/layoutMixins'; + +export const WithLabelStory: Story> = (args) => { + const [firstName, setFirstName] = useState(''); + const [lastName, setLastName] = useState(''); + + return ( + + + + ) => setFirstName(e.target.value)} + placeholder="Type something" + type={InputType.Text} + value={firstName} + /> + + + ) => setLastName(e.target.value)} + placeholder="Type something" + type={InputType.Text} + value={lastName} + /> + + + + ); +}; + +WithLabelStory.args = { + label: 'First Name', +}; + +const Styled: Record = {}; + +Styled.Column = styled.div` + ${layoutMixins.column} + gap: 1rem; +`; diff --git a/src/components/WithLabel.tsx b/src/components/WithLabel.tsx new file mode 100644 index 0000000..83e5f4b --- /dev/null +++ b/src/components/WithLabel.tsx @@ -0,0 +1,35 @@ +import styled, { type AnyStyledComponent } from 'styled-components'; + +import { layoutMixins } from '@/styles/layoutMixins'; + +type ElementProps = { + label?: React.ReactNode; + children?: React.ReactNode; + inputID?: string; +}; + +type StyleProps = { + className?: string; +}; + +export const WithLabel = ({ label, inputID, children, className }: ElementProps & StyleProps) => ( + + {label} + {children} + +); + +const Styled: Record = {}; + +Styled.WithLabel = styled.div` + --label-textColor: var(--color-text-1); + + display: grid; + gap: 0.5rem; +`; + +Styled.Label = styled.label` + ${layoutMixins.inlineRow} + font: var(--font-mini-book); + color: var(--label-textColor); +`; diff --git a/src/components/WithReceipt.stories.tsx b/src/components/WithReceipt.stories.tsx new file mode 100644 index 0000000..a14589a --- /dev/null +++ b/src/components/WithReceipt.stories.tsx @@ -0,0 +1,48 @@ +import type { Story } from '@ladle/react'; + +import { Button } from '@/components/Button'; + +import { WithReceipt } from '@/components/WithReceipt'; +import { type DetailsItem } from './Details'; + +import { StoryWrapper } from '.ladle/components'; + +const items: DetailsItem[] = [ + { + key: 'item-1', + label: 'Item 1', + value: 'Value 1', + }, + { + key: 'item-2', + label: 'Item 2', + value: 'Value 2', + }, + { + key: 'item-3', + label: 'Item 3', + value: 'Value 3', + }, +]; + +export const WithReceiptStory: Story> = (args) => ( + +
+ + + +
+
+); + +WithReceiptStory.args = { + items, +}; + +WithReceiptStory.argTypes = { + side: { + options: ['top', 'bottom'], + control: { type: 'select' }, + defaultValue: 'top', + }, +}; diff --git a/src/components/WithReceipt.tsx b/src/components/WithReceipt.tsx new file mode 100644 index 0000000..8b3c405 --- /dev/null +++ b/src/components/WithReceipt.tsx @@ -0,0 +1,61 @@ +import { type ReactNode } from 'react'; +import styled, { type AnyStyledComponent, css } from 'styled-components'; + +type ElementProps = { + slotReceipt?: ReactNode; + children: ReactNode; +}; + +type StyleProps = { + className?: string; + hideReceipt?: boolean; + side?: 'top' | 'bottom'; +}; + +export const WithReceipt = ({ + slotReceipt, + className, + hideReceipt, + side = 'top', + children, +}: ElementProps & StyleProps) => { + if (!slotReceipt) { + return <>{children}; + } + + const receipt = {slotReceipt}; + + return ( + + {side === 'top' && receipt} + {children} + {side === 'bottom' && receipt} + + ); +}; + +const Styled: Record = {}; + +Styled.WithReceipt = styled.div<{ hideReceipt?: boolean }>` + --withReceipt-backgroundColor: var(--color-layer-1); + display: grid; + + background-color: var(--withReceipt-backgroundColor); + border-radius: 0.5em; + + ${({ hideReceipt }) => + hideReceipt && + css` + background-color: transparent; + + ${Styled.SlotReceipt} { + height: 0; + opacity: 0; + } + `} +`; + +Styled.SlotReceipt = styled.div``; diff --git a/src/components/WithSidebar.tsx b/src/components/WithSidebar.tsx new file mode 100644 index 0000000..4e4c79a --- /dev/null +++ b/src/components/WithSidebar.tsx @@ -0,0 +1,204 @@ +import React from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import styled, { type AnyStyledComponent, keyframes } from 'styled-components'; + +import { ButtonShape, ButtonSize } from '@/constants/buttons'; +import { STRING_KEYS } from '@/constants/localization'; +import { useStringGetter } from '@/hooks'; + +import { breakpoints } from '@/styles'; +import { layoutMixins } from '@/styles/layoutMixins'; + +import { ToggleButton } from '@/components/ToggleButton'; +import { Icon, IconName } from '@/components/Icon'; + +import { setIsSidebarOpen } from '@/state/layout'; +import { getIsSidebarOpen } from '@/state/layoutSelectors'; + +type ElementProps = { + children: React.ReactNode; + sidebar: React.ReactNode; +}; + +export type WithSidebarProps = ElementProps; + +export const WithSidebar: React.FC = ({ children, sidebar }) => { + const dispatch = useDispatch(); + const isSidebarOpen = useSelector(getIsSidebarOpen); + const stringGetter = useStringGetter(); + + return ( + + {sidebar && ( + + dispatch(setIsSidebarOpen(!isPressed))} + > + {isSidebarOpen ? ( + stringGetter({ key: STRING_KEYS.HIDE }) + ) : ( + + )} + + + {sidebar} + + )} + + {children} + + ); +}; + +const Styled: Record = {}; + +Styled.Container = styled.div` + /* Params */ + --withSidebar-containerWidth: 100vw; + --withSidebar-open-sidebarWidth: var(--sidebar-width); + --withSidebar-closed-sidebarWidth: var(--collapsed-sidebar-width); + --withSidebar-gap: var(--border-width); + + /* Computed */ + + --withSidebar-current-sidebarWidth: 0px; + --withSidebar-current-contentAreaWidth: calc( + var(--withSidebar-containerWidth) - var(--withSidebar-gap) - + var(--withSidebar-current-sideAreaWidth) + ); + + &[data-state='none'] { + --withSidebar-open-sideAreaWidth: 0px; + --withSidebar-closed-sideAreaWidth: 0px; + } + &[data-state='open'] { + --withSidebar-current-sidebarWidth: var(--withSidebar-open-sidebarWidth); + } + &[data-state='closed'] { + --withSidebar-current-sidebarWidth: var(--withSidebar-closed-sidebarWidth); + } + + @media ${breakpoints.notTablet} { + /* Dynamic sidebarArea, open sidebar shrinks contentArea */ + --withSidebar-current-sideAreaWidth: var(--withSidebar-current-sidebarWidth); + /* prettier-ignore */ + --withSidebar-gridTemplate: + 'Side Content' 100% + / auto 1fr; + } + + @media ${breakpoints.tablet} { + /* No sidebar */ + --withSidebar-current-sideAreaWidth: 0px; + /* prettier-ignore */ + --withSidebar-gridTemplate: + 'Content' 100% + / 1fr; + } + + /* Rules */ + + ${layoutMixins.stickyArea1} + --stickyArea1-leftWidth: var(--withSidebar-current-sideAreaWidth); + --stickyArea1-leftGap: var(--border-width); + min-height: var(--stickyArea-height); + + ${layoutMixins.withOuterAndInnerBorders} + + display: grid; + grid-template: var(--withSidebar-gridTemplate); +`; + +Styled.Side = styled.aside` + grid-area: Side; + + ${layoutMixins.container} + + ${layoutMixins.sticky} + max-height: var(--stickyArea-height); + backdrop-filter: none; + + ${layoutMixins.stack} +`; + +Styled.Sidebar = styled.div` + --current-sidebar-width: var(--sidebar-width); + + ${layoutMixins.scrollArea} + + width: min(var(--withSidebar-current-sidebarWidth), var(--withSidebar-containerWidth)); + transition: var(--ease-out-expo) 0.3s; + transform: perspective(62.5em); + transform-origin: left top; + + &[data-state='closed'] { + --current-sidebar-width: var(--collapsed-sidebar-width); + opacity: 0; + pointer-events: none; + transform: perspective(62.5em) translateZ(-12.5em); + } + + ${layoutMixins.sticky} + + &:hover { + will-change: width; + } +`; + +Styled.TriggerButton = styled(ToggleButton)` + --button-toggle-on-backgroundColor: transparent; + + place-self: start end; + z-index: 2; + + min-width: 0; + min-height: 0; + + &[data-state='off'] { + margin: 0.75rem; + + @media (prefers-reduced-motion: no-preference) { + animation: ${keyframes` + 10%, 40% { + opacity: 0; + scale: 0; + } + `} 0.2s; + } + } + + &[data-state='on'] { + --button-border: none; + --button-radius: 0; + + min-width: 100%; + min-height: 100%; + + outline-color: transparent; + + @media (prefers-reduced-motion: no-preference) { + transition: var(--ease-out-expo) 0.25s; + + animation: ${keyframes` + 20% { + opacity: 0; + scale: 0; + } + `} 0.2s; + } + } +`; + +Styled.Content = styled.article` + grid-area: Content; + + ${layoutMixins.contentContainerPage} + --content-container-width: var(--withSidebar-current-contentAreaWidth); + + ${layoutMixins.stickyArea2} + + transition: var(--ease-out-expo) 0.25s; +`; diff --git a/src/components/WithTooltip.stories.tsx b/src/components/WithTooltip.stories.tsx new file mode 100644 index 0000000..93bd2b3 --- /dev/null +++ b/src/components/WithTooltip.stories.tsx @@ -0,0 +1,39 @@ +import type { Story } from '@ladle/react'; + +import { WithTooltip } from '@/components/WithTooltip'; + +import { tooltipStrings } from '@/constants/tooltips'; + +import { StoryWrapper } from '.ladle/components'; + +export const Tooltip: Story> = (args) => { + return ( + + +
Hover me
+
+
+ ); +}; + +Tooltip.args = { + withIcon: false, +}; + +Tooltip.argTypes = { + align: { + options: ['start', 'center', 'end'], + control: { type: 'select' }, + defaultValue: 'start', + }, + side: { + options: ['top', 'bottom', 'left', 'right'], + control: { type: 'select' }, + defaultValue: 'top', + }, + tooltip: { + options: Object.keys(tooltipStrings), + control: { type: 'select' }, + defaultValue: Object.keys(tooltipStrings)[0], + }, +}; diff --git a/src/components/WithTooltip.tsx b/src/components/WithTooltip.tsx new file mode 100644 index 0000000..71563c6 --- /dev/null +++ b/src/components/WithTooltip.tsx @@ -0,0 +1,144 @@ +import type { ReactNode } from 'react'; +import styled, { AnyStyledComponent } from 'styled-components'; +import { Content, Portal, Provider, Root, Trigger, Arrow } from '@radix-ui/react-tooltip'; + +import { tooltipStrings } from '@/constants/tooltips'; + +import { useStringGetter } from '@/hooks'; + +import { Icon, IconName } from '@/components/Icon'; + +import { layoutMixins } from '@/styles/layoutMixins'; +import { popoverMixins } from '@/styles/popoverMixins'; + +type ElementProps = { + tooltip?: keyof typeof tooltipStrings; + tooltipString?: string; + stringParams?: Record; + withIcon?: boolean; + children?: ReactNode; + slotTooltip?: ReactNode; +}; + +type StyleProps = { + align?: 'start' | 'center' | 'end'; + side?: 'top' | 'right' | 'bottom' | 'left'; + className?: string; +}; + +export const WithTooltip = ({ + tooltip, + tooltipString, + stringParams, + withIcon, + children, + align, + side, + className, + slotTooltip, +}: ElementProps & StyleProps) => { + const stringGetter = useStringGetter(); + + const getTooltipStrings = tooltip && tooltipStrings[tooltip]; + if (!getTooltipStrings && !tooltipString && !slotTooltip) return <>{children}; + + let tooltipTitle; + let tooltipBody; + + if (getTooltipStrings) { + const { title, body } = getTooltipStrings({ + stringGetter, + stringParams, + }); + tooltipTitle = title; + tooltipBody = body; + } else { + tooltipBody = tooltipString; + } + + return ( + + + + + {children} + {withIcon && } + + + + + + {slotTooltip ?? ( +
+ {tooltipTitle &&
{tooltipTitle}
} + {tooltipBody &&
{tooltipBody}
} + +
+ )} +
+
+
+
+ ); +}; + +const Styled: Record = {}; + +Styled.Abbr = styled.abbr` + ${layoutMixins.inlineRow} + + text-decoration: underline dashed 0px; + text-underline-position: under; + text-decoration-color: var(--color-text-0); + text-decoration-skip-ink: all; + + cursor: help; +`; + +Styled.Content = styled(Content)` + --tooltip-backgroundColor: var(--color-layer-4); + --tooltip-backgroundColor: hsl( + var(--layer-base-hue), + var(--layer-base-saturation), + calc(var(--layer-base-lightness) + 4%), + 0.66 + ); + + ${popoverMixins.popover} + --popover-backgroundColor: var(--tooltip-backgroundColor); + --popover-textColor: var(--color-text-1); + + ${popoverMixins.popoverAnimation} + --popover-closed-height: auto; + + max-width: 30ch; + display: grid; + align-items: end; + gap: 0.25rem; + padding: 0.75em; + + font-size: 0.8125em; + + border-radius: 0.33em; + + dt { + font: var(--font-small-book); + } + + dd { + font: var(--font-mini-book); + } +`; + +Styled.Arrow = styled(Arrow)` + width: 0.75rem; + height: 0.375rem; + + polygon { + fill: var(--tooltip-backgroundColor); + } +`; + +Styled.Icon = styled(Icon)` + color: var(--color-text-0); +`; diff --git a/src/components/visx/AxisLabelOutput.tsx b/src/components/visx/AxisLabelOutput.tsx new file mode 100644 index 0000000..fe0bd6c --- /dev/null +++ b/src/components/visx/AxisLabelOutput.tsx @@ -0,0 +1,39 @@ +import styled, { css, type AnyStyledComponent } from 'styled-components'; + +import { Output } from '../Output'; + +type ElementProps = { + children: React.ReactNode; +} & Parameters[0]; + +type StyleProps = { + accentColor?: string; +}; + +export const AxisLabelOutput = ({ children, accentColor, ...props }: ElementProps & StyleProps) => ( + + {children} + +); + +const Styled: Record = {}; + +Styled.AxisLabelOutput = styled(Output)<{ accentColor?: string }>` + --accent-color: var(--color-layer-6); + + ${({ accentColor }) => + accentColor && + css` + --accent-color: ${accentColor}; + `} + + offset: path('M 0 0') 0px; + + display: inline-block; + padding: 0.15em 0.4em; + border-radius: 0.25em; + + color: white; + + background-color: var(--accent-color); +`; diff --git a/src/components/visx/TimeSeriesChart.tsx b/src/components/visx/TimeSeriesChart.tsx new file mode 100644 index 0000000..43adba2 --- /dev/null +++ b/src/components/visx/TimeSeriesChart.tsx @@ -0,0 +1,467 @@ +import React, { useEffect, useMemo, useState } from 'react'; +import styled, { AnyStyledComponent, keyframes } from 'styled-components'; + +import { allTimeUnits } from '@/constants/time'; +import { useBreakpoints } from '@/hooks'; +import { useAnimationFrame } from '@/hooks/useAnimationFrame'; +import { layoutMixins } from '@/styles/layoutMixins'; + +import { ParentSize } from '@visx/responsive'; +import { + XYChart, + Axis, + Grid, + DataProvider, + EventEmitterProvider, + LineSeries, + GlyphSeries, + type Margin, + type AxisScale, + type TooltipContextType, +} from '@visx/xychart'; +import type { ScaleConfig } from '@visx/scale'; +import { LinearGradient } from '@visx/gradient'; +import Tooltip from '@/components/visx/XYChartTooltipWithBounds'; +import { RenderTooltipParams } from '@visx/xychart/lib/components/Tooltip'; + +import { clamp, lerp, map } from '@/lib/math'; +import { formatAbsoluteTime } from '@/lib/dateTime'; +import { objectEntries } from '@/lib/objectEntries'; + +import { XYChartThreshold, type Threshold } from './XYChartThreshold'; + +type LineSeriesProps = Parameters< + typeof LineSeries +>[0]; + +type GlyphSeriesProps = Parameters< + typeof GlyphSeries +>[0]; + +type ThresholdProps = Parameters>[0]; + +type ElementProps = { + id: string; + selectedLocale: string; + yAxisScaleType?: ScaleConfig['type']; + data: Datum[]; + series: (Pick< + LineSeriesProps, + | 'dataKey' + // | 'xAccessor' + // | 'yAccessor' + | 'colorAccessor' + // | 'curve' + | 'onPointerMove' + | 'onPointerOut' + > & + Pick, 'curve'> & { + colorAccessor: GlyphSeriesProps['colorAccessor']; + xAccessor: (_: Datum) => number; + yAccessor: (_: Datum) => number; + getCurve?: (_: { zoom: number; zoomDomain: number }) => ThresholdProps['curve']; // LineSeriesProps['curve']; + glyphSize?: GlyphSeriesProps['size']; + getGlyphSize?: (_: { datum: Datum; zoom: number }) => number; + threshold?: Pick, 'aboveAreaProps' | 'belowAreaProps'> & { + yAccessor: LineSeriesProps['yAccessor']; + }; + })[]; + tickFormatX?: (x: number, _: { zoom: number; zoomDomain: number; numTicks: number }) => string; + tickFormatY?: (y: number, _: { zoom: number; zoomDomain: number; numTicks: number }) => string; + renderXAxisLabel?: (_: RenderTooltipParams) => React.ReactNode; + renderYAxisLabel?: (_: RenderTooltipParams) => React.ReactNode; + renderTooltip?: (_: RenderTooltipParams) => React.ReactNode; + onTooltipContext?: (tooltipContext: TooltipContextType) => void; + onVisibleDataChange?: (data: Datum[]) => void; + onZoom?: (_: { zoomDomain: number | undefined }) => void; + slotEmpty: React.ReactNode; + children: React.ReactNode; + className?: string; +}; + +type StyleProps = { + margin?: Margin; + padding?: Margin; + defaultZoomDomain?: number; + minZoomDomain: number; + numGridLines?: number; + withGridRows?: boolean; + withGridColumns?: boolean; + tickSpacingX?: number; + tickSpacingY?: number; +}; + +export const TimeSeriesChart = ({ + id, + selectedLocale, + yAxisScaleType = 'linear', + data, + series, + tickFormatX = (timestamp, { zoomDomain, numTicks }) => + formatAbsoluteTime(timestamp, { + resolutionUnit: + objectEntries(allTimeUnits) + .sort((a, b) => a[1] - b[1]) + .find(([, milliseconds]) => zoomDomain <= milliseconds)?.[0] ?? 'year', + locale: selectedLocale, + }), + tickFormatY = (y) => String(y), + renderXAxisLabel, + renderYAxisLabel, + renderTooltip, + onTooltipContext, + onVisibleDataChange, + onZoom, + slotEmpty, + children, + className, + + margin, + padding, + defaultZoomDomain, + minZoomDomain = 0, + numGridLines, + withGridRows = true, + withGridColumns = false, + tickSpacingX = 150, + tickSpacingY = 50, +}: ElementProps & StyleProps) => { + // Context + const { isMobile } = useBreakpoints(); + + // Chart data + const { xAccessor, yAccessor } = series[0]; + + const earliestDatum = data?.[0]; + const latestDatum = data?.[data.length - 1]; + + // Chart state + const [zoomDomain, setZoomDomain] = useState( + defaultZoomDomain ?? xAccessor(latestDatum) - xAccessor(earliestDatum) + ); + + const [zoomDomainAnimateTo, setZoomDomainAnimateTo] = useState(); + + useEffect(() => { + if (defaultZoomDomain && defaultZoomDomain !== zoomDomain) { + setZoomDomainAnimateTo(defaultZoomDomain); + } + }, [defaultZoomDomain]); + + useEffect(() => { + onZoom?.({ zoomDomain }); + }, [zoomDomain]); + + useAnimationFrame( + (elapsedMilliseconds) => { + if (zoomDomainAnimateTo) { + setZoomDomain( + (zoomDomain) => + zoomDomain && + zoomDomain * (zoomDomainAnimateTo / zoomDomain) ** (elapsedMilliseconds * 0.0166) + ); + } + }, + [zoomDomainAnimateTo] + ); + + // Computations + const { zoom, domain, range, visibleData } = useMemo(() => { + if (!zoomDomain) return {}; + + const zoom = zoomDomain / minZoomDomain; + + const domain = [ + clamp(xAccessor(latestDatum) - zoomDomain, xAccessor(earliestDatum), xAccessor(latestDatum)), + xAccessor(latestDatum), + ] as const; + + const visibleData = data.filter( + (datum) => xAccessor(datum) >= domain[0] && xAccessor(datum) <= domain[1] + ); + + const range = visibleData + .filter((datum) => xAccessor(datum) >= domain[0] && xAccessor(datum) <= domain[1]) + .map((datum) => yAccessor(datum)) + .reduce((range, y) => [Math.min(range[0], y), Math.max(range[1], y)] as const, [ + Infinity, + -Infinity, + ] as const); + + return { zoom, domain, range, visibleData }; + }, [data, zoomDomain, minZoomDomain]); + + useEffect(() => { + if (visibleData) { + onVisibleDataChange?.(visibleData); + } + }, [visibleData]); + + // Events + const onWheel = ({ deltaX, deltaY }: WheelEvent) => { + setZoomDomain( + clamp( + Math.max(1e-320, Math.min(Number.MAX_SAFE_INTEGER, zoomDomain * Math.exp(deltaY / 1000))), + minZoomDomain, + xAccessor(latestDatum) - xAccessor(earliestDatum) + ) + ); + + setZoomDomainAnimateTo(undefined); + + // TODO: scroll horizontally to pan + }; + + return ( + + {data.length && zoomDomain ? ( + + + + {({ width, height }: { width: number; height: number }) => { + const numTicksX = + (width - (margin?.left ?? 0) - (margin?.right ?? 0)) / tickSpacingX; + const numTicksY = + (height - (margin?.top ?? 0) - (margin?.bottom ?? 0)) / tickSpacingY; + + return ( + + + + {series.map((series) => ( + + {series.threshold && ( + <> + + id={`${Math.random()}`} + data={data} + x={series.xAccessor} + y0={series.yAccessor} + y1={series.threshold.yAccessor} + clipAboveTo={margin?.top ?? 0} + clipBelowTo={height - (margin?.bottom ?? 0)} + curve={series.getCurve?.({ zoom, zoomDomain }) ?? series.curve} + aboveAreaProps={{ + fill: 'url(#XYChartThresholdAbove)', + fillOpacity: series.threshold.aboveAreaProps?.fillOpacity, + strokeWidth: series.threshold.aboveAreaProps?.strokeWidth, + stroke: series.threshold.aboveAreaProps?.stroke, + }} + belowAreaProps={{ + fill: 'url(#XYChartThresholdBelow)', + fillOpacity: series.threshold.belowAreaProps?.fillOpacity, + strokeWidth: series.threshold.belowAreaProps?.strokeWidth, + stroke: series.threshold.belowAreaProps?.stroke, + }} + /> + + + + )} + 'transparent' : series.colorAccessor + } + onPointerMove={series?.onPointerMove} + onPointerOut={series?.onPointerOut} + /> + + {(series.glyphSize || series.getGlyphSize) && ( + series.getGlyphSize?.({ datum, zoom }) || 0 + : series.glyphSize || 0 + } + /> + )} + + ))} + + {/* Y-Axis */} + {!isMobile && ( + <> + {margin?.left && margin.left > 0 && ( + + )} + + + tickFormatY(y, { zoom, zoomDomain, numTicks: numTicksY }) + } + /> + + )} + + {/* X-Axis */} + tickFormatX(x, { zoom, zoomDomain, numTicks: numTicksX })} + /> + + {renderTooltip && ( + + unstyled + applyPositionStyle + showDatumGlyph + glyphStyle={{ + fill: 'var(--color-text-1)', + stroke: 'var(--color-layer-5)', + radius: 4, + }} + showVerticalCrosshair + verticalCrosshairStyle={{ + strokeWidth: 1, + strokeDasharray: '5 5', + opacity: 0.7, + }} + snapCrosshairToDatumX + renderXAxisLabel={renderXAxisLabel} + showHorizontalCrosshair + horizontalCrosshairStyle={{ + strokeWidth: 1, + strokeDasharray: '5 5', + opacity: 0.7, + }} + snapCrosshairToDatumY + renderYAxisLabel={renderYAxisLabel} + snapTooltipToDatumX + snapTooltipToDatumY={false} + renderTooltip={renderTooltip} + onTooltipContext={onTooltipContext} + /> + )} + + ); + }} + + + + ) : ( + slotEmpty ?? null + )} + + {children} + + ); +}; + +const Styled: Record = {}; + +Styled.Container = styled.div` + ${layoutMixins.stack} + width: 0; + min-width: 100%; + height: 0; + min-height: 100%; + + background: var(--stickyArea-background); + + font-size: 0.75rem; + + transform-style: flat; + + cursor: crosshair; + user-select: none; + + text { + font-feature-settings: var(--fontFeature-monoNumbers); + fill: var(--color-text-0); + } + + @media (prefers-reduced-motion: no-preference) { + g[data-state='open'] { + animation: ${keyframes` + from { + opacity: 0; + } + `} 0.1s var(--ease-out-expo); + } + &:not(:hover) g[data-state] { + animation: ${keyframes` + to { + opacity: 0; + } + `} 0.2s 0.3s var(--ease-out-expo) forwards; + } + } +`; + +Styled.ParentSize = styled(ParentSize)` + min-height: 0; + display: grid; + + overflow: auto; + overscroll-behavior: contain; +`; + +Styled.YAxisBackground = styled.foreignObject` + background: var(--stickyArea-background); + + /* Safari */ + @supports (background: -webkit-named-image(i)) { + background: var(--stickyArea-background); + } +`; diff --git a/src/components/visx/TooltipContent.tsx b/src/components/visx/TooltipContent.tsx new file mode 100644 index 0000000..db3d108 --- /dev/null +++ b/src/components/visx/TooltipContent.tsx @@ -0,0 +1,66 @@ +import styled, { css, type AnyStyledComponent } from 'styled-components'; + +import { popoverMixins } from '@/styles/popoverMixins'; + +type ElementProps = { + children: React.ReactNode; +}; + +type StyleProps = { + accentColor?: string; +}; + +export const TooltipContent = ({ children, accentColor }: ElementProps & StyleProps) => ( + {children} +); + +const Styled: Record = {}; + +Styled.TooltipContent = styled.aside<{ accentColor?: string }>` + --accent-color: currentColor; + + ${({ accentColor }) => + accentColor && + css` + --accent-color: ${accentColor}; + `} + + ${popoverMixins.popover} + --popover-radius: 0.5rem; + --popover-background-color: hsl( + var(--layer-base-hue), + var(--layer-base-saturation), + calc(var(--layer-base-lightness)), + 0.9 + ); + --popover-backdrop-filter: saturate(120%) blur(12px); + + display: grid; + gap: 0.25rem; + overflow: hidden; + padding: 0.5rem 0.75rem; + + /* Safari */ + width: max-content; + + /* Firefox */ + dl { + margin: 0; + } + + &:before { + content: ''; + + position: absolute; + inset: 0; + width: 2px; + + background-color: var(--accent-color); + + transition: 0.2s; + } + + h4 { + line-height: 1.75; + } +`; diff --git a/src/components/visx/XYChartThreshold.tsx b/src/components/visx/XYChartThreshold.tsx new file mode 100644 index 0000000..c360b6e --- /dev/null +++ b/src/components/visx/XYChartThreshold.tsx @@ -0,0 +1,26 @@ +import { Threshold } from '@visx/threshold'; +import { DataContext } from '@visx/xychart'; +import { useContext } from 'react'; + +/** A visx that scales based on the nearest . Use inside . */ +export const XYChartThreshold = ({ + x, + y0, + y1, + ...props +}: Parameters>[0]) => { + const { xScale, yScale } = useContext(DataContext); + + return xScale && yScale ? ( + <> + + x={(datum, index, data) => xScale(typeof x === 'function' ? x(datum, index, data) : x) as number} + y0={(datum, index, data) => yScale(typeof y0 === 'function' ? y0(datum, index, data) : y0) as number} + y1={(datum, index, data) => yScale(typeof y1 === 'function' ? y1(datum, index, data) : y1) as number} + {...props} + /> + + ) : null; +}; + +export { Threshold }; diff --git a/src/components/visx/XYChartTooltipWithBounds.tsx b/src/components/visx/XYChartTooltipWithBounds.tsx new file mode 100644 index 0000000..c9633b2 --- /dev/null +++ b/src/components/visx/XYChartTooltipWithBounds.tsx @@ -0,0 +1,305 @@ +// Forked from original XYChart Tooltip to use TooltipWithBounds instead of TooltipInPortal: +// https://github.com/airbnb/visx/blob/master/packages/visx-xychart/src/components/Tooltip.tsx + +import React, { Fragment, useCallback, useContext, useEffect } from 'react'; + +import { TooltipWithBounds } from '@visx/tooltip'; +import type { TooltipProps as BaseTooltipProps } from '@visx/tooltip/lib/tooltips/Tooltip'; +import { PickD3Scale } from '@visx/scale'; +import { Group } from '@visx/group'; + +import { + TooltipContext, + DataContext, + type GlyphProps as RenderGlyphProps, + type TooltipContextType, +} from '@visx/xychart'; + +import { getScaleBandwidth } from './getScaleBandwidth'; +import { isValidNumber } from './isValidNumber'; + +export type RenderTooltipParams = TooltipContextType & { + colorScale?: PickD3Scale<'ordinal', string, string>; +}; + +export interface RenderTooltipGlyphProps extends RenderGlyphProps { + glyphStyle?: React.SVGProps; + isNearestDatum: boolean; +} + +export type TooltipProps = { + /** + * When TooltipContext.tooltipOpen=true, this function is invoked and if the + * return value is non-null, its content is rendered inside the tooltip container. + * Content will be rendered in an HTML parent. + */ + renderTooltip: (params: RenderTooltipParams) => React.ReactNode; + /** Function which handles rendering glyphs. */ + renderGlyph?: (params: RenderTooltipGlyphProps) => React.ReactNode; + + renderYAxisLabel?: (params: RenderTooltipParams) => React.ReactNode; + renderXAxisLabel?: (params: RenderTooltipParams) => React.ReactNode; + + /** Whether to snap tooltip x-coord to the nearest Datum x-coord instead of the event x-coord. */ + snapTooltipToDatumX?: boolean; + /** Whether to snap tooltip y-coord to the nearest Datum y-coord instead of the event y-coord. */ + snapTooltipToDatumY?: boolean; + /** Whether to show a vertical line at tooltip position. */ + showVerticalCrosshair?: boolean; + /** Whether to show a horizontal line at tooltip position. */ + showHorizontalCrosshair?: boolean; + /** Whether to snap crosshair x-coord to the nearest Datum x-coord instead of the event x-coord. */ + snapCrosshairToDatumX?: boolean; + /** Whether to snap crosshair y-coord to the nearest Datum y-coord instead of the event y-coord. */ + snapCrosshairToDatumY?: boolean; + /** Whether to show a glyph at the tooltip position for the (single) nearest Datum. */ + showDatumGlyph?: boolean; + /** Whether to show a glyph for the nearest Datum in each series. */ + showSeriesGlyphs?: boolean; + /** Optional styles for the vertical crosshair, if visible. */ + verticalCrosshairStyle?: React.SVGProps; + /** Optional styles for the vertical crosshair, if visible. */ + horizontalCrosshairStyle?: React.SVGProps; + /** Optional styles for the point, if visible. */ + glyphStyle?: React.SVGProps; +} & Omit & { + onTooltipContext?: (tooltipContext: TooltipContextType) => void; + }; + +function DefaultGlyph(props: RenderTooltipGlyphProps) { + const { theme } = useContext(DataContext) || {}; + + return ( + + ); +} + +function defaultRenderGlyph(props: RenderTooltipGlyphProps) { + return ; +} + +function TooltipInner({ + horizontalCrosshairStyle, + glyphStyle, + onTooltipContext, + renderTooltip, + renderYAxisLabel, + renderXAxisLabel, + renderGlyph = defaultRenderGlyph, + showDatumGlyph = false, + showHorizontalCrosshair = false, + showSeriesGlyphs = false, + showVerticalCrosshair = false, + snapTooltipToDatumX = false, + snapTooltipToDatumY = false, + snapCrosshairToDatumX = true, + snapCrosshairToDatumY = true, + verticalCrosshairStyle, + ...tooltipProps +}: TooltipProps) { + const { + colorScale, + theme, + innerHeight = 0, + innerWidth = 0, + margin = { + left: 0, + right: 0, + top: 0, + bottom: 0, + }, + xScale, + yScale, + dataRegistry, + } = useContext(DataContext) || {}; + + const tooltipContext = useContext(TooltipContext) as TooltipContextType; + + useEffect(() => { + onTooltipContext?.(tooltipContext); + }, [tooltipContext]); + + const tooltipContent = tooltipContext?.tooltipOpen + ? renderTooltip({ ...tooltipContext, colorScale }) + : null; + + const showTooltip = tooltipContext?.tooltipOpen && tooltipContent != null; + + let computedTooltipLeft = tooltipContext?.tooltipLeft || 0; + let computedTooltipTop = tooltipContext?.tooltipTop || 0; + let crosshairLeft = computedTooltipLeft; + let crosshairTop = computedTooltipTop; + + const xScaleBandwidth = xScale ? getScaleBandwidth(xScale) : 0; + const yScaleBandwidth = yScale ? getScaleBandwidth(yScale) : 0; + + const getDatumLeftTop = useCallback( + (key: string, datum: Datum) => { + const entry = dataRegistry?.get(key); + const xAccessor = entry?.xAccessor; + const yAccessor = entry?.yAccessor; + const left = + xScale && xAccessor + ? Number(xScale(xAccessor(datum))) + xScaleBandwidth / 2 ?? 0 + : undefined; + const top = + yScale && yAccessor + ? Number(yScale(yAccessor(datum))) + yScaleBandwidth / 2 ?? 0 + : undefined; + return { left, top }; + }, + [dataRegistry, xScaleBandwidth, yScaleBandwidth, xScale, yScale] + ); + + const nearestDatum = tooltipContext?.tooltipData?.nearestDatum; + const nearestDatumKey = nearestDatum?.key ?? ''; + + if (showTooltip && nearestDatum) { + const { left, top } = getDatumLeftTop(nearestDatumKey, nearestDatum.datum); + + // snap x- or y-coord to the actual data point (not event coordinates) + computedTooltipLeft = snapTooltipToDatumX && isValidNumber(left) ? left : computedTooltipLeft; + computedTooltipTop = snapTooltipToDatumY && isValidNumber(top) ? top : computedTooltipTop; + + crosshairLeft = snapCrosshairToDatumX && isValidNumber(left) ? left : crosshairLeft; + crosshairTop = snapCrosshairToDatumY && isValidNumber(top) ? top : crosshairTop; + } + + // collect positions + styles for glyphs; glyphs always snap to Datum, not event coords + const glyphProps: RenderTooltipGlyphProps[] = []; + + if (showTooltip && (showDatumGlyph || showSeriesGlyphs)) { + const size = Number(glyphStyle?.radius ?? 4); + + if (showSeriesGlyphs) { + Object.values(tooltipContext?.tooltipData?.datumByKey ?? {}).forEach( + ({ key, datum, index }) => { + const color = colorScale?.(key) ?? theme?.htmlLabel?.color ?? '#222'; + const { left, top } = getDatumLeftTop(key, datum); + + // don't show glyphs if coords are unavailable + if (!isValidNumber(left) || !isValidNumber(top)) return; + + glyphProps.push({ + key, + color, + datum, + index, + size, + x: left, + y: top, + glyphStyle, + isNearestDatum: nearestDatum ? nearestDatum.key === key : false, + }); + } + ); + } else if (nearestDatum) { + const { left, top } = getDatumLeftTop(nearestDatumKey, nearestDatum.datum); + // don't show glyphs if coords are unavailable + if (isValidNumber(left) && isValidNumber(top)) { + const color = + (nearestDatumKey && colorScale?.(nearestDatumKey)) ?? + null ?? + theme?.gridStyles?.stroke ?? + theme?.htmlLabel?.color ?? + '#222'; + glyphProps.push({ + key: nearestDatumKey, + color, + datum: nearestDatum.datum, + index: nearestDatum.index, + size, + x: left, + y: top, + glyphStyle, + isNearestDatum: true, + }); + } + } + } + + const yAxisLabelSide = + crosshairLeft < innerWidth / 2 + ? crosshairLeft < 120 + ? 'right' + : 'left' + : crosshairLeft > innerWidth - 120 + ? 'left' + : 'right'; + + return showTooltip ? ( + + {showVerticalCrosshair && ( + + )} + + {showHorizontalCrosshair && ( + + )} + + {nearestDatum && renderXAxisLabel && ( + + + {renderXAxisLabel?.({ ...tooltipContext, colorScale })} + + + )} + + {nearestDatum && renderYAxisLabel && ( + + + {renderYAxisLabel?.({ ...tooltipContext, colorScale })} + + + )} + + {glyphProps.map(({ x, y, ...props }, i) => ( + {renderGlyph({ x, y, ...props })} + ))} + + + + {tooltipContent} + + + + ) : null; +} + +/** + * This is a wrapper component which bails early if tooltip is not visible. + * If many charts with Tooltips are rendered on a page, + * this avoids creating many resize observers / hitting browser limits. + */ +export default function Tooltip(props: TooltipProps) { + return ; +} diff --git a/src/components/visx/XYChartWithPointerEvents.tsx b/src/components/visx/XYChartWithPointerEvents.tsx new file mode 100644 index 0000000..0928d6f --- /dev/null +++ b/src/components/visx/XYChartWithPointerEvents.tsx @@ -0,0 +1,46 @@ +import React, { useContext, useState } from 'react'; + +import { Point } from '@visx/point'; +import { localPoint } from '@visx/event'; +import { XYChart, DataContext } from '@visx/xychart'; +import { getScaleBandwidth } from '@/components/visx/getScaleBandwidth'; + +export const XYChartWithPointerEvents = ({ + onPointerMove, onPointerUp, onPointerPressedChange, ...props +}: { + onPointerMove?: (point: Point) => void; + onPointerUp?: (point: Point) => void; + onPointerPressedChange?: (isPointerPressed: boolean) => void; +} & React.PropsWithChildren>) => { + const { xScale, yScale } = useContext(DataContext); + + const [lastPointerMoveEvent, setLastPointerMoveEvent] = useState(); + + const pointerContainerPosition = lastPointerMoveEvent ? localPoint(lastPointerMoveEvent) : null; + + const pointerChartPosition = xScale && yScale && pointerContainerPosition && + new Point({ + x: xScale.invert(pointerContainerPosition?.x - getScaleBandwidth(xScale) / 2), + y: yScale.invert(pointerContainerPosition?.y - getScaleBandwidth(yScale) / 2), + }); + + return ( + { + setLastPointerMoveEvent(event as React.PointerEvent); + if (pointerChartPosition) + onPointerMove?.(pointerChartPosition); + }} + onPointerOut={() => setLastPointerMoveEvent(undefined)} + onPointerDown={() => onPointerPressedChange?.(true)} + onPointerUp={() => { + onPointerPressedChange?.(false); + if (pointerChartPosition) + onPointerUp?.(pointerChartPosition); + }} + > + {props.children} + + ); +}; diff --git a/src/components/visx/getScaleBandwidth.ts b/src/components/visx/getScaleBandwidth.ts new file mode 100644 index 0000000..700e234 --- /dev/null +++ b/src/components/visx/getScaleBandwidth.ts @@ -0,0 +1,9 @@ +// https://github.com/airbnb/visx/blob/master/packages/visx-xychart/src/typeguards/isValidNumber.ts + +import { AxisScale } from '@visx/axis'; + +export function getScaleBandwidth(scale?: Scale) { + // Broaden type before using 'xxx' in s as typeguard. + const s = scale as AxisScale; + return s && 'bandwidth' in s ? s?.bandwidth() ?? 0 : 0; +} diff --git a/src/components/visx/isValidNumber.ts b/src/components/visx/isValidNumber.ts new file mode 100644 index 0000000..5489bcd --- /dev/null +++ b/src/components/visx/isValidNumber.ts @@ -0,0 +1,5 @@ +// https://github.com/airbnb/visx/blob/master/packages/visx-xychart/src/typeguards/isValidNumber.ts + +export function isValidNumber(_: unknown): _ is number { + return _ != null && typeof _ === 'number' && !Number.isNaN(_) && Number.isFinite(_); +} diff --git a/src/constants/abacus.ts b/src/constants/abacus.ts new file mode 100644 index 0000000..55c0ad7 --- /dev/null +++ b/src/constants/abacus.ts @@ -0,0 +1,217 @@ +import Abacus, { kollections } from '@dydxprotocol/abacus'; +import { OrderSide } from '@dydxprotocol/v4-client'; +import { PositionSide } from './trade'; +import { STRING_KEYS } from './localization'; + +export type Nullable = T | null | undefined; + +// ------ V4 Protocols ------ // +export const IOImplementations = Abacus.exchange.dydx.abacus.utils.IOImplementations; +export const UIImplementations = Abacus.exchange.dydx.abacus.utils.UIImplementations; +export type AbacusDydxChainQueriesProtocol = Omit< + Abacus.exchange.dydx.abacus.protocols.DYDXChainQueriesProtocol, + '__doNotUseOrImplementIt' +>; +export type AbacusRestProtocol = Omit< + Abacus.exchange.dydx.abacus.protocols.RestProtocol, + '__doNotUseOrImplementIt' +>; +export type AbacusWebsocketProtocol = Omit< + Abacus.exchange.dydx.abacus.protocols.WebSocketProtocol, + '__doNotUseOrImplementIt' +>; +export type AbacusStateNotificationProtocol = Omit< + Abacus.exchange.dydx.abacus.protocols.StateNotificationProtocol, + '__doNotUseOrImplementIt' +>; +export type AbacusLocalizerProtocol = Omit< + Abacus.exchange.dydx.abacus.protocols.LocalizerProtocol, + '__doNotUseOrImplementIt' +>; +export type AbacusFormatterProtocol = Omit< + Abacus.exchange.dydx.abacus.protocols.FormatterProtocol, + '__doNotUseOrImplementIt' +>; +export type AbacusThreadingProtocol = Omit< + Abacus.exchange.dydx.abacus.protocols.ThreadingProtocol, + '__doNotUseOrImplementIt' +>; +export type ThreadingType = Abacus.exchange.dydx.abacus.protocols.ThreadingType; +export const CoroutineTimer = Abacus.exchange.dydx.abacus.utils.CoroutineTimer; + +// ------ Networking ------ // +export const QueryType = Abacus.exchange.dydx.abacus.protocols.QueryType; +const queryTypes = [...QueryType.values()] as const; +export type QueryTypes = (typeof queryTypes)[number]; + +export type NetworkConfig = { + chainId: string; + indexerUrl: string; + indexerSocketUrl: string; + validatorUrl: string; + faucetUrl?: string | null; +}; + +export type ConnectNetworkEvent = CustomEvent>; + +// ------ State ------ +export type AbacusApiState = Abacus.exchange.dydx.abacus.state.app.ApiState; +export const AbacusApiStatus = Abacus.exchange.dydx.abacus.state.app.ApiStatus; +const abacusApiStatuses = [...AbacusApiStatus.values()]; +export type AbacusApiStatuses = (typeof abacusApiStatuses)[number]; +export const Changes = Abacus.exchange.dydx.abacus.state.changes.Changes; +export type PerpetualStateChanges = Abacus.exchange.dydx.abacus.state.changes.StateChanges; +export const AsyncAbacusStateManager = + Abacus.exchange.dydx.abacus.state.manager.AsyncAbacusStateManager; +export type ParsingError = Abacus.exchange.dydx.abacus.responses.ParsingError; +export type ParsingErrors = kollections.List; + +// ------ Perpetuals/Markets ------ // +export type PerpetualState = Abacus.exchange.dydx.abacus.output.PerpetualState; +export type MarketCandles = Abacus.exchange.dydx.abacus.output.MarketCandles; +export type MarketOrderbook = Abacus.exchange.dydx.abacus.output.MarketOrderbook; +export type MarketPerpetual = Abacus.exchange.dydx.abacus.output.MarketPerpetual; +export type MarketStatus = Abacus.exchange.dydx.abacus.output.MarketStatus; +export type MarketTrade = Abacus.exchange.dydx.abacus.output.MarketTrade; +export type MarketTrades = kollections.List; +export type MarketsSummary = Partial; +export type OrderbookLine = Abacus.exchange.dydx.abacus.output.OrderbookLine; +export type PerpetualMarket = Abacus.exchange.dydx.abacus.output.PerpetualMarket; +export type MarketHistoricalFunding = Abacus.exchange.dydx.abacus.output.MarketHistoricalFunding; + +// ------ Configs ------ // +export type Configs = Abacus.exchange.dydx.abacus.output.Configs; +export type FeeDiscount = Abacus.exchange.dydx.abacus.output.FeeDiscount; +export type FeeDiscountResources = Abacus.exchange.dydx.abacus.output.FeeDiscountResources; +export type FeeTier = Abacus.exchange.dydx.abacus.output.FeeTier; +export type FeeTierResources = Abacus.exchange.dydx.abacus.output.FeeTierResources; +export type NetworkConfigs = Abacus.exchange.dydx.abacus.output.NetworkConfigs; + +// ------ Assets ------ // +export type Asset = Abacus.exchange.dydx.abacus.output.Asset; +export type AssetResources = Abacus.exchange.dydx.abacus.output.AssetResources; + +// ------ Inputs ------ // +export type Inputs = Abacus.exchange.dydx.abacus.output.input.Input; +export type TradeInputs = Abacus.exchange.dydx.abacus.output.input.TradeInput; +export type ClosePositionInputs = Abacus.exchange.dydx.abacus.output.input.ClosePositionInput; +export type TradeInputSummary = Abacus.exchange.dydx.abacus.output.input.TradeInputSummary; +export type TransferInputs = Abacus.exchange.dydx.abacus.output.input.TransferInput; +export type InputError = Abacus.exchange.dydx.abacus.output.input.ValidationError; +export const ErrorType = Abacus.exchange.dydx.abacus.output.input.ErrorType; + +// ------ Wallet ------ // +export type Wallet = Abacus.exchange.dydx.abacus.output.Wallet; +export type Subaccount = Abacus.exchange.dydx.abacus.output.Subaccount; +export type SubaccountPosition = Abacus.exchange.dydx.abacus.output.SubaccountPosition; +export type SubaccountOrder = Abacus.exchange.dydx.abacus.output.SubaccountOrder; +export type OrderStatus = Abacus.exchange.dydx.abacus.output.input.OrderStatus; +export const AbacusOrderStatus = Abacus.exchange.dydx.abacus.output.input.OrderStatus; +export type SubaccountFills = Abacus.exchange.dydx.abacus.output.SubaccountFill[]; +export type SubaccountFill = Abacus.exchange.dydx.abacus.output.SubaccountFill; +export type SubaccountFundingPayment = Abacus.exchange.dydx.abacus.output.SubaccountFundingPayment; +export type SubaccountFundingPayments = + Abacus.exchange.dydx.abacus.output.SubaccountFundingPayment[]; + +// ------ Historical PnL ------ // +export type SubAccountHistoricalPNL = Abacus.exchange.dydx.abacus.output.SubaccountHistoricalPNL; +export type SubAccountHistoricalPNLs = Abacus.exchange.dydx.abacus.output.SubaccountHistoricalPNL[]; +export const HistoricalPnlPeriod = Abacus.exchange.dydx.abacus.state.app.HistoricalPnlPeriod; +const historicalPnlPeriod = [...HistoricalPnlPeriod.values()] as const; +export type HistoricalPnlPeriods = (typeof historicalPnlPeriod)[number]; + +// ------ Transfer Items ------ // +export const TransferInputField = Abacus.exchange.dydx.abacus.state.modal.TransferInputField; +const transferInputFields = [...TransferInputField.values()] as const; +export type TransferInputFields = (typeof transferInputFields)[number]; + +export const TransferType = Abacus.exchange.dydx.abacus.output.input.TransferType; +const transferTypes = [...TransferType.values()] as const; +export type TransferTypes = (typeof transferTypes)[number]; + +// ------ Trade Items ------ // +export const TradeInputField = Abacus.exchange.dydx.abacus.state.modal.TradeInputField; +const tradeInputFields = [...TradeInputField.values()] as const; +export type TradeInputFields = (typeof tradeInputFields)[number]; + +export type TradeState = { + current?: Nullable; + postAllOrders?: Nullable; + postOrder?: Nullable; +}; + +export const ClosePositionInputField = + Abacus.exchange.dydx.abacus.state.modal.ClosePositionInputField; + +const closePositionInputFields = [...ClosePositionInputField.values()] as const; +export type ClosePositionInputFields = (typeof closePositionInputFields)[number]; + +export type ValidationError = Abacus.exchange.dydx.abacus.output.input.ValidationError; +export const TradeInputErrorAction = Abacus.exchange.dydx.abacus.output.input.ErrorAction; +export type AbacusOrderTypes = Abacus.exchange.dydx.abacus.output.input.OrderType; +export type AbacusOrderSides = Abacus.exchange.dydx.abacus.output.input.OrderSide; +export const AbacusOrderType = Abacus.exchange.dydx.abacus.output.input.OrderType; +export const AbacusOrderSide = Abacus.exchange.dydx.abacus.output.input.OrderSide; + +export const AbacusPositionSide = Abacus.exchange.dydx.abacus.output.PositionSide; +export type AbacusPositionSides = Abacus.exchange.dydx.abacus.output.PositionSide; + +export type SubaccountPlaceOrderPayload = + Abacus.exchange.dydx.abacus.state.app.V4SubaccountPlaceOrderPayload2; + +export type SubaccountCancelOrderPayload = + Abacus.exchange.dydx.abacus.state.app.V4SubaccountCancelOrderPayload2; + +export type HumanReadablePlaceOrderPayload = + Abacus.exchange.dydx.abacus.state.manager.HumanReadablePlaceOrderPayload; +export type HumanReadableCancelOrderPayload = + Abacus.exchange.dydx.abacus.state.manager.HumanReadableCancelOrderPayload; + +// ------ Helpers ------ // +export const AbacusHelper = Abacus.exchange.dydx.abacus.utils.AbacusHelper; + +export const RiskLevel = Abacus.exchange.dydx.abacus.utils.RiskLevel; +const riskLevels = [...RiskLevel.values()] as const; +export type RiskLevels = (typeof riskLevels)[number]; + +// ------ Enum Conversions ------ // +type IfEquals = (() => T extends X ? 1 : 2) extends () => T extends Y ? 1 : 2 + ? A + : B; + +type ReadonlyKeysOf = { + [K in keyof T]: IfEquals<{ [_ in K]: T[K] }, { readonly [_ in K]: T[K] }, K, never>; +}[keyof T]; + +type KotlinIrEnumValues = Exclude, 'Companion' | '$serializer'>; + +export const ORDER_SIDES: Record, OrderSide> = { + [AbacusOrderSide.buy.name]: OrderSide.BUY, + [AbacusOrderSide.sell.name]: OrderSide.SELL, +}; + +export const POSITION_SIDES: Record, PositionSide> = { + [AbacusPositionSide.LONG.name]: PositionSide.Long, + [AbacusPositionSide.SHORT.name]: PositionSide.Short, + [AbacusPositionSide.NONE.name]: PositionSide.None, +}; + +export const HISTORICAL_PNL_PERIODS: Record< + KotlinIrEnumValues, + HistoricalPnlPeriods +> = { + [HistoricalPnlPeriod.Period1d.name]: HistoricalPnlPeriod.Period1d, + [HistoricalPnlPeriod.Period7d.name]: HistoricalPnlPeriod.Period7d, + [HistoricalPnlPeriod.Period30d.name]: HistoricalPnlPeriod.Period30d, + [HistoricalPnlPeriod.Period90d.name]: HistoricalPnlPeriod.Period90d, +}; + +export const ORDER_STATUS_STRINGS: Record, string> = { + [AbacusOrderStatus.open.name]: STRING_KEYS.PLACED, + [AbacusOrderStatus.partiallyFilled.name]: STRING_KEYS.PARTIALLY_FILLED, + [AbacusOrderStatus.filled.name]: STRING_KEYS.FILLED, + [AbacusOrderStatus.cancelled.name]: STRING_KEYS.CANCELED, + [AbacusOrderStatus.canceling.name]: STRING_KEYS.CANCELING, + [AbacusOrderStatus.pending.name]: STRING_KEYS.PENDING, + [AbacusOrderStatus.untriggered.name]: STRING_KEYS.UNTRIGGERED, +}; diff --git a/src/constants/account.ts b/src/constants/account.ts new file mode 100644 index 0000000..a9441fc --- /dev/null +++ b/src/constants/account.ts @@ -0,0 +1,62 @@ +/** + * OnboardingSteps + * 1. Choose between 3 options + * a. Ethereum EOA (current) + * b. Keplr or Other Cosmos (future) + * c. Social (future) + * 2. Key derivation + * a. If wallet has no dYdX Chain transactions and not on whitelist, sign twice (future) + * i. Success + * ii. Signatures don't match error (Wallet is non-deterministic) + * b. Success + * 3. Post Registration items (Only on first onboarding) + * a. Acknowledge Terms + * b. DepositFunds + */ +export enum OnboardingSteps { + ChooseWallet = 'ChooseWallet', + KeyDerivation = 'KeyDerivation', + AcknowledgeTerms = 'AcknowledgeTerms', + DepositFunds = 'DepositFunds', +} + +/** + * @description The three main OnboardingStates, + * - Disconnected + * - WalletConnected + * - AccountConnected + */ +export enum OnboardingState { + Disconnected = 'Disconnected', + WalletConnected = 'WalletConnected', + AccountConnected = 'AccountConnected', +} + +/** + * @description Guards to determine what onboarding step a user should be on + * - hasAcknowledgedTerms + * - hasPreviousTransactions + */ +export enum OnboardingGuard { + hasAcknowledgedTerms = 'hasAcknowledgedTerms', + hasPreviousTransactions = 'hasPreviousTransactions', +} + +export enum EvmDerivedAccountStatus { + NotDerived, + Deriving, + EnsuringDeterminism, + Derived, +} + +import type { DydxAddress, EthereumAddress } from './wallets'; + +export type EvmDerivedAddresses = { + version?: string; + [EthereumAddress: EthereumAddress]: { + encryptedSignature?: string; + dydxAddress?: DydxAddress; + }; +} + +export const AMOUNT_RESERVED_FOR_GAS_USDC = 100_000; \ No newline at end of file diff --git a/src/constants/alerts.ts b/src/constants/alerts.ts new file mode 100644 index 0000000..f6ff882 --- /dev/null +++ b/src/constants/alerts.ts @@ -0,0 +1,6 @@ +export enum AlertType { + Error = 'Error', + Info = 'Info', + Success = 'Success', + Warning = 'Warning', +} diff --git a/src/constants/analytics.ts b/src/constants/analytics.ts new file mode 100644 index 0000000..9558c94 --- /dev/null +++ b/src/constants/analytics.ts @@ -0,0 +1,156 @@ +import type { SupportedLocales } from './localization'; +import type { DydxNetwork } from './networks'; +import type { OnboardingState, OnboardingSteps } from './account'; +import type { DydxAddress, WalletType, WalletConnectionType, EthereumAddress } from './wallets'; +import type { DialogTypes } from './dialogs'; +import type { TradeTypes } from './trade'; +import type { AbacusApiStatus, SubaccountPlaceOrderPayload } from './abacus'; + +// User properties +export enum AnalyticsUserProperty { + // Environment + Locale = 'selectedLocale', + Breakpoint = 'breakpoint', + + // Network + Network = 'network', + + // Wallet + WalletType = 'walletType', + WalletConnectionType = 'walletConnectionType', + WalletAddress = 'walletAddress', + + // Account + DydxAddress = 'dydxAddress', + SubaccountNumber = 'subaccountNumber', +} + +export type AnalyticsUserPropertyValue = + // Environment + T extends AnalyticsUserProperty.Breakpoint ? + | 'MOBILE' + | 'TABLET' + | 'DESKTOP_SMALL' + | 'DESKTOP_MEDIUM' + | 'DESKTOP_LARGE' + | 'UNSUPPORTED' + : T extends AnalyticsUserProperty.Locale ? + SupportedLocales + + // Network + : T extends AnalyticsUserProperty.Network ? + DydxNetwork + + // Wallet + : T extends AnalyticsUserProperty.WalletType ? + WalletType | undefined + : T extends AnalyticsUserProperty.WalletConnectionType ? + WalletConnectionType | undefined + : T extends AnalyticsUserProperty.WalletAddress ? + EthereumAddress | DydxAddress | undefined + + // Account + : T extends AnalyticsUserProperty.DydxAddress ? + DydxAddress | undefined + : T extends AnalyticsUserProperty.SubaccountNumber ? + number | undefined + + : undefined; + +// Events +export enum AnalyticsEvent { + // App + AppStart = 'AppStart', + NetworkStatus = 'NetworkStatus', + + // Navigation + NavigatePage = 'NavigatePage', + NavigateDialog = 'NavigateDialog', + NavigateDialogClose = 'NavigateDialogClose', + NavigateExternal = 'NavigateExternal', + + // Wallet + ConnectWallet = 'ConnectWallet', + DisconnectWallet = 'DisconnectWallet', + + // Onboarding + OnboardingStepChanged = 'OnboardingStepChanged', + OnboardingAccountDerived = 'OnboardingAccountDerived', + + // Transfers + TransferFaucet = 'TransferFaucet', + TransferDeposit = 'TransferDeposit', + TransferWithdraw = 'TransferWithdraw', + + // Trading + TradeOrderTypeSelected = 'TradeOrderTypeSelected', + TradePlaceOrder = 'TradePlaceOrder', +} + +export type AnalyticsEventData = + // App + T extends AnalyticsEvent.AppStart ? + {} + : T extends AnalyticsEvent.NetworkStatus ? + { + status: typeof AbacusApiStatus['name']; + } + + // Navigation + : T extends AnalyticsEvent.NavigatePage ? + { + path: string; + } + : T extends AnalyticsEvent.NavigateDialog ? + { + type: DialogTypes; + } + : T extends AnalyticsEvent.NavigateDialogClose ? + { + type: DialogTypes; + } + : T extends AnalyticsEvent.NavigateExternal ? + { + link: string; + } + + // Wallet + : T extends AnalyticsEvent.ConnectWallet ? + { + walletType: WalletType; + walletConnectionType: WalletConnectionType; + } + : T extends AnalyticsEvent.DisconnectWallet ? + {} + + // Onboarding + : T extends AnalyticsEvent.OnboardingStepChanged ? + { + state: OnboardingState; + step?: OnboardingSteps; + } + : T extends AnalyticsEvent.OnboardingAccountDerived ? + { + hasPreviousTransactions: boolean; + } + + // Transfers + : T extends AnalyticsEvent.TransferFaucet ? + {} + : T extends AnalyticsEvent.TransferDeposit ? + {} + : T extends AnalyticsEvent.TransferWithdraw ? + {} + + // Trading + : T extends AnalyticsEvent.TradeOrderTypeSelected ? + { + type: TradeTypes; + } + : T extends AnalyticsEvent.TradePlaceOrder ? + SubaccountPlaceOrderPayload & { + isClosePosition: boolean; + } + + : + {}; diff --git a/src/constants/buttons.ts b/src/constants/buttons.ts new file mode 100644 index 0000000..ea8fab1 --- /dev/null +++ b/src/constants/buttons.ts @@ -0,0 +1,38 @@ +export enum ButtonType { + Button = 'button', + Submit = 'submit', + Link = 'link', + Reset = 'reset', +} + +export enum ButtonSize { + XSmall = 'XSmall', + Small = 'Small', + Base = 'Base', + Medium = 'Medium', + Large = 'Large', + XLarge = 'XLarge', +} + +export enum ButtonShape { + Circle = 'Circle', + Pill = 'Pill', + Rectangle = 'Rectangle', + Square = 'Square', +} + +export enum ButtonAction { + Base = 'Base', + Primary = 'Primary', + Secondary = 'Secondary', + Create = 'Create', + Destroy = 'Destroy', + Navigation = 'Navigation', + Reset = 'Reset', +} + +export enum ButtonState { + Default = 'Default', + Disabled = 'Disabled', + Loading = 'Loading', +} diff --git a/src/constants/candles.ts b/src/constants/candles.ts new file mode 100644 index 0000000..5844754 --- /dev/null +++ b/src/constants/candles.ts @@ -0,0 +1,74 @@ +import { ResolutionString } from 'public/tradingview/charting_library'; +import { timeUnits } from './time'; + +export interface Candle { + startedAt: string; + ticker: string; + resolution: CandleResolution; + low: string; + high: string; + open: string; + close: string; + baseTokenVolume: string; + usdVolume: string; + trades: number; + startingOpenInterest: string; +} + +export interface TradingViewBar { + time: number; + low: number; + high: number; + open: number; + close: number; + volume: number; +} + +export interface TradingViewSymbol { + description: string; + exchange: string; + full_name: string; + symbol: string; + type: string; +} + +/** + * @description Resolution values used with Indexer API's Candles endpoints + */ +export enum CandleResolution { + ONE_MINUTE = '1MIN', + FIVE_MINUTES = '5MINS', + FIFTEEN_MINUTES = '15MINS', + THIRTY_MINUTES = '30MINS', + ONE_HOUR = '1HOUR', + FOUR_HOURS = '4HOURS', + ONE_DAY = '1DAY', +} + +/** + * @description ResolutionStrings used with TradingView's charting library mapped to CandleResolution + */ +export const RESOLUTION_MAP = { + '1': CandleResolution.ONE_MINUTE, + '5': CandleResolution.FIVE_MINUTES, + '15': CandleResolution.FIFTEEN_MINUTES, + '30': CandleResolution.THIRTY_MINUTES, + '60': CandleResolution.ONE_HOUR, + '240': CandleResolution.FOUR_HOURS, + '1D': CandleResolution.ONE_DAY, +} as Record; + +export const DEFAULT_RESOLUTION = '1D'; + +/** + * @description Chart Configs mapped to ResolutionStrings + */ +export const RESOLUTION_CHART_CONFIGS = { + '1': { defaultRange: timeUnits.hour }, + '5': { defaultRange: 5 * timeUnits.hour }, + '15': { defaultRange: 15 * timeUnits.hour }, + '30': { defaultRange: 30 * timeUnits.hour }, + '60': { defaultRange: 3 * timeUnits.day }, + '240': { defaultRange: 12 * timeUnits.day }, + '1D': { defaultRange: 2 * timeUnits.month }, +} as Record; diff --git a/src/constants/dialogs.ts b/src/constants/dialogs.ts new file mode 100644 index 0000000..5655452 --- /dev/null +++ b/src/constants/dialogs.ts @@ -0,0 +1,19 @@ +export enum DialogTypes { + ClosePosition = 'ClosePosition', + Deposit = 'Deposit', + DisconnectWallet = 'DisconnectWallet', + ExchangeOffline = 'ExchangeOffline', + FillDetails = 'FillDetails', + Help = 'Help', + MnemonicExport = 'MnemonicExport', + MobileSignIn = 'MobileSignIn', + Onboarding = 'Onboarding', + OrderDetails = 'OrderDetails', + Receive = 'Receive', + Trade = 'Trade', + Transfer = 'Transfer', +} + +export enum TradeBoxDialogTypes { + ClosePosition = 'ClosePosition', +} diff --git a/src/constants/layout.ts b/src/constants/layout.ts new file mode 100644 index 0000000..925bedc --- /dev/null +++ b/src/constants/layout.ts @@ -0,0 +1,5 @@ +export enum TradeLayouts { + Default = 'Default', + Reverse = 'Reverse', + Alternative = 'Alternative', +} diff --git a/src/constants/localStorage.ts b/src/constants/localStorage.ts new file mode 100644 index 0000000..919900e --- /dev/null +++ b/src/constants/localStorage.ts @@ -0,0 +1,28 @@ +export enum LocalStorageKey { + // Onboarding / Accounts + EvmAddress = 'dydx.EvmAddress', + DydxAddress = 'dydx.DydxAddress', + OnboardingSelectedWalletType = 'dydx.OnboardingSelectedWalletType', + WalletConnectionType = 'dydx.WalletConnectionType', + OnboardingHasAcknowledgedTerms = 'dydx.OnboardingHasAcknowledgedTerms', + EvmDerivedAddresses = 'dydx.EvmDerivedAddresses', + + // Notifications + Notifications = 'dydx.Notifications', + NotificationsLastUpdated = 'dydx.NotificationsLastUpdated', + PushNotificationsEnabled = 'dydx.PushNotificationsEnabled', + PushNotificationsLastUpdated = 'dydx.PushNotificationsLastUpdated', + + // UI State + LastViewedMarket = 'dydx.LastViewedMarket', + SelectedLocale = 'dydx.SelectedLocale', + SelectedNetwork = 'dydx.SelectedNetwork', + SelectedTheme = 'dydx.SelectedTheme', + SelectedTradeLayout = 'dydx.SelectedTradeLayout', + TradingViewChartConfig = 'dydx.TradingViewChartConfig', +} + +export const LOCAL_STORAGE_VERSIONS = { + [LocalStorageKey.EvmDerivedAddresses]: 'v1', + // TODO: version all localStorage keys +}; diff --git a/src/constants/localization/app.ts b/src/constants/localization/app.ts new file mode 100644 index 0000000..93914c9 --- /dev/null +++ b/src/constants/localization/app.ts @@ -0,0 +1,1195 @@ +export const APP_STRING_KEYS = { + // General + _24H: 'GENERAL.TIME_STRINGS._24H', + _30D: 'GENERAL.TIME_STRINGS._30D', + ALL_TIME: 'GENERAL.TIME_STRINGS.ALL_TIME', + DAYS_ABBREVIATED: 'GENERAL.TIME_STRINGS.DAYS_ABBREVIATED', + DAYS: 'GENERAL.TIME_STRINGS.DAYS', + HOURS_ABBREVIATED: 'GENERAL.TIME_STRINGS.HOURS_ABBREVIATED', + HOURS: 'GENERAL.TIME_STRINGS.HOURS', + LAST_24H: 'GENERAL.TIME_STRINGS.LAST_24H', + LAST_WEEK: 'GENERAL.TIME_STRINGS.LAST_WEEK', + MINUTES_ABBREVIATED: 'GENERAL.TIME_STRINGS.MINUTES_ABBREVIATED', + MINUTES_SHORT: 'GENERAL.TIME_STRINGS.MINUTES_SHORT', + MONTHS_ABBREVIATED: 'GENERAL.TIME_STRINGS.MONTHS_ABBREVIATED', + PAST_30D: 'GENERAL.TIME_STRINGS.PAST_30D', + PAST_HOUR: 'GENERAL.TIME_STRINGS.PAST_HOUR', + PAST_MONTH: 'GENERAL.TIME_STRINGS.PAST_MONTH', + PAST_THREE_MONTHS: 'GENERAL.TIME_STRINGS.PAST_THREE_MONTHS', + PAST_WEEK: 'GENERAL.TIME_STRINGS.PAST_WEEK', + THIS_WEEK: 'GENERAL.TIME_STRINGS.THIS_WEEK', + TODAY: 'GENERAL.TIME_STRINGS.TODAY', + WEEK: 'GENERAL.TIME_STRINGS.WEEK', + WEEKS_ABBREVIATED: 'GENERAL.TIME_STRINGS.WEEKS_ABBREVIATED', + WEEKS: 'GENERAL.TIME_STRINGS.WEEKS', + + ABOUT: 'GENERAL.ABOUT', + ACCOUNT_LEVERAGE: 'GENERAL.ACCOUNT_LEVERAGE', + ACCOUNT: 'GENERAL.ACCOUNT', + ACTION: 'GENERAL.ACTION', + ADDITIONAL_CONDITION: 'GENERAL.ADDITIONAL_CONDITION', + ADVANCED: 'GENERAL.ADVANCED', + ALERTS: 'GENERAL.ALERTS', + ALL_MARKETS: 'GENERAL.ALL_MARKETS', + ALL: 'GENERAL.ALL', + AMOUNT: 'GENERAL.AMOUNT', + ANONYMOUS: 'GENERAL.ANONYMOUS', + ARE_UNCHANGED: 'GENERAL.ARE_UNCHANGED', + ARE_YOU_SURE: 'GENERAL.ARE_YOU_SURE', + ASSET: 'GENERAL.ASSET', + ASSET_BALANCE: 'GENERAL.ASSET_BALANCE', + AVAILABLE: 'GENERAL.AVAILABLE', + BACK: 'GENERAL.BACK', + BALANCE: 'GENERAL.BALANCE', + BLOCK_HEIGHT: 'GENERAL.BLOCK_HEIGHT', + BUY: 'GENERAL.BUY', + BUYING_POWER: 'GENERAL.BUYING_POWER', + CANCEL: 'GENERAL.CANCEL', + CANCELED: 'GENERAL.CANCELED', + CARDS: 'GENERAL.CARDS', + CATEGORY: 'GENERAL.CATEGORY', + CHAINS: 'GENERAL.CHAINS', + CLEAR: 'GENERAL.CLEAR', + CLOSE: 'GENERAL.CLOSE', + COMING_SOON: 'GENERAL.COMING_SOON', + COMPETITION: 'GENERAL.COMPETITION', + COMPETITIONS: 'GENERAL.COMPETITIONS', + CONFIRM_DEPOSIT: 'GENERAL.CONFIRM_DEPOSIT', + CONFIRM_WITHDRAW: 'GENERAL.CONFIRM_WITHDRAW', + CONFIRMED: 'GENERAL.CONFIRMED', + CONNECT_WALLET: 'GENERAL.CONNECT_WALLET', + CONNECT: 'GENERAL.CONNECT', + CONNECTED: 'GENERAL.CONNECTED', + CONNECTED_TO: 'GENERAL.CONNECTED_TO', + COPIED: 'GENERAL.COPIED', + COPY: 'GENERAL.COPY', + CREATED_AT: 'GENERAL.CREATED_AT', + CURRENT: 'GENERAL.CURRENT', + CUSTOM: 'GENERAL.CUSTOM', + DAILY: 'GENERAL.DAILY', + DECREASED: 'GENERAL.DECREASED', + DECREASING: 'GENERAL.DECREASING', + DEFAULT: 'GENERAL.DEFAULT', + DEFI: 'GENERAL.DEFI', + DEGRADED: 'GENERAL.DEGRADED', + DEPOSIT_FUNDS: 'GENERAL.DEPOSIT_FUNDS', + DEPOSIT: 'GENERAL.DEPOSIT', + DEPOSIT_MORE: 'GENERAL.DEPOSIT_MORE', + DEPOSIT_WITH_FIAT: 'GENERAL.DEPOSIT_WITH_FIAT', + DEPTH_CHART_SHORT: 'GENERAL.DEPTH_CHART_SHORT', + DETAILED_VIEW: 'GENERAL.DETAILED_VIEW', + DETAILS: 'GENERAL.DETAILS', + DIRECTION: 'GENERAL.DIRECTION', + DISCOUNT: 'GENERAL.DISCOUNT', + DISMISS: 'GENERAL.DISMISS', + DONE: 'GENERAL.DONE', + DYDX_CHAIN_ADDRESS: 'GENERAL.DYDX_CHAIN_ADDRESS', + EMAIL: 'GENERAL.EMAIL', + ENDED: 'GENERAL.ENDED', + EQUITY: 'GENERAL.EQUITY', + EXPAND_SECTION: 'GENERAL.EXPAND_SECTION', + EXPAND: 'GENERAL.EXPAND', + FAVORITES: 'GENERAL.FAVORITES', + FAST_WITHDRAW: 'GENERAL.FAST_WITHDRAW', + FEES_30D: 'GENERAL.FEES_30D', + FEES_PAID: 'GENERAL.FEES_PAID', + FEES: 'GENERAL.FEES', + FIAT: 'GENERAL.FIAT', + FILL: 'GENERAL.FILL', + FILLS: 'GENERAL.FILLS', + FORCE_WITHDRAW_DESCRIPTION: 'GENERAL.FORCE_WITHDRAW_DESCRIPTION', + FREE: 'GENERAL.FREE', + FREE_COLLATERAL: 'GENERAL.FREE_COLLATERAL', + FUNDING_RATE_CHART_SHORT: 'GENERAL.FUNDING_RATE_CHART_SHORT', + GASLESS_DEPOSITS: 'GENERAL.GASLESS_DEPOSITS', + GENERAL: 'GENERAL.GENERAL', + GO_BACK: 'GENERAL.GO_BACK', + GO_TO_MARKET: 'GENERAL.GO_TO_MARKET', + GOVERNANCE: 'GENERAL.GOVERNANCE', + HEDGIES: 'GENERAL.HEDGIES', + HIDE_SECTION: 'GENERAL.HIDE_SECTION', + HIDE: 'GENERAL.HIDE', + HISTORY: 'GENERAL.HISTORY', + INCREASED: 'GENERAL.INCREASED', + INCREASING: 'GENERAL.INCREASING', + INITIAL_MARGIN_FRACTION: 'GENERAL.INITIAL_MARGIN_FRACTION', + KEEP_TRADING: 'GENERAL.KEEP_TRADING', + LANGUAGE: 'GENERAL.LANGUAGE', + LAYER_1: 'GENERAL.LAYER_1', + LEARN_MORE: 'GENERAL.LEARN_MORE', + LEGACY: 'GENERAL.LEGACY', + LEVERAGE: 'GENERAL.LEVERAGE', + LIVE: 'GENERAL.LIVE', + LONG_POSITION_SHORT: 'GENERAL.LONG_POSITION_SHORT', + MAINTENANCE_MARGIN_FRACTION: 'GENERAL.MAINTENANCE_MARGIN_FRACTION', + MAKE_ONE_TRADE: 'GENERAL.MAKE_ONE_TRADE', + MANAGE_FUNDS: 'GENERAL.MANAGE_FUNDS', + MARGIN_USAGE: 'GENERAL.MARGIN_USAGE', + MARGIN: 'GENERAL.MARGIN', + MARKET_NAME: 'GENERAL.MARKET_NAME', + MARKET_SEARCH_DOES_NOT_EXIST_YET: 'GENERAL.MARKET_SEARCH_DOES_NOT_EXIST_YET', + MARKET_SEARCH_PLACEHOLDER: 'GENERAL.MARKET_SEARCH_PLACEHOLDER', + MARKET: 'GENERAL.MARKET', + MARKETS: 'GENERAL.MARKETS', + MAX_WITHDRAW: 'GENERAL.MAX_WITHDRAW', + MAX: 'GENERAL.MAX', + MAXIMUM_LEVERAGE: 'GENERAL.MAXIMUM_LEVERAGE', + MENU: 'GENERAL.MENU', + METRICS: 'GENERAL.METRICS', + MINIMUM_ORDER_SIZE: 'GENERAL.MINIMUM_ORDER_SIZE', + MODIFY: 'GENERAL.MODIFY', + NET_LOSS: 'GENERAL.NET_LOSS', + NET_PROFIT: 'GENERAL.NET_PROFIT', + NET_TRANSFERS: 'GENERAL.NET_TRANSFERS', + NET_ZERO: 'GENERAL.NET_PROFIT', + NETWORK: 'GENERAL.NETWORK', + NEW: 'GENERAL.NEW', + NONE: 'GENERAL.NONE', + OPERATIONAL: 'GENERAL.OPERATIONAL', + OPTIONAL: 'GENERAL.OPTIONAL', + OR: 'GENERAL.OR', + ORDERS: 'GENERAL.ORDERS', + OTHER_DETAILS: 'GENERAL.OTHER_DETAILS', + OTHER: 'GENERAL.OTHER', + OVERVIEW: 'GENERAL.OVERVIEW', + PASTE: 'GENERAL.PASTE', + PENDING: 'GENERAL.PENDING', + PNL: 'GENERAL.PNL', + PENDING_REWARDS: 'GENERAL.PENDING_REWARDS', + PERPETUALS_UNAVAILABLE_IN_US: 'GENERAL.PERPETUALS_UNAVAILABLE_IN_US', + PERPETUALS: 'GENERAL.PERPETUALS', + POSITION: 'GENERAL.POSITION', + POWERED_BY: 'GENERAL.POWERED_BY', + PROFILE: 'GENERAL.PROFILE', + PROFIT_AND_LOSS_ABSOLUTE: 'GENERAL.PROFIT_AND_LOSS_ABSOLUTE', + PROFIT_AND_LOSS_ABSOLUTE_BY: 'GENERAL.PROFIT_AND_LOSS_ABSOLUTE_BY', + PROFIT_AND_LOSS_ABSOLUTE_LABEL: 'GENERAL.PROFIT_AND_LOSS_ABSOLUTE_LABEL', + PROFIT_AND_LOSS_PERCENT: 'GENERAL.PROFIT_AND_LOSS_PERCENT', + PROFIT_AND_LOSS_PERCENT_BY: 'GENERAL.PROFIT_AND_LOSS_PERCENT_BY', + PROFIT_AND_LOSS_PERCENT_LABEL: 'GENERAL.PROFIT_AND_LOSS_PERCENT_LABEL', + PRICE_CHART_SHORT: 'GENERAL.PRICE_CHART_SHORT', + PRICE: 'GENERAL.PRICE', + PRIVACY: 'GENERAL.PRIVACY', + PROMOTION: 'GENERAL.PROMOTION', + QUEUED: 'GENERAL.QUEUED', + QUERY_NOT_FOUND: 'GENERAL.QUERY_NOT_FOUND', + RANKINGS: 'GENERAL.RANKINGS', + RECEIVE: 'GENERAL.RECEIVE', + RECENT: 'GENERAL.RECENT', + RECENT_TRADES_SHORT: 'GENERAL.RECENT_TRADES_SHORT', + REFERRAL_CODE: 'GENERAL.REFERRAL_CODE', + REFERRALS: 'GENERAL.REFERRALS', + REFERRER_PERCENT_OFF: 'GENERAL.REFERRER_PERCENT_OFF', + RESULTS: 'GENERAL.RESULTS', + REWARDS: 'GENERAL.REWARDS', + SAVE: 'GENERAL.SAVE', + SAVED: 'GENERAL.SAVED', + SELECT_LANGUAGE: 'GENERAL.SELECT_LANGUAGE', + SELECT_NETWORK: 'GENERAL.SELECT_NETWORK', + SELL: 'GENERAL.SELL', + SEND: 'GENERAL.SEND', + SHARE: 'GENERAL.SHARE', + SHORT_POSITION_SHORT: 'GENERAL.SHORT_POSITION_SHORT', + SIDE: 'GENERAL.SIDE', + SIGN_OUT: 'GENERAL.SIGN_OUT', + SIZE: 'GENERAL.SIZE', + SLOW_WITHDRAW: 'GENERAL.SLOW_WITHDRAW', + SORT_BY: 'GENERAL.SORT_BY', + SOURCE_ADDRESS: 'GENERAL.SOURCE_ADDRESS', + STAKED: 'GENERAL.STAKED', + START_TRADING: 'GENERAL.START_TRADING', + STATISTICS: 'GENERAL.STATISTICS', + STATUS: 'GENERAL.STATUS', + STEP_SIZE: 'GENERAL.STEP_SIZE', + STOP_ORDER_SHORT: 'GENERAL.STOP_ORDER_SHORT', + SWITCH_LEADERBOARD: 'GENERAL.SWITCH_LEADERBOARD', + TAKE_ME_THERE: 'GENERAL.TAKE_ME_THERE', + TICK_SIZE: 'GENERAL.TICK_SIZE', + TIER: 'GENERAL.TIER', + TIME: 'GENERAL.TIME', + TIMESTAMP_ERROR: 'GENERAL.TIMESTAMP_ERROR', + TOTAL_VALUE: 'GENERAL.TOTAL_VALUE', + TRADE_AN_AMOUNT: 'GENERAL.TRADE_AN_AMOUNT', + TRADE: 'GENERAL.TRADE', + TRADER: 'GENERAL.TRADER', + TRADING: 'GENERAL.TRADING', + TRADING_FEE_REDUCTION: 'GENERAL.TRADING_FEE_REDUCTION', + TRADING_FEE_REDUCTION_DESCRIPTION_2: 'GENERAL.TRADING_FEE_REDUCTION_DESCRIPTION_2', + TRADING_REWARDS: 'GENERAL.TRADING_REWARDS', + TRAILING_STOP_SHORT: 'GENERAL.TRAILING_STOP_SHORT', + TRANSFER: 'GENERAL.TRANSFER', + TRANSFER_IN: 'GENERAL.TRANSFER_IN', + TRANSFER_OUT: 'GENERAL.TRANSFER_OUT', + TRANSFERS: 'GENERAL.TRANSFERS', + TUTORIALS: 'GENERAL.TUTORIALS', + TYPE: 'GENERAL.TYPE', + UNAVAILABLE: 'GENERAL.UNAVAILABLE', + UNCONFIRMED: 'GENERAL.UNCONFIRMED', + UNKNOWN_ERROR: 'GENERAL.UNKNOWN_ERROR', + UNKNOWN: 'GENERAL.UNKNOWN', + USERNAME: 'GENERAL.USERNAME', + VIEW: 'GENERAL.VIEW', + VIEW_DETAILS: 'GENERAL.VIEW_DETAILS', + VIEW_LEAGUE: 'GENERAL.VIEW_LEAGUE', + VIEW_OPTIONS: 'GENERAL.VIEW_OPTIONS', + VIEWS: 'GENERAL.VIEWS', + VOLUME_30D: 'GENERAL.VOLUME_30D', + WALLET_BALANCE: 'GENERAL.WALLET_BALANCE', + WALLET: 'GENERAL.WALLET', + WEBSITE: 'GENERAL.WEBSITE', + WHITEPAPER: 'GENERAL.WHITEPAPER', + WITHDRAW: 'GENERAL.WITHDRAW', + YOU: 'GENERAL.YOU', + + // Asset Descriptions + '0X_PRIMARY_DESCRIPTION': 'ASSET_DESCRIPTIONS.0X_PRIMARY_DESCRIPTION', + '0X_SECONDARY_DESCRIPTION': 'ASSET_DESCRIPTIONS.0X_SECONDARY_DESCRIPTION', + '1INCH_PRIMARY_DESCRIPTION': 'ASSET_DESCRIPTIONS.1INCH_PRIMARY_DESCRIPTION', + '1INCH_SECONDARY_DESCRIPTION': 'ASSET_DESCRIPTIONS.1INCH_SECONDARY_DESCRIPTION', + AAVE_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.AAVE_PRIMARY_DESCRIPTION', + AAVE_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.AAVE_SECONDARY_DESCRIPTION', + ALGORAND_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.ALGORAND_PRIMARY_DESCRIPTION', + ALGORAND_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.ALGORAND_SECONDARY_DESCRIPTION', + AVAX_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.AVAX_PRIMARY_DESCRIPTION', + AVAX_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.AVAX_SECONDARY_DESCRIPTION', + BITCOIN_CASH_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.BITCOIN_CASH_PRIMARY_DESCRIPTION', + BITCOIN_CASH_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.BITCOIN_CASH_SECONDARY_DESCRIPTION', + BITCOIN_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.BITCOIN_PRIMARY_DESCRIPTION', + BITCOIN_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.BITCOIN_SECONDARY_DESCRIPTION', + CARDANO_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.CARDANO_PRIMARY_DESCRIPTION', + CARDANO_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.CARDANO_SECONDARY_DESCRIPTION', + CELO_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.CELO_PRIMARY_DESCRIPTION', + CELO_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.CELO_SECONDARY_DESCRIPTION', + CHAINLINK_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.CHAINLINK_PRIMARY_DESCRIPTION', + CHAINLINK_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.CHAINLINK_SECONDARY_DESCRIPTION', + COMPOUND_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.COMPOUND_PRIMARY_DESCRIPTION', + COMPOUND_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.COMPOUND_SECONDARY_DESCRIPTION', + COSMOS_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.COSMOS_PRIMARY_DESCRIPTION', + COSMOS_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.COSMOS_SECONDARY_DESCRIPTION', + CURVE_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.CURVE_PRIMARY_DESCRIPTION', + CURVE_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.CURVE_SECONDARY_DESCRIPTION', + DOGECOIN_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.DOGECOIN_PRIMARY_DESCRIPTION', + DOGECOIN_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.DOGECOIN_SECONDARY_DESCRIPTION', + ENJ_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.ENJ_PRIMARY_DESCRIPTION', + ENJ_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.ENJ_SECONDARY_DESCRIPTION', + EOS_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.EOS_PRIMARY_DESCRIPTION', + EOS_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.EOS_SECONDARY_DESCRIPTION', + ETC_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.ETC_PRIMARY_DESCRIPTION', + ETC_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.ETC_SECONDARY_DESCRIPTION', + ETHEREUM_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.ETHEREUM_PRIMARY_DESCRIPTION', + ETHEREUM_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.ETHEREUM_SECONDARY_DESCRIPTION', + FILECOIN_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.FILECOIN_PRIMARY_DESCRIPTION', + FILECOIN_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.FILECOIN_SECONDARY_DESCRIPTION', + ICP_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.ICP_PRIMARY_DESCRIPTION', + ICP_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.ICP_SECONDARY_DESCRIPTION', + LITECOIN_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.LITECOIN_PRIMARY_DESCRIPTION', + LITECOIN_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.LITECOIN_SECONDARY_DESCRIPTION', + LUNA_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.LUNA_PRIMARY_DESCRIPTION', + LUNA_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.LUNA_SECONDARY_DESCRIPTION', + MAKER_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.MAKER_PRIMARY_DESCRIPTION', + MAKER_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.MAKER_SECONDARY_DESCRIPTION', + MONERO_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.MONERO_PRIMARY_DESCRIPTION', + MONERO_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.MONERO_SECONDARY_DESCRIPTION', + NEAR_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.NEAR_PRIMARY_DESCRIPTION', + NEAR_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.NEAR_SECONDARY_DESCRIPTION', + POLKADOT_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.POLKADOT_PRIMARY_DESCRIPTION', + POLKADOT_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.POLKADOT_SECONDARY_DESCRIPTION', + POLYGON_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.POLYGON_PRIMARY_DESCRIPTION', + POLYGON_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.POLYGON_SECONDARY_DESCRIPTION', + RUNE_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.RUNE_PRIMARY_DESCRIPTION', + RUNE_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.RUNE_SECONDARY_DESCRIPTION', + SOLANA_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.SOLANA_PRIMARY_DESCRIPTION', + SOLANA_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.SOLANA_SECONDARY_DESCRIPTION', + SUSHISWAP_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.SUSHISWAP_PRIMARY_DESCRIPTION', + SUSHISWAP_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.SUSHISWAP_SECONDARY_DESCRIPTION', + STELLAR_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.STELLAR_PRIMARY_DESCRIPTION', + STELLAR_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.STELLAR_SECONDARY_DESCRIPTION', + SYNTHETIX_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.SYNTHETIX_PRIMARY_DESCRIPTION', + SYNTHETIX_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.SYNTHETIX_SECONDARY_DESCRIPTION', + TRX_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.TRX_PRIMARY_DESCRIPTION', + TRX_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.TRX_SECONDARY_DESCRIPTION', + UMA_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.UMA_PRIMARY_DESCRIPTION', + UMA_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.UMA_SECONDARY_DESCRIPTION', + UNISWAP_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.UNISWAP_PRIMARY_DESCRIPTION', + UNISWAP_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.UNISWAP_SECONDARY_DESCRIPTION', + XTZ_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.XTZ_PRIMARY_DESCRIPTION', + XTZ_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.XTZ_SECONDARY_DESCRIPTION', + YEARN_FINANCE_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.YEARN_FINANCE_PRIMARY_DESCRIPTION', + YEARN_FINANCE_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.YEARN_FINANCE_SECONDARY_DESCRIPTION', + ZCASH_PRIMARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.ZCASH_PRIMARY_DESCRIPTION', + ZCASH_SECONDARY_DESCRIPTION: 'ASSET_DESCRIPTIONS.ZCASH_SECONDARY_DESCRIPTION', + + // Header + API_DOCUMENTATION: 'HEADER.API_DOCUMENTATION', + CHAT: 'HEADER.CHAT', + COMMUNITY: 'HEADER.COMMUNITY', + COMPATIBILITY: 'HEADER.COMPATIBILITY', + COMPETITION_TERMS: 'HEADER.COMPETITION_TERMS', + COPY_ADDRESS: 'HEADER.COPY_ADDRESS', + DISCONNECT: 'HEADER.DISCONNECT', + DOCUMENTATION: 'HEADER.DOCUMENTATION', + EXCHANGE_METRICS: 'HEADER.EXCHANGE_METRICS', + EXCHANGE_STATUS: 'HEADER.EXCHANGE_STATUS', + FEEDBACK: 'HEADER.FEEDBACK', + GASLESS_DEPOSIT_RULES: 'HEADER.GASLESS_DEPOSIT_RULES', + HELP: 'HEADER.HELP', + HELP_CENTER: 'HEADER.HELP_CENTER', + HELP_CHAT: 'HEADER.HELP_CHAT', + LEAGUE_RULES: 'HEADER.LEAGUE_RULES', + MAINNET: 'HEADER.MAINNET', + MINTSCAN: 'HEADER.MINTSCAN', + MORE: 'HEADER.MORE', + NOTIFICATIONS: 'HEADER.NOTIFICATIONS', + OFF: 'HEADER.OFF', + ON: 'HEADER.ON', + OPEN_IN_ETHERSCAN: 'HEADER.OPEN_IN_ETHERSCAN', + TERMS_OF_USE: 'HEADER.TERMS_OF_USE', + TESTNET: 'HEADER.TESTNET', + + // Wallets + BITKEEP: 'WALLETS.BITKEEP', + BITPIE: 'WALLETS.BITPIE', + CLOVER_WALLET: 'WALLETS.CLOVER_WALLET', + COINBASE_WALLET: 'WALLETS.COINBASE_WALLET', + COIN98: 'WALLETS.COIN98', + HUOBI_WALLET: 'WALLETS.HUOBI_WALLET', + IMTOKEN: 'WALLETS.IMTOKEN', + KEPLR: 'WALLETS.KEPLR', + LEDGER: 'WALLETS.LEDGER', + MATH_WALLET: 'WALLETS.MATH_WALLET', + METAMASK: 'WALLETS.METAMASK', + RAINBOW_WALLET: 'WALLETS.RAINBOW_WALLET', + TOKEN_POCKET: 'WALLETS.TOKEN_POCKET', + TRUST_WALLET: 'WALLETS.TRUST_WALLET', + WALLETCONNECT: 'WALLETS.WALLETCONNECT', + WALLETCONNECT_2: 'WALLETS.WALLETCONNECT_2', + TEST_WALLET: 'WALLETS.TEST_WALLET', + OTHER_WALLET: 'WALLETS.OTHER_WALLET', + + // Onboarding + ABOUT_WALLETS: 'ONBOARDING.ABOUT_WALLETS', + ACKNOWLEDGE_TERMS: 'ONBOARDING.ACKNOWLEDGE_TERMS', + API_KEYS_NOT_FOUND: 'ONBOARDING.API_KEYS_NOT_FOUND', + APPEARS_OUTSIDE_ACCESS: 'ONBOARDING.APPEARS_OUTSIDE_ACCESS', + CHECK_WALLET_FOR_REQUEST: 'ONBOARDING.CHECK_WALLET_FOR_REQUEST', + COMPLETE_ONBOARDING: 'ONBOARDING.COMPLETE_ONBOARDING', + CONFIRM_OWNERSHIP: 'ONBOARDING.CONFIRM_OWNERSHIP', + CONNECT_YOUR_WALLET_EXTENDED: 'ONBOARDING.CONNECT_YOUR_WALLET_EXTENDED', + CONNECT_YOUR_WALLET_SEARCH: 'ONBOARDING.CONNECT_YOUR_WALLET_SEARCH', + CONNECT_YOUR_WALLET: 'ONBOARDING.CONNECT_YOUR_WALLET', + CONNECTING: 'ONBOARDING.CONNECTING', + CONNECTING_SUBTITLE: 'ONBOARDING.CONNECTING_SUBTITLE', + COULD_NOT_FIND_AFFILIATE: 'ONBOARDING.COULD_NOT_FIND_AFFILIATE', + CREATE_OR_VERIFY_COSMOS_ADDRESS: 'ONBOARDING.CREATE_OR_VERIFY_COSMOS_ADDRESS', + DONT_MISS: 'ONBOARDING.DONT_MISS', + ENABLE_API: 'ONBOARDING.ENABLE_API', + ENABLE_TRADING: 'ONBOARDING.ENABLE_TRADING', + ENSURES_WALLET_SUPPORT: 'ONBOARDING.ENSURES_WALLET_SUPPORT', + FINISH_ONBOARDING_DESCRIPTION: 'ONBOARDING.FINISH_ONBOARDING_DESCRIPTION', + FREE_SIGNING: 'ONBOARDING.FREE_SIGNING', + GASLESS_ONBOARDING_RULES: 'ONBOARDING.GASLESS_ONBOARDING_RULES', + GENERATE_COSMOS_WALLET: 'ONBOARDING.GENERATE_COSMOS_WALLET', + GENERATE_KEYS: 'ONBOARDING.GENERATE_KEYS', + GENERATE_KEYS_DESCRIPTION: 'ONBOARDING.GENERATE_KEYS_DESCRIPTION', + GENERATE_KEYS_FOOTER: 'ONBOARDING.GENERATE_KEYS_FOOTER', + GENERATE_WITH_WALLET: 'ONBOARDING.GENERATE_WITH_WALLET', + GET_STARTED: 'ONBOARDING.GET_STARTED', + HAVING_TROUBLE: 'ONBOARDING.HAVING_TROUBLE', + I_AGREE: 'ONBOARDING.I_AGREE', + INVITED_YOU: 'ONBOARDING.INVITED_YOU', + JOIN_ME: 'ONBOARDING.JOIN_ME', + LEDGER_DERIVATION_PATH: 'ONBOARDING.LEDGER_DERIVATION_PATH', + LEGACY_SIGNING: 'ONBOARDING.LEGACY_SIGNING', + LINK_WALLET: 'ONBOARDING.LINK_WALLET', + MISSING_KEYS_DESCRIPTION: 'ONBOARDING.MISSING_KEYS_DESCRIPTION', + NEED_A_WALLET: 'ONBOARDING.NEED_A_WALLET', + NO_FUTURE_ACCESS: 'ONBOARDING.NO_FUTURE_ACCESS', + NO_VPN_USE: 'ONBOARDING.NO_VPN_USE', + NOT_A_RESIDENT: 'ONBOARDING.NOT_A_RESIDENT', + NOT_SUPPORTED_DESCRIPTION: 'ONBOARDING.NOT_SUPPORTED_DESCRIPTION', + NOT_SUPPORTED: 'ONBOARDING.NOT_SUPPORTED', + ONBOARDING: 'ONBOARDING.ONBOARDING', + PERMITTED_TO_USE: 'ONBOARDING.PERMITTED_TO_USE', + PRIVACY_POLICY: 'ONBOARDING.PRIVACY_POLICY', + RECOVER_KEYS: 'ONBOARDING.RECOVER_KEYS', + REFERRAL_DISCOUNT: 'ONBOARDING.REFERRAL_DISCOUNT', + REGISTER: 'ONBOARDING.REGISTER', + REMEMBER_ME: 'ONBOARDING.REMEMBER_ME', + SEARCHING_FOR_LEDGER_DESCRIPTION: 'ONBOARDING.SEARCHING_FOR_LEDGER_DESCRIPTION', + SEARCHING_FOR_LEDGER: 'ONBOARDING.SEARCHING_FOR_LEDGER', + SELECT_A_LANGUAGE: 'ONBOARDING.SELECT_A_LANGUAGE', + SELECT_ACCOUNT_DESCRIPTION: 'ONBOARDING.SELECT_ACCOUNT_DESCRIPTION', + SELECT_ACCOUNT: 'ONBOARDING.SELECT_ACCOUNT', + SEND_REQUEST: 'ONBOARDING.SEND_REQUEST', + SEND_REQUESTS: 'ONBOARDING.SEND_REQUESTS', + SET_UP_ACCOUNT: 'ONBOARDING.SET_UP_ACCOUNT', + SIGN_IN_WALLET: 'ONBOARDING.SIGN_IN_WALLET', + SIGNATURE_CREATES_COSMOS_WALLET: 'ONBOARDING.SIGNATURE_CREATES_COSMOS_WALLET', + SIGN_MESSAGE: 'ONBOARDING.SIGN_MESSAGE', + SKIP_FOR_NOW: 'ONBOARDING.SKIP_FOR_NOW', + START_TRADING_BLURB: 'ONBOARDING.START_TRADING_BLURB', + SWITCH_NETWORK: 'ONBOARDING.SWITCH_NETWORK', + TRY_AGAIN: 'ONBOARDING.TRY_AGAIN', + TWO_SIGNATURE_REQUESTS: 'ONBOARDING.TWO_SIGNATURE_REQUESTS', + UNDERSTAND_RISKS: 'ONBOARDING.UNDERSTAND_RISKS', + VALUE_PROP_ADVANCED: 'ONBOARDING.VALUE_PROP_ADVANCED', + VALUE_PROP_ADVANCED_DESC: 'ONBOARDING.VALUE_PROP_ADVANCED_DESC', + VALUE_PROP_LIQUID: 'ONBOARDING.VALUE_PROP_LIQUID', + VALUE_PROP_LIQUID_DESC: 'ONBOARDING.VALUE_PROP_LIQUID_DESC', + VALUE_PROP_REWARDS_DESC: 'ONBOARDING.VALUE_PROP_REWARDS_DESC', + VALUE_PROP_TRUSTLESS: 'ONBOARDING.VALUE_PROP_TRUSTLESS', + VALUE_PROP_TRUSTLESS_DESC: 'ONBOARDING.VALUE_PROP_TRUSTLESS_DESC', + VERIFY_OWNERSHIP: 'ONBOARDING.VERIFY_OWNERSHIP', + VERIFY_WALLET_COMPATIBILITY: 'ONBOARDING.VERIFY_WALLET_COMPATIBILITY', + WELCOME: 'ONBOARDING.WELCOME', + WELCOME_DYDX: 'ONBOARDING.WELCOME_DYDX', + WRONG_NETWORK_EXPLANATION_PRODUCTION: 'ONBOARDING.WRONG_NETWORK_EXPLANATION_PRODUCTION', + WRONG_NETWORK_EXPLANATION_STAGING: 'ONBOARDING.WRONG_NETWORK_EXPLANATION_STAGING', + WRONG_NETWORK: 'ONBOARDING.WRONG_NETWORK', + YOU_AGREE_TO_TERMS: 'ONBOARDING.YOU_AGREE_TO_TERMS', + + // Sign into mobile + CLICK_TO_SHOW: 'SIGN_INTO_MOBILE.CLICK_TO_SHOW', + DESCRIPTION_ABOUT_TO_TRANSFER: 'SIGN_INTO_MOBILE.DESCRIPTION_ABOUT_TO_TRANSFER', + DESCRIPTION_NEVER_SHARE: 'SIGN_INTO_MOBILE.DESCRIPTION_NEVER_SHARE', + HIDE_CODE: 'SIGN_INTO_MOBILE.HIDE_CODE', + SYNC_WITH_DESKTOP: 'SIGN_INTO_MOBILE.SYNC_WITH_DESKTOP', + NEVER_SHARE: 'SIGN_INTO_MOBILE.NEVER_SHARE', + NOT_READY: 'SIGN_INTO_MOBILE.NOT_READY', + READY: 'SIGN_INTO_MOBILE.READY', + SHOW_CODE: 'SIGN_INTO_MOBILE.SHOW_CODE', + TITLE_CONNECTED: 'SIGN_INTO_MOBILE.TITLE_CONNECTED', + TITLE_FAILED_TO_CONNECT: 'SIGN_INTO_MOBILE.TITLE_FAILED_TO_CONNECT', + TITLE_SCAN_FROM_APP: 'SIGN_INTO_MOBILE.TITLE_SCAN_FROM_APP', + TITLE_SIGN_INTO_MOBILE: 'SIGN_INTO_MOBILE.TITLE_SIGN_INTO_MOBILE', + WAIT_SECONDS_SINGULAR: 'SIGN_INTO_MOBILE.WAIT_SECONDS_SINGULAR', + WAIT_SECONDS: 'SIGN_INTO_MOBILE.WAIT_SECONDS', + WHILE_ONBOARDING: 'SIGN_INTO_MOBILE.WHILE_ONBOARDING', + + // Legal + LEGAL: 'LEGAL.LEGAL', + GOVERNANCE_LINK_DESCRIPTION: 'LEGAL.GOVERNANCE_LINK_DESCRIPTION', + LEAVING_WEBSITE: 'LEGAL.LEAVING_WEBSITE', + + // Deposit Modal + ENABLE_FOR_THIS_DEPOSIT: 'DEPOSIT_MODAL.ENABLE_FOR_THIS_DEPOSIT', + ENABLE_SYMBOL_ON_DYDX: 'DEPOSIT_MODAL.ENABLE_SYMBOL_ON_DYDX', + ENABLE_SYMBOL: 'DEPOSIT_MODAL.ENABLE_SYMBOL', + ENABLING_SYMBOL: 'DEPOSIT_MODAL.ENABLING_SYMBOL', + EXCHANGE_RATE: 'DEPOSIT_MODAL.EXCHANGE_RATE', + GAS_FEE: 'DEPOSIT_MODAL.GAS_FEE', + GASLESS_DEPOSITS_DESCRIPTION_PLURAL: 'DEPOSIT_MODAL.GASLESS_DEPOSITS_DESCRIPTION_PLURAL', + GASLESS_DEPOSITS_DESCRIPTION_SINGULAR: 'DEPOSIT_MODAL.GASLESS_DEPOSITS_DESCRIPTION_SINGULAR', + GASLESS_DEPOSITS_RESET: 'DEPOSIT_MODAL.GASLESS_DEPOSITS_RESET', + GASLESS_DEPOSITS_SUBJECT_TO_RULES: 'DEPOSIT_MODAL.GASLESS_DEPOSITS_SUBJECT_TO_RULES', + GASLESS_DEPOSITS_TEMPORARILY_DISABLED: 'DEPOSIT_MODAL.GASLESS_DEPOSITS_TEMPORARILY_DISABLED', + GASLESS_ETH_DEPOSITS: 'DEPOSIT_MODAL.GASLESS_ETH_DEPOSITS', + HIDE_ALL_DETAILS: 'DEPOSIT_MODAL.HIDE_ALL_DETAILS', + MAX_SLIPPAGE: 'DEPOSIT_MODAL.MAX_SLIPPAGE', + MINIMUM_DEPOSIT_MET: 'DEPOSIT_MODAL.MINIMUM_DEPOSIT_MET', + MINIMUM_DEPOSIT_UNMET: 'DEPOSIT_MODAL.MINIMUM_DEPOSIT_UNMET', + NON_GASLESS_DEPOSITS: 'DEPOSIT_MODAL.NON_GASLESS_DEPOSITS', + SELECT_ASSET: 'DEPOSIT_MODAL.SELECT_ASSET', + SELECT_CHAIN: 'DEPOSIT_MODAL.SELECT_CHAIN', + SET_ALLOWANCE_EXPLANATION: 'DEPOSIT_MODAL.SET_ALLOWANCE_EXPLANATION', + SETTING_ALLOWANCE_EXPLANATION: 'DEPOSIT_MODAL.SETTING_ALLOWANCE_EXPLANATION', + SHOW_ALL_DETAILS: 'DEPOSIT_MODAL.SHOW_ALL_DETAILS', + SLIPPAGE: 'DEPOSIT_MODAL.SLIPPAGE', + SUBJECT_TO_RULES: 'DEPOSIT_MODAL.SUBJECT_TO_RULES', + SWAP: 'DEPOSIT_MODAL.SWAP', + TOTAL_FEES: 'DEPOSIT_MODAL.TOTAL_FEES', + + // Withdraw Modal + ENABLE_WITHDRAW: 'WITHDRAW_MODAL.ENABLE_WITHDRAW', + ENABLE_WITHDRAW_BODY: 'WITHDRAW_MODAL.ENABLE_WITHDRAW_BODY', + ENABLE_WITHDRAW_TITLE: 'WITHDRAW_MODAL.ENABLE_WITHDRAW_TITLE', + FAST: 'WITHDRAW_MODAL.FAST', + FAST_WITHDRAW_CONFIRMATION: 'WITHDRAW_MODAL.FAST_WITHDRAW_CONFIRMATION', + SLOW: 'WITHDRAW_MODAL.SLOW', + SLOW_WITHDRAW_DESCRIPTION: 'WITHDRAW_MODAL.SLOW_WITHDRAW_DESCRIPTION', + SLOW_WITHDRAW_CONFIRMATION: 'WITHDRAW_MODAL.SLOW_WITHDRAW_CONFIRMATION', + WITHDRAW_IRREVERSIBLE: 'WITHDRAW_MODAL.WITHDRAW_IRREVERSIBLE', + + // Feedback Modal + FEEDBACK_PLACEHOLDER: 'FEEDBACK_MODAL.FEEDBACK_PLACEHOLDER', + GIVE_FEEDBACK: 'FEEDBACK_MODAL.GIVE_FEEDBACK', + + // Preferences Modal + POP_UP_NOTIFICATIONS: 'PREFERENCES_MODAL.POP_UP_NOTIFICATIONS', + PREFERENCES: 'PREFERENCES_MODAL.PREFERENCES', + ORDERBOOK_ANIMATIONS: 'PREFERENCES_MODAL.ORDERBOOK_ANIMATIONS', + PROFILE_SHARE_USERNAME: 'PREFERENCES_MODAL.PROFILE_SHARE_USERNAME', + PROFILE_SHARE_ADDRESS: 'PREFERENCES_MODAL.PROFILE_SHARE_ADDRESS', + SAVE_ORDER_AMOUNT: 'PREFERENCES_MODAL.SAVE_ORDER_AMOUNT', + + // Help Modal + API_DOCUMENTATION_DESCRIPTION: 'HELP_MODAL.API_DOCUMENTATION_DESCRIPTION', + HELP_CENTER_DESCRIPTION: 'HELP_MODAL.HELP_CENTER_DESCRIPTION', + JOIN_DISCORD: 'HELP_MODAL.JOIN_DISCORD', + JOIN_DISCORD_DESCRIPTION: 'HELP_MODAL.JOIN_DISCORD_DESCRIPTION', + LIVE_CHAT: 'HELP_MODAL.LIVE_CHAT', + LIVE_CHAT_DESCRIPTION: 'HELP_MODAL.LIVE_CHAT_DESCRIPTION', + PROVIDE_FEEDBACK: 'HELP_MODAL.PROVIDE_FEEDBACK', + PROVIDE_FEEDBACK_DESCRIPTION: 'HELP_MODAL.PROVIDE_FEEDBACK_DESCRIPTION', + + // More Links Modal + DOCUMENTATION_DESCRIPTION: 'MORE_LINKS_MODAL.DOCUMENTATION_DESCRIPTION', + COMMUNITY_DESCRIPTION: 'MORE_LINKS_MODAL.COMMUNITY_DESCRIPTION', + TERMS_OF_USE_DESCRIPTION: 'MORE_LINKS_MODAL.TERMS_OF_USE_DESCRIPTION', + PRIVACY_POLICY_DESCRIPTION: 'MORE_LINKS_MODAL.PRIVACY_POLICY_DESCRIPTION', + LEGAL_DESCRIPTION: 'MORE_LINKS_MODAL.LEGAL_DESCRIPTION', + GASLESS_DEPOSIT_RULES_DESCRIPTION: 'MORE_LINKS_MODAL.GASLESS_DEPOSIT_RULES_DESCRIPTION', + COMPETITION_TERMS_DESCRIPTION: 'MORE_LINKS_MODAL.COMPETITION_TERMS_DESCRIPTION', + LEAGUE_RULES_DESCRIPTION: 'MORE_LINKS_MODAL.LEAGUE_RULES_DESCRIPTION', + EXCHANGE_METRICS_DESCRIPTION: 'MORE_LINKS_MODAL.EXCHANGE_METRICS_DESCRIPTION', + EXCHANGE_STATUS_DESCRIPTION: 'MORE_LINKS_MODAL.EXCHANGE_STATUS_DESCRIPTION', + + // Portfolio + ABOUT_TRADING_DATA_DESCRIPTION: 'PORTFOLIO.ABOUT_TRADING_DATA_DESCRIPTION', + ABOUT_TRADING_DATA: 'PORTFOLIO.ABOUT_TRADING_DATA', + ACTIVE_EPOCH: 'PORTFOLIO.ACTIVE_EPOCH', + ALLOCATION: 'PORTFOLIO.ALLOCATION', + AVERAGE_OPEN_INTEREST: 'PORTFOLIO.AVERAGE_OPEN_INTEREST', + CAN_BE_CLAIMABLE_BY_YOU: 'PORTFOLIO.CAN_BE_CLAIMABLE_BY_YOU', + CLAIM_DATA_DESCRIPTION: 'PORTFOLIO.CLAIM_DATA_DESCRIPTION', + CLAIM_DATA: 'PORTFOLIO.CLAIM_DATA', + COMPILING: 'PORTFOLIO.COMPILING', + COUNTDOWN: 'PORTFOLIO.COUNTDOWN', + CURRENT_EPOCH: 'PORTFOLIO.CURRENT_EPOCH', + CURRENTLY_HELD: 'PORTFOLIO.CURRENTLY_HELD', + DISCOVER_NEW_ASSETS: 'PORTFOLIO.DISCOVER_NEW_ASSETS', + DOWNLOAD_CSV: 'PORTFOLIO.DOWNLOAD_CSV', + EARN_DYDX_FOR_TRADING_DESCRIPTION: 'PORTFOLIO.EARN_DYDX_FOR_TRADING_DESCRIPTION', + EARN_DYDX_FOR_TRADING: 'PORTFOLIO.EARN_DYDX_FOR_TRADING', + EPOCH_NUMBER: 'PORTFOLIO.EPOCH_NUMBER', + ESTIMATED_FOR_THIS_EPOCH: 'PORTFOLIO.ESTIMATED_FOR_THIS_EPOCH', + ESTIMATED_REWARDS: 'PORTFOLIO.ESTIMATED_REWARDS', + ESTIMATED_UNLOCKED_REWARDS: 'PORTFOLIO.ESTIMATED_UNLOCKED_REWARDS', + EXCHANGE_MARKET_SHARE: 'PORTFOLIO.EXCHANGE_MARKET_SHARE', + EXPORT: 'PORTFOLIO.EXPORT', + FEE_DISCOUNT: 'PORTFOLIO.FEE_DISCOUNT', + FEE_STRUCTURE: 'PORTFOLIO.FEE_STRUCTURE', + FREE_TRADING_TITLE: 'PORTFOLIO.FREE_TRADING_TITLE', + FREE_TRADING_DESCRIPTION: 'PORTFOLIO.FREE_TRADING_DESCRIPTION', + FREE_TRADING_TITLE_ASTERISK: 'PORTFOLIO.FREE_TRADING_TITLE_ASTERISK', + FREE_TRADING_TITLE_ASTERISK_FREE: 'PORTFOLIO.FREE_TRADING_TITLE_ASTERISK_FREE', + FREE_TRADING_DESCRIPTION_ASTERISK: 'PORTFOLIO.FREE_TRADING_DESCRIPTION_ASTERISK', + FREE_TRADING_DISCLAIMER: 'PORTFOLIO.FREE_TRADING_DISCLAIMER', + FREE_TRADING_DISCLAIMER_PERPETUAL_FUNDING: 'PORTFOLIO.FREE_TRADING_DISCLAIMER_PERPETUAL_FUNDING', + GASLESS_DEPOSITS_NEW_PROMO: 'PORTFOLIO.GASLESS_DEPOSITS_NEW_PROMO', + GASLESS_DEPOSITS_PROMO: 'PORTFOLIO.GASLESS_DEPOSITS_PROMO', + HOLDING: 'PORTFOLIO.HOLDING', + IN_THIS_EPOCH: 'PORTFOLIO.IN_THIS_EPOCH', + MAKER_MARKET_SHARE: 'PORTFOLIO.MAKER_MARKET_SHARE', + MARKET_NOW_LIVE: 'PORTFOLIO.MARKET_NOW_LIVE', + NONE_HELD: 'PORTFOLIO.NONE_HELD', + OPEN_INTEREST_LABEL: 'PORTFOLIO.OPEN_INTEREST_LABEL', + ORDERS_DESCRIPTION: 'PORTFOLIO.ORDERS_DESCRIPTION', + OVER_THE_LAST_30_DAYS: 'PORTFOLIO.OVER_THE_LAST_30_DAYS', + OVERVIEW_DESCRIPTION: 'PORTFOLIO.OVERVIEW_DESCRIPTION', + PAYMENTS_DESCRIPTION: 'PORTFOLIO.PAYMENTS_DESCRIPTION', + PORTFOLIO_VALUE: 'PORTFOLIO.PORTFOLIO_VALUE', + PORTFOLIO: 'PORTFOLIO.PORTFOLIO', + POSITIONS_DESCRIPTION: 'PORTFOLIO.POSITIONS_DESCRIPTION', + PROMOTION_RULES: 'PORTFOLIO.PROMOTION_RULES', + READ_ANNOUNCEMENT: 'PORTFOLIO.READ_ANNOUNCEMENT', + RETROACTIVE_REWARDS: 'PORTFOLIO.RETROACTIVE_REWARDS', + REWARDS_MADE_AVAILABLE: 'PORTFOLIO.REWARDS_MADE_AVAILABLE', + REWARDS_NOT_PROVIDED: 'PORTFOLIO.REWARDS_NOT_PROVIDED', + REWARDS_UPDATE: 'PORTFOLIO.REWARDS_UPDATE', + SEARCH_MARKETS: 'PORTFOLIO.SEARCH_MARKETS', + STOP_MARKET_ORDERS: 'PORTFOLIO.STOP_MARKET_ORDERS', + STOP_MARKET_ORDERS_DESCRIPTION: 'PORTFOLIO.STOP_MARKET_ORDERS_DESCRIPTION', + TARGET_VOLUME: 'PORTFOLIO.TARGET_VOLUME', + TESTNET_DEPOSIT_PROMO: 'PORTFOLIO.TESTNET_DEPOSIT_PROMO', + TESTNET_LOWERCASE: 'PORTFOLIO.TESTNET_LOWERCASE', + TRADES_DESCRIPTION: 'PORTFOLIO.TRADES_DESCRIPTION', + TRADES_LABEL: 'PORTFOLIO.TRADES_LABEL', + TRADING_COMPETITION: 'PORTFOLIO.TRADING_COMPETITION', + TRADING_DATA_DESCRIPTION: 'PORTFOLIO.TRADING_DATA_DESCRIPTION', + TRADING_DATA: 'PORTFOLIO.TRADING_DATA', + TRADING_FORMULA_DESCRIPTION: 'PORTFOLIO.TRADING_FORMULA_DESCRIPTION', + TRADING_FORMULA_UPDATE_DESCRIPTION: 'PORTFOLIO.TRADING_FORMULA_UPDATE_DESCRIPTION', + TRADING_FORMULA_UPDATE: 'PORTFOLIO.TRADING_FORMULA_UPDATE', + TRADING_FORMULA: 'PORTFOLIO.TRADING_FORMULA', + TRADING_LEAGUES: 'PORTFOLIO.TRADING_LEAGUES', + TRADING_LEAGUES_DESCRIPTION: 'PORTFOLIO.TRADING_LEAGUES_DESCRIPTION', + TRADING_LEAGUES_PRIZE: 'PORTFOLIO.TRADING_LEAGUES_PRIZE', + TRADING_VOLUME_LABEL: 'PORTFOLIO.TRADING_VOLUME_LABEL', + TRADING_VOLUME: 'PORTFOLIO.TRADING_VOLUME', + TRAILING_VOLUME: 'PORTFOLIO.TRAILING_VOLUME', + TRANSACTION: 'PORTFOLIO.TRANSACTION', + TRANSFERS_DESCRIPTION: 'PORTFOLIO.TRANSFERS_DESCRIPTION', + UNLOCKED_ENTIRE_ALLOCATION: 'PORTFOLIO.UNLOCKED_ENTIRE_ALLOCATION', + UNLOCKED: 'PORTFOLIO.UNLOCKED', + UNTIL_NEXT_EPOCH_ON_DATE: 'PORTFOLIO.UNTIL_NEXT_EPOCH_ON_DATE', + VIEW_FEES: 'PORTFOLIO.VIEW_FEES', + VIEW_FEE_STRUCTURE: 'PORTFOLIO.VIEW_FEE_STRUCTURE', + VIEW_REWARDS: 'PORTFOLIO.VIEW_REWARDS', + + // Trade + ADD_TRIGGERS: 'TRADE.ADD_TRIGGERS', + AMOUNT_FILLED: 'TRADE.AMOUNT_FILLED', + ANNUALIZED: 'TRADE.ANNUALIZED', + AVERAGE_CLOSE: 'TRADE.AVERAGE_CLOSE', + AVERAGE_OPEN: 'TRADE.AVERAGE_OPEN', + AVERAGE_OPEN_CLOSE: 'TRADE.AVERAGE_OPEN_CLOSE', + BASELINE_POSITION_SIZE: 'TRADE.BASELINE_POSITION_SIZE', + BEST_EFFORT_CANCELED: 'TRADE.BEST_EFFORT_CANCELED', + BRACKET_ORDER_LONG_STOP_LOSS_DESCRIPTION: 'TRADE.BRACKET_ORDER_LONG_STOP_LOSS_DESCRIPTION', + BRACKET_ORDER_LONG_TAKE_PROFIT_DESCRIPTION: 'TRADE.BRACKET_ORDER_LONG_TAKE_PROFIT_DESCRIPTION', + BRACKET_ORDER_SHORT_STOP_LOSS_DESCRIPTION: 'TRADE.BRACKET_ORDER_SHORT_STOP_LOSS_DESCRIPTION', + BRACKET_ORDER_SHORT_TAKE_PROFIT_DESCRIPTION: 'TRADE.BRACKET_ORDER_SHORT_TAKE_PROFIT_DESCRIPTION', + CANCEL_ALL: 'TRADE.CANCEL_ALL', + CANCEL_ORDER: 'TRADE.CANCEL_ORDER', + CANCEL_REASON: 'TRADE.CANCEL_REASON', + CANCELED_ON_CHAIN: 'TRADE.CANCELED_ON_CHAIN', + CANCELING: 'TRADE.CANCELING', + CHANGE_24H: 'TRADE.CHANGE_24H', + CLEAN_UP: 'TRADE.CLEAN_UP', + CLOSE_ORDER: 'TRADE.CLOSE', + CLOSE_POSITION: 'TRADE.CLOSE_POSITION', + CONFIRM_ORDER: 'TRADE.CONFIRM_ORDER', + CONFIRMED_DESCRIPTION: 'TRADE.CONFIRMED_DESCRIPTION', + CONFIRMED_TITLE: 'TRADE.CONFIRMED_TITLE', + COULD_NOT_FILL: 'TRADE.COULD_NOT_FILL', + CURRENT_ANNUALIZED_RATE: 'TRADE.CURRENT_ANNUALIZED_RATE', + CURRENT_FUNDING_RATE: 'TRADE.CURRENT_FUNDING_RATE', + CURRENT_RATE_1H: 'TRADE.CURRENT_RATE_1H', + CURRENT_RATE_8H: 'TRADE.CURRENT_RATE_8H', + CURRENTLY_TRADING_GOERLI: 'TRADE.CURRENTLY_TRADING_GOERLI', + CURRENTLY_TRADING_ROPSTEN: 'TRADE.CURRENTLY_TRADING_ROPSTEN', + ENTER_AMOUNT: 'TRADE.ENTER_AMOUNT', + ENTER_LIMIT_PRICE: 'TRADE.ENTER_LIMIT_PRICE', + ENTRY_PRICE_SHORT: 'TRADE.ENTRY_PRICE_SHORT', + EXECUTION: 'TRADE.EXECUTION', + EXPECTED_PRICE: 'TRADE.EXPECTED_PRICE', + EXPIRED: 'TRADE.EXPIRED', + FAILED: 'TRADE.FAILED', + FEE_AMOUNT: 'TRADE.FEE_AMOUNT', + FEE_PERCENT: 'TRADE.FEE_PERCENT', + FEE: 'TRADE.FEE', + FILLED: 'TRADE.FILLED', + FILL_OR_KILL: 'TRADE.FILL_OR_KILL', + FILLS_EMPTY_STATE: 'TRADE.FILLS_EMPTY_STATE', + FULL_CLOSE: 'TRADE.FULL_CLOSE', + FUNDING_PAYMENTS_EMPTY_STATE: 'TRADE.FUNDING_PAYMENTS_EMPTY_STATE', + FUNDING_PAYMENTS_SHORT: 'TRADE.FUNDING_PAYMENTS_SHORT', + FUNDING_PAYMENTS: 'TRADE.FUNDING_PAYMENTS', + FUNDING_RATE_1H_SHORT: 'TRADE.FUNDING_RATE_1H_SHORT', + FUNDING_RATE: 'TRADE.FUNDING_RATE', + GOOD_TIL_DATE_ABBREVIATED: 'TRADE.GOOD_TIL_DATE_ABBREVIATED', + GOOD_TIL_TIME: 'TRADE.GOOD_TIL_TIME', + GOOD_TIL: 'TRADE.GOOD_TIL', + HISTORICAL_FUNDING_RATE: 'TRADE.HISTORICAL_FUNDING_RATE', + IMMEDIATE_OR_CANCEL: 'TRADE.IMMEDIATE_OR_CANCEL', + IMMEDIATE_OR_CANCEL_PARTIALLY_FILLED: 'TRADE.IMMEDIATE_OR_CANCEL_PARTIALLY_FILLED', + INCREMENTAL_INITIAL_MARGIN_FRACTION: 'TRADE.INCREMENTAL_INITIAL_MARGIN_FRACTION', + INCREMENTAL_POSITION_SIZE: 'TRADE.INCREMENTAL_POSITION_SIZE', + INDEX_PRICE_ABBREVIATED: 'TRADE.INDEX_PRICE_ABBREVIATED', + INDEX_PRICE: 'TRADE.INDEX_PRICE', + INITIAL_STOP: 'TRADE.INITIAL_STOP', + LIMIT_ORDER_DESCRIPTION: 'TRADE.LIMIT_ORDER_DESCRIPTION', + LIMIT_ORDER_SHORT: 'TRADE.LIMIT_ORDER_SHORT', + LIMIT_ORDER: 'TRADE.LIMIT_ORDER', + LIMIT_PRICE: 'TRADE.LIMIT_PRICE', + LIQUIDATED: 'TRADE.LIQUIDATED', + LIQUIDATION_PRICE_SHORT: 'TRADE.LIQUIDATION_PRICE_SHORT', + LIQUIDATION_PRICE: 'TRADE.LIQUIDATION_PRICE', + LIQUIDITY: 'TRADE.LIQUIDITY', + MAKER_FEE: 'TRADE.MAKER_FEE', + MAKER: 'TRADE.MAKER', + MANAGE_YOUR_RISK_STOP: 'TRADE.MANAGE_YOUR_RISK_STOP', + MARKET_BUY: 'TRADE.MARKET_BUY', + MARKET_ORDER_DESCRIPTION: 'TRADE.MARKET_ORDER_DESCRIPTION', + MARKET_ORDER_SHORT: 'TRADE.MARKET_ORDER_SHORT', + MARKET_ORDER: 'TRADE.MARKET_ORDER', + MARKET_PRICE_SHORT: 'TRADE.MARKET_PRICE_SHORT', + MARKET_PROFIT: 'TRADE.MARKET_PROFIT', + MARKET_SELL: 'TRADE.MARKET_SELL', + MAXIMUM_POSITION_SIZE: 'TRADE.MAXIMUM_POSITION_SIZE', + NET_FUNDING: 'TRADE.NET_FUNDING', + NEXT_FUNDING: 'TRADE.NEXT_FUNDING', + NEXT_IN: 'TRADE.NEXT_IN', + NOTIONAL_VALUE: 'TRADE.NOTIONAL_VALUE', + OPEN_INTEREST: 'TRADE.OPEN_INTEREST', + OPEN_POSITIONS: 'TRADE.OPEN_POSITIONS', + OPEN_STATUS: 'TRADE.OPEN_STATUS', + ORACLE_PRICE_ABBREVIATED: 'TRADE.ORACLE_PRICE_ABBREVIATED', + ORACLE_PRICE: 'TRADE.ORACLE_PRICE', + ORDER_EXPIRED: 'TRADE.ORDER_EXPIRED', + ORDER_FILLED: 'TRADE.ORDER_FILLED', + ORDER_LINES: 'TRADE.ORDER_LINES', + ORDER_LINES_TOOLTIP: 'TRADE.ORDER_LINES_TOOLTIP', + ORDER_REMOVAL_REASON_EXPIRED: 'TRADE.ORDER_REMOVAL_REASON_EXPIRED', + ORDER_REMOVAL_REASON_FOK_ORDER_COULD_NOT_BE_FULLY_FULLED: + 'TRADE.ORDER_REMOVAL_REASON_FOK_ORDER_COULD_NOT_BE_FULLY_FULLED', + ORDER_REMOVAL_REASON_IMMEDIATE_OR_CANCEL_WOULD_REST_ON_BOOK: + 'TRADE.ORDER_REMOVAL_REASON_IMMEDIATE_OR_CANCEL_WOULD_REST_ON_BOOK', + ORDER_REMOVAL_REASON_INDEXER_EXPIRED: 'TRADE.ORDER_REMOVAL_REASON_INDEXER_EXPIRED', + ORDER_REMOVAL_REASON_INTERNAL_ERROR: 'TRADE.ORDER_REMOVAL_REASON_INTERNAL_ERROR', + ORDER_REMOVAL_REASON_POST_ONLY_WOULD_CROSS_MAKER_ORDER: + 'TRADE.ORDER_REMOVAL_REASON_POST_ONLY_WOULD_CROSS_MAKER_ORDER', + ORDER_REMOVAL_REASON_REDUCED_ONLY_RESIZE: 'TRADE.ORDER_REMOVAL_REASON_REDUCED_ONLY_RESIZE', + ORDER_REMOVAL_REASON_REPLACED: 'TRADE.ORDER_REMOVAL_REASON_REPLACED', + ORDER_REMOVAL_REASON_SELF_TRADE_ERROR: 'TRADE.ORDER_REMOVAL_REASON_SELF_TRADE_ERROR', + ORDER_REMOVAL_REASON_UNDERCOLLATERALIZED: 'TRADE.ORDER_REMOVAL_REASON_UNDERCOLLATERALIZED', + ORDER_REMOVAL_REASON_UNSPECIFIED: 'TRADE.ORDER_REMOVAL_REASON_UNSPECIFIED', + ORDER_REMOVAL_REASON_USER_CANCELED: 'TRADE.ORDER_REMOVAL_REASON_USER_CANCELED', + ORDER_TYPE: 'TRADE.ORDER_TYPE', + ORDERBOOK: 'TRADE.ORDERBOOK', + ORDERBOOK_ASK_PRICE: 'TRADE.ORDERBOOK_ASK_PRICE', + ORDERBOOK_BID_PRICE: 'TRADE.ORDERBOOK_BID_PRICE', + ORDERBOOK_MID_MARKET_PRICE: 'TRADE.ORDERBOOK_MID_MARKET_PRICE', + ORDERBOOK_MY_ORDER_SIZE: 'TRADE.ORDERBOOK_MY_ORDER_SIZE', + ORDERBOOK_ORDER_SIZE: 'TRADE.ORDERBOOK_ORDER_SIZE', + ORDERBOOK_SHORT: 'TRADE.ORDERBOOK_SHORT', + ORDERBOOK_SPREAD_PERCENT: 'TRADE.ORDERBOOK_SPREAD_PERCENT', + ORDERBOOK_SPREAD: 'TRADE.ORDERBOOK_SPREAD', + ORDERS_EMPTY_STATE: 'TRADE.ORDERS_EMPTY_STATE', + PARTIALLY_FILLED: 'TRADE.PARTIALLY_FILLED', + PAYMENT: 'TRADE.PAYMENT', + PAYMENTS: 'TRADE.PAYMENTS', + PLACED: 'TRADE.PLACED', + PLACE_LIMIT_ORDER: 'TRADE.PLACE_LIMIT_ORDER', + PLACE_MARKET_ORDER: 'TRADE.PLACE_MARKET_ORDER', + PLACE_ORDER: 'TRADE.PLACE_ORDER', + PLACE_SIMPLE_TRADE: 'TRADE.PLACE_SIMPLE_TRADE', + PLACE_TRADE: 'TRADE.PLACE_TRADE', + PLACING_ORDER_DESCRIPTION: 'TRADE.PLACING_ORDER_DESCRIPTION', + PLACING_ORDER_TITLE: 'TRADE.PLACING_ORDER_TITLE', + POSITIONS_EMPTY_STATE: 'TRADE.POSITIONS_EMPTY_STATE', + POSITIONS: 'TRADE.POSITIONS', + POST_ONLY: 'TRADE.POST_ONLY', + POST_ONLY_WOULD_CROSS: 'TRADE.POST_ONLY_WOULD_CROSS', + PRICE_IMPACT: 'TRADE.PRICE_IMPACT', + PREVIEW_ORDER: 'TRADE.PREVIEW_ORDER', + PREVIEW_ORDER_DESCRIPTION: 'TRADE.PREVIEW_ORDER_DESCRIPTION', + PREVIEW_ORDER_TITLE: 'TRADE.PREVIEW_ORDER_TITLE', + PROFIT_AND_LOSS: 'TRADE.PROFIT_AND_LOSS', + PROFIT_LIMIT: 'TRADE.PROFIT_LIMIT', + RATE_1H: 'TRADE.RATE_1H', + RATE_8H: 'TRADE.RATE_8H', + REALIZED_PNL: 'TRADE.REALIZED_PNL', + REDUCE_ONLY: 'TRADE.REDUCE_ONLY', + REDUCE_ONLY_RESIZED: 'TRADE.REDUCE_ONLY_RESIZED', + RETURN_TO_MARKET: 'TRADE.RETURN_TO_MARKET', + RISK_REWARD: 'TRADE.RISK_REWARD', + SELECT_MARKET: 'TRADE.SELECT_MARKET', + SELF_TRADE: 'TRADE.SELF_TRADE', + SET_ORDER_SIZE: 'TRADE.SET_ORDER_SIZE', + SET_PRICE_TRIGGERS: 'TRADE.SET_PRICE_TRIGGERS', + SLIDER: 'TRADE.SLIDER', + STOP_LIMIT_DESCRIPTION: 'TRADE.STOP_LIMIT_DESCRIPTION', + STOP_LIMIT: 'TRADE.STOP_LIMIT', + STOP_LOSS: 'TRADE.STOP_LOSS', + STOP_MARKET: 'TRADE.STOP_MARKET', + STOP_MARKET_DESCRIPTION: 'TRADE.STOP_MARKET_DESCRIPTION', + STOP_PRICE_ABBREVIATED: 'TRADE.STOP_PRICE_ABBREVIATED', + STOP_PRICE: 'TRADE.STOP_PRICE', + TAKE_PROFIT: 'TRADE.TAKE_PROFIT', + TAKE_PROFIT_LIMIT_DESCRIPTION: 'TRADE.TAKE_PROFIT_LIMIT_DESCRIPTION', + TAKE_PROFIT_LIMIT_SHORT: 'TRADE.TAKE_PROFIT_LIMIT_SHORT', + TAKE_PROFIT_LIMIT: 'TRADE.TAKE_PROFIT_LIMIT', + TAKE_PROFIT_MARKET: 'TRADE.TAKE_PROFIT_MARKET', + TAKE_PROFIT_MARKET_DESCRIPTION: 'TRADE.TAKE_PROFIT_MARKET_DESCRIPTION', + TAKE_PROFIT_MARKET_SHORT: 'TRADE.TAKE_PROFIT_MARKET_SHORT', + TAKER_FEE: 'TRADE.TAKER_FEE', + TAKER: 'TRADE.TAKER', + TAP_TO_CLOSE: 'TRADE.TAP_TO_CLOSE', + TAP_TO_TRADE: 'TRADE.TAP_TO_TRADE', + TIME_IN_FORCE: 'TRADE.TIME_IN_FORCE', + TOTAL_COST: 'TRADE.TOTAL_COST', + TOTAL_SIZE: 'TRADE.TOTAL_SIZE', + TOTAL: 'TRADE.TOTAL', + TRADES_24H: 'TRADE.TRADES_24H', + TRADES_EMPTY_STATE: 'TRADE.TRADES_EMPTY_STATE', + TRADES: 'TRADE.TRADES', + TRAIL: 'TRADE.TRAIL', + TRAILING_PERCENT: 'TRADE.TRAILING_PERCENT', + TRAILING_STOP_DESCRIPTION: 'TRADE.TRAILING_STOP_DESCRIPTION', + TRAILING_STOP: 'TRADE.TRAILING_STOP', + TRANSFERS_EMPTY_STATE: 'TRADE.TRANSFERS_EMPTY_STATE', + TRIGGER_PRICE_SHORT: 'TRADE.TRIGGER_PRICE_SHORT', + TRIGGER_PRICE: 'TRADE.TRIGGER_PRICE', + TRIGGERS: 'TRADE.TRIGGERS', + UNDERCOLLATERALIZED: 'TRADE.UNDERCOLLATERALIZED', + UNREALIZED_PNL: 'TRADE.UNREALIZED_PNL', + UNTRIGGERED: 'TRADE.UNTRIGGERED', + UP_TO_X: 'TRADE.UP_TO_X', + UPDATE_TRIGGERS: 'TRADE.UPDATE_TRIGGERS', + USER_CANCELED: 'TRADE.USER_CANCELED', + VOLUME_24H: 'TRADE.VOLUME_24H', + VOLUME: 'TRADE.VOLUME', + WANT_TO_AVOID_LIQUIDATION: 'TRADE.WANT_TO_AVOID_LIQUIDATION', + YOUR_MARKET_POSITION: 'TRADE.YOUR_MARKET_POSITION', + YOUR_POSITION_WAS_LIQUIDATED: 'TRADE.YOUR_POSITION_WAS_LIQUIDATED', + + // Leagues + ACTIVE: 'LEAGUES.ACTIVE', + AND: 'LEAGUES.AND', + BROWSE_LEAGUES: 'LEAGUES.BROWSE_LEAGUES', + BRONZE: 'LEAGUES.BRONZE', + BY_RECENT: 'LEAGUES.BY_RECENT', + COMPETE_AGAINST: 'LEAGUES.COMPETE_AGAINST', + DAILY_HEDGIES: 'LEAGUES.DAILY_HEDGIES', + DAILY_SUBHEADER: 'LEAGUES.DAILY_SUBHEADER', + DEMOTION: 'LEAGUES.DEMOTION', + DIAMOND: 'LEAGUES.DIAMOND', + EARN_AVATAR: 'LEAGUES.EARN_AVATAR', + EMPTY_LADDER_STATE: 'LEAGUES.EMPTY_LADDER_STATE', + GIVEN_TO: 'LEAGUES.GIVEN_TO', + GOLD: 'LEAGUES.GOLD', + HELD_BY: 'LEAGUES.HELD_BY', + INACTIVE: 'LEAGUES.INACTIVE', + LAST_SEASON: 'LEAGUES.LAST_SEASON', + LAST_SEASON_OUTCOME: 'LEAGUES.LAST_SEASON_OUTCOME', + LEAGUE_SIZE: 'LEAGUES.LEAGUE_SIZE', + LEAGUE: 'LEAGUES.LEAGUE', + LEAGUES: 'LEAGUES.LEAGUES', + LEAGUES_LAUNCH_TITLE: 'LEAGUES.LEAGUES_LAUNCH_TITLE', + LEAGUES_LAUNCH_BODY: 'LEAGUES.LEAGUES_LAUNCH_BODY', + LEGENDS: 'LEAGUES.LEGENDS', + LEGENDS_COMPETITION: 'LEAGUES.LEGENDS_COMPETITION', + LEGENDS_COMPETITION_DESCRIPTION: 'LEAGUES.LEGENDS_COMPETITION_DESCRIPTION', + LEGENDS_DEG_SUBHEADER: 'LEAGUES.LEGENDS_DEG_SUBHEADER', + LEGENDS_SUBHEADER: 'LEAGUES.LEGENDS_SUBHEADER', + MIN_BALANCE: 'LEAGUES.MIN_BALANCE', + MIN_EQUITY: 'LEAGUES.MIN_EQUITY', + NO_CHANGE: 'LEAGUES.NO_CHANGE', + NO_WINNER: 'LEAGUES.NO_WINNER', + NOT_ELIGIBLE: 'LEAGUES.NOT_ELIGIBLE', + ON_TRACK: 'LEAGUES.ON_TRACK', + PAST_HEDGIES: 'LEAGUES.PAST_HEDGIES', + PERIOD_LEAGUES: 'LEAGUES.PERIOD_LEAGUES', + PLACE: 'LEAGUES.PLACE', + PLATINUM: 'LEAGUES.PLATINUM', + PRIOR_SEASON_HEDGIES: 'LEAGUES.PRIOR_SEASON_HEDGIES', + PRIZE_CASH: 'LEAGUES.PRIZE_CASH', + PRIZE_DAILY_HEDGIE: 'LEAGUES.PRIZE_DAILY_HEDGIE', + PRIZE_HEDGIE: 'LEAGUES.PRIZE_HEDGIE', + PRIZE_LEAGUE_MIXED: 'LEAGUES.PRIZE_LEAGUE_MIXED', + PROMOTION_TO: 'LEAGUES.PROMOTION_TO', + RANK: 'LEAGUES.RANK', + RANK_NUM: 'LEAGUES.RANK_NUM', + REQUIRED_FOR: 'LEAGUES.REQUIRED_FOR', + REQUIREMENTS: 'LEAGUES.REQUIREMENTS', + SEASON: 'LEAGUES.SEASON', + SEASON_ENDS: 'LEAGUES.SEASON_ENDS', + SEASON_NUM: 'LEAGUES.SEASON_NUM', + SEE_RESULTS: 'LEAGUES.SEE_RESULTS', + SILVER: 'LEAGUES.SILVER', + THIS_SEASON: 'LEAGUES.THIS_SEASON', + THIS_SEASON_HEDGIES: 'LEAGUES.THIS_SEASON_HEDGIES', + TO_RANGE: 'LEAGUES.TO_RANGE', + TO_STAY_IN: 'LEAGUES.TO_STAY_IN', + TODAYS_HEDGIE: 'LEAGUES.TODAYS_HEDGIE', + TOP: 'LEAGUES.TOP', + VIEWING_LEAGUE: 'LEAGUES.VIEWING_LEAGUE', + WILL_ARRIVE: 'LEAGUES.WILL_ARRIVE', + WILL_ARRIVE_SHORTLY: 'LEAGUES.WILL_ARRIVE_SHORTLY', + WILL_COST_GAS: 'LEAGUES.WILL_COST_GAS', + YOU_WON: 'LEAGUES.YOU_WON', + YOUR_LEAGUE: 'LEAGUES.YOUR_LEAGUE', + YOURE_IN: 'LEAGUES.YOURE_IN', + + // Notifications + '66_REDUCTION': 'NOTIFICATIONS.66_REDUCTION', + ADJUSTED_IMR: 'NOTIFICATIONS.ADJUSTED_IMR', + ADJUSTED_IMR_BODY: 'NOTIFICATIONS.ADJUSTED_IMR_BODY', + CLOSE_MARKET_POSITIONS: 'NOTIFICATIONS.CLOSE_MARKET_POSITIONS', + CLOSE_MARKET_POSITIONS_BODY: 'NOTIFICATIONS.CLOSE_MARKET_POSITIONS_BODY', + COMPLIANCE_ALERT: 'NOTIFICATIONS.COMPLIANCE_ALERT', + DEPOSIT_IN_PROGRESS_DESCRIPTION: 'NOTIFICATIONS.DEPOSIT_IN_PROGRESS_DESCRIPTION', + DEPOSIT_IN_PROGRESS: 'NOTIFICATIONS.DEPOSIT_IN_PROGRESS', + DEPOSIT_SUCCESS_DESCRIPTION: 'NOTIFICATIONS.DEPOSIT_SUCCESS_DESCRIPTION', + DEPOSIT_SUCCESS: 'NOTIFICATIONS.DEPOSIT_SUCCESS', + DIRECT_TRANSFER_SUCCESS: 'NOTIFICATIONS.DIRECT_TRANSFER_SUCCESS', + DIRECT_TRANSFER_SUCCESS_DESCRIPTION: 'NOTIFICATIONS.DIRECT_TRANSFER_SUCCESS_DESCRIPTION', + EPOCH_REWARDS: 'NOTIFICATIONS.EPOCH_REWARDS', + EPOCH_REWARDS_BODY: 'NOTIFICATIONS.EPOCH_REWARDS_BODY', + FAST_WITHDRAW_PENDING_DESCRIPTION: 'NOTIFICATIONS.FAST_WITHDRAW_PENDING_DESCRIPTION', + FAST_WITHDRAW_PENDING: 'NOTIFICATIONS.FAST_WITHDRAW_PENDING', + FAST_WITHDRAW_SUCCESS_DESCRIPTION: 'NOTIFICATIONS.FAST_WITHDRAW_SUCCESS_DESCRIPTION', + FAST_WITHDRAW_SUCCESS: 'NOTIFICATIONS.FAST_WITHDRAW_SUCCESS', + LEGAL_UPDATES: 'NOTIFICATIONS.LEGAL_UPDATES', + LEGAL_UPDATES_DESCRIPTION: 'NOTIFICATIONS.LEGAL_UPDATES_DESCRIPTION', + MAINTENANCE_MARGIN_ADJUSTMENTS: 'NOTIFICATIONS.MAINTENANCE_MARGIN_ADJUSTMENTS', + NOTIFICATIONS_EMPTY_STATE: 'NOTIFICATIONS.NOTIFICATIONS_EMPTY_STATE', + OUT_OF_TEN_CONFIRMATIONS: 'NOTIFICATIONS.OUT_OF_TEN_CONFIRMATIONS', + OUT_OF_FOURTEEN_CONFIRMATIONS: 'NOTIFICATIONS.OUT_OF_FOURTEEN_CONFIRMATIONS', + PERMANENTLY_BLOCKED: 'NOTIFICATIONS.PERMANENTLY_BLOCKED', + PERMANENTLY_BLOCKED_ELLIPTIC: 'NOTIFICATIONS.PERMANENTLY_BLOCKED_ELLIPTIC', + PERMANENTLY_BLOCKED_DESCRIPTION: 'NOTIFICATIONS.PERMANENTLY_BLOCKED_DESCRIPTION', + PERMANENTLY_BLOCKED_COMPLIANCE: 'NOTIFICATIONS.PERMANENTLY_BLOCKED_COMPLIANCE', + SLOW_WITHDRAW_AVAILABLE_DESCRIPTION: 'NOTIFICATIONS.SLOW_WITHDRAW_AVAILABLE_DESCRIPTION', + SLOW_WITHDRAW_AVAILABLE: 'NOTIFICATIONS.SLOW_WITHDRAW_AVAILABLE', + SLOW_WITHDRAW_PENDING_DESCRIPTION: 'NOTIFICATIONS.SLOW_WITHDRAW_PENDING_DESCRIPTION', + SLOW_WITHDRAW_PENDING: 'NOTIFICATIONS.SLOW_WITHDRAW_PENDING', + SUSPICIOUS_TRADE: 'NOTIFICATIONS.SUSPICIOUS_TRADE', + SUSPICIOUS_TRADE_BODY: 'NOTIFICATIONS.SUSPICIOUS_TRADE_BODY', + + // Email Notifications + ACCOUNT_DESCRIPTION: 'EMAIL_NOTIFICATIONS.ACCOUNT_DESCRIPTION', + EMAIL_NOTIFICATIONS: 'EMAIL_NOTIFICATIONS.EMAIL_NOTIFICATIONS', + EMAIL_UPDATES: 'EMAIL_NOTIFICATIONS.EMAIL_UPDATES', + ERROR_MANY_REQUESTS: 'EMAIL_NOTIFICATIONS.ERROR_MANY_REQUESTS', + GENERAL_DESCRIPTION: 'EMAIL_NOTIFICATIONS.GENERAL_DESCRIPTION', + GET_NOTIFIED: 'EMAIL_NOTIFICATIONS.GET_NOTIFIED', + MANAGE_NOTIFICATIONS: 'EMAIL_NOTIFICATIONS.MANAGE_NOTIFICATIONS', + MANAGE_NOTIFICATIONS_ONBOARD: 'EMAIL_NOTIFICATIONS.MANAGE_NOTIFICATIONS_ONBOARD', + RESEND_VERIFICATION: 'EMAIL_NOTIFICATIONS.RESEND_VERIFICATION', + REQUIRED: 'EMAIL_NOTIFICATIONS.REQUIRED', + SENT_VERIFICATION: 'EMAIL_NOTIFICATIONS.SENT_VERIFICATION', + SETTINGS: 'EMAIL_NOTIFICATIONS.SETTINGS', + SETUP: 'EMAIL_NOTIFICATIONS.SETUP', + TRADING_DESCRIPTION: 'EMAIL_NOTIFICATIONS.TRADING_DESCRIPTION', + UNVERIFIED: 'EMAIL_NOTIFICATIONS.UNVERIFIED', + VERIFICATION_FAIL: 'EMAIL_NOTIFICATIONS.VERIFICATION_FAIL', + VERIFICATION_FAIL_BODY: 'EMAIL_NOTIFICATIONS.VERIFICATION_FAIL_BODY', + VERIFICATION_HAS_SENT_BODY: 'EMAIL_NOTIFICATIONS.VERIFICATION_HAS_SENT_BODY', + VERIFICATION_SUCCESS: 'EMAIL_NOTIFICATIONS.VERIFICATION_SUCCESS', + VERIFICATION_SUCCESS_BODY: 'EMAIL_NOTIFICATIONS.VERIFICATION_SUCCESS_BODY', + VERIFIED: 'EMAIL_NOTIFICATIONS.VERIFIED', + VERIFY_EMAIL: 'EMAIL_NOTIFICATIONS.VERIFY_EMAIL', + VERIFY_EMAIL_BODY: 'EMAIL_NOTIFICATIONS.VERIFY_EMAIL_BODY', + VERIFY_EMAIL_CTA: 'EMAIL_NOTIFICATIONS.VERIFY_EMAIL_CTA', + + // Force Withdraw + ALERT_FORCE_WITHDRAW_REQUESTED: 'FORCE_WITHDRAW.ALERT_FORCE_WITHDRAW_REQUESTED', + ALERT_FUNDS_WITHDRAWN: 'FORCE_WITHDRAW.ALERT_FUNDS_WITHDRAWN', + AUTHENTICATE: 'FORCE_WITHDRAW.AUTHENTICATE', + DESCRIPTION_WAIT: 'FORCE_WITHDRAW.DESCRIPTION_WAIT', + FORCE_WITHDRAW: 'FORCE_WITHDRAW.FORCE_WITHDRAW', + REQUEST_FORCE_WITHDRAW: 'FORCE_WITHDRAW.REQUEST_FORCE_WITHDRAW', + STEP_1_CONNECT: 'FORCE_WITHDRAW.STEP_1_CONNECT', + STEP_2_AUTHENTICATE: 'FORCE_WITHDRAW.STEP_2_AUTHENTICATE', + STEP_3_INITIATE: 'FORCE_WITHDRAW.STEP_3_INITIATE', + STEP_4_WAIT: 'FORCE_WITHDRAW.STEP_4_WAIT', + STEP_5_WITHDRAW: 'FORCE_WITHDRAW.STEP_5_WITHDRAW', + USER_UNREGISTERED: 'FORCE_WITHDRAW.USER_UNREGISTERED', + VIEW_TRANSACTION: 'FORCE_WITHDRAW.VIEW_TRANSACTION', + WITHDRAW_AMOUNT: 'FORCE_WITHDRAW.WITHDRAW_AMOUNT', + + // Test Funds Modal + TESTNET_DEPOSITS: 'TEST_FUNDS_MODAL.TESTNET_DEPOSITS', + TESTNET_DEPOSITS_BODY: 'TEST_FUNDS_MODAL.TESTNET_DEPOSITS_BODY', + + // League Outcome Modal + DEMOTED_DESC: 'LEAGUE_OUTCOME_MODAL.DEMOTED_DESC', + DEMOTED_SUB_DESC: 'LEAGUE_OUTCOME_MODAL.DEMOTED_SUB_DESC', + INACTIVE_DESC: 'LEAGUE_OUTCOME_MODAL.INACTIVE_DESC', + PROMOTED_DESC: 'LEAGUE_OUTCOME_MODAL.PROMOTED_DESC', + PROMOTED_SUB_DESC: 'LEAGUE_OUTCOME_MODAL.PROMOTED_SUB_DESC', + YOU_DEMOTED: 'LEAGUE_OUTCOME_MODAL.YOU_DEMOTED', + YOU_INACTIVE: 'LEAGUE_OUTCOME_MODAL.YOU_INACTIVE', + YOU_PROMOTED: 'LEAGUE_OUTCOME_MODAL.YOU_PROMOTED', + + // Hedgies + HEDGIES_NFT: 'HEDGIES.HEDGIES_NFT', + + // Compliance Modal + COMPLIANCE_BODY: 'COMPLIANCE_MODAL.COMPLIANCE_BODY', + COMPLIANCE_BODY_FIRST_OFFENSE_1: 'COMPLIANCE_MODAL.COMPLIANCE_BODY_FIRST_OFFENSE_1', + COMPLIANCE_BODY_FIRST_OFFENSE_2: 'COMPLIANCE_MODAL.COMPLIANCE_BODY_FIRST_OFFENSE_2', + COMPLIANCE_REQUEST: 'COMPLIANCE_MODAL.COMPLIANCE_REQUEST', + CONTINUE: 'COMPLIANCE_MODAL.CONTINUE', + COUNTRY_OF_RESIDENCE: 'COMPLIANCE_MODAL.COUNTRY_OF_RESIDENCE', + SUBMIT: 'COMPLIANCE_MODAL.SUBMIT', + TRADING_LOCATION: 'COMPLIANCE_MODAL.TRADING_LOCATION', + TYPE_TO_SEARCH: 'COMPLIANCE_MODAL.TYPE_TO_SEARCH', + + // Profiles Page + ADDRESS: 'PROFILES_PAGE.ADDRESS', + APPLICATION_PENDING: 'PROFILES_PAGE.APPLICATION_PENDING', + APPLICATION_REJECTED: 'PROFILES_PAGE.APPLICATION_REJECTED', + CERTIFY_AND_ACCEPT: 'PROFILES_PAGE.CERTIFY_AND_ACCEPT', + CERTIFY_CAPACITY_AND_AUTHORITY: 'PROFILES_PAGE.CERTIFY_CAPACITY_AND_AUTHORITY', + CITIZENSHIP: 'PROFILES_PAGE.CITIZENSHIP', + CITY: 'PROFILES_PAGE.CITY', + COMPETITIVE_LEAGUES: 'PROFILES_PAGE.COMPETITIVE_LEAGUES', + COPY_AFFILIATE_LINK: 'PROFILES_PAGE.COPY_AFFILIATE_LINK', + COPY_LINK: 'PROFILES_PAGE.COPY_LINK', + COPY_PROFILE_LINK: 'PROFILES_PAGE.COPY_PROFILE_LINK', + COULD_NOT_FIND_USER: 'PROFILES_PAGE.COULD_NOT_FIND_USER', + COUNTRY: 'PROFILES_PAGE.COUNTRY', + EARN_COMMISSION: 'PROFILES_PAGE.EARN_COMMISSION', + EARN_DYDX_REWARDS: 'PROFILES_PAGE.EARN_DYDX_REWARDS', + EARN_USDC: 'PROFILES_PAGE.EARN_USDC', + EARNINGS: 'PROFILES_PAGE.EARNINGS', + ENTITY: 'PROFILES_PAGE.ENTITY', + ENTITY_NAME: 'PROFILES_PAGE.ENTITY_NAME', + EPOCH_REVENUE: 'PROFILES_PAGE.EPOCH_REVENUE', + FEE_SHARING_FOR_EACH_NEW_TRADER: 'PROFILES_PAGE.FEE_SHARING_FOR_EACH_NEW_TRADER', + FIRST_NAME: 'PROFILES_PAGE.FIRST_NAME', + FULL_NAME: 'PROFILES_PAGE.FULL_NAME', + HISTORICAL_TRADING_PERF: 'PROFILES_PAGE.HISTORICAL_TRADING_PERF', + I_HAVE_READ_AND_AGREE: 'PROFILES_PAGE.I_HAVE_READ_AND_AGREE', + INCORPORATION_COUNTRY: 'PROFILES_PAGE.INCORPORATION_COUNTRY', + INDIVIDUAL: 'PROFILES_PAGE.INDIVIDUAL', + LAST_EPOCH: 'PROFILES_PAGE.LAST_EPOCH', + LAST_NAME: 'PROFILES_PAGE.LAST_NAME', + LAST_UPDATED: 'PROFILES_PAGE.LAST_UPDATED', + MANDATORY_MINIMIZED_W8_FORM: 'PROFILES_PAGE.MANDATORY_MINIMIZED_W8_FORM', + NO_HEDGIES_OTHER: 'PROFILES_PAGE.NO_HEDGIES_OTHER', + NO_HEDGIES_YOU: 'PROFILES_PAGE.NO_HEDGIES_YOU', + NUDGE_TITLE: 'PROFILES_PAGE.NUDGE_TITLE', + NUDGE_DESCRIPTION: 'PROFILES_PAGE.NUDGE_DESCRIPTION', + OPENSEA: 'PROFILES_PAGE.OPENSEA', + POSTAL_CODE: 'PROFILES_PAGE.POSTAL_CODE', + PRINT_NAME: 'PROFILES_PAGE.PRINT_NAME', + REWARDS_BY_EPOCH: 'PROFILES_PAGE.REWARDS_BY_EPOCH', + SELECT_ONE: 'PROFILES_PAGE.SELECT_ONE', + SIGN_AND_SUBMIT: 'PROFILES_PAGE.SIGN_AND_SUBMIT', + SIGNATURE: 'PROFILES_PAGE.SIGNATURE', + STATE: 'PROFILES_PAGE.STATE', + STREET_ADDRESS: 'PROFILES_PAGE.STREET_ADDRESS', + TOTAL_REVENUE: 'PROFILES_PAGE.TOTAL_REVENUE', + TRADE_TO_WIN: 'PROFILES_PAGE.TRADE_TO_WIN', + TRADERS_JOINED: 'PROFILES_PAGE.TRADERS_JOINED', + USERS_REFERRED: 'PROFILES_PAGE.USERS_REFERRED', + YOU_CAN_WIN_THESE: 'PROFILES_PAGE.YOU_CAN_WIN_THESE', + + // Epoch End Modal + EPOCH_END_EARNED: 'EPOCH_END_MODAL.EPOCH_END_EARNED', + YOU_EARNED: 'EPOCH_END_MODAL.YOU_EARNED', + + // Allowance Alert Modal + ALLOWANCE_AFTER: 'ALLOWANCE_ALERT_MODAL.ALLOWANCE_AFTER', + ALLOWANCE_ALERT_BODY: 'ALLOWANCE_ALERT_MODAL.ALLOWANCE_ALERT_BODY', + ALLOWANCE_ALERT_TITLE: 'ALLOWANCE_ALERT_MODAL.ALLOWANCE_ALERT_TITLE', + ALLOWANCE_WARNING: 'ALLOWANCE_ALERT_MODAL.ALLOWANCE_WARNING', + FUNDS_RECOVERABLE: 'ALLOWANCE_ALERT_MODAL.FUNDS_RECOVERABLE', + PROTECT_YOUR_FUNDS: 'ALLOWANCE_ALERT_MODAL.PROTECT_YOUR_FUNDS', + RECOVER_FUNDS: 'ALLOWANCE_ALERT_MODAL.RECOVER_FUNDS', + UNSET: 'ALLOWANCE_ALERT_MODAL.UNSET', + WALLET_CAN_BE_USED_NORMALLY: 'ALLOWANCE_ALERT_MODAL.WALLET_CAN_BE_USED_NORMALLY', + + // Discoverability (Promos & Notifs) + GET_AFFILIATE_LINK: 'DISCOVERABILITY.GET_AFFILIATE_LINK', + PLANNED_MAINTENANCE: 'DISCOVERABILITY.PLANNED_MAINTENANCE', + PLANNED_MAINTENANCE_080322_BODY: 'DISCOVERABILITY.PLANNED_MAINTENANCE_080322_BODY', + REDUCE_ONLY_LIVE: 'DISCOVERABILITY.REDUCE_ONLY_LIVE', + REDUCE_ONLY_LIVE_BODY: 'DISCOVERABILITY.REDUCE_ONLY_LIVE_BODY', + REFER_AND_EARN: 'DISCOVERABILITY.REFER_AND_EARN', + SET_UP_REFERRALS_BODY: 'DISCOVERABILITY.SET_UP_REFERRALS_BODY', + SET_UP_REFERRALS_PARAM: 'DISCOVERABILITY.SET_UP_REFERRALS_PARAM', + TESTNET_GOERLI_MIGRATION: 'DISCOVERABILITY.TESTNET_GOERLI_MIGRATION', + TESTNET_GOERLI_MIGRATION_BODY: 'DISCOVERABILITY.TESTNET_GOERLI_MIGRATION_BODY', + + // Reduce-Only support modal + REDUCE_ONLY_SUPPORT: 'REDUCE_ONLY_SUPPORT_MODAL.REDUCE_ONLY_SUPPORT', + REDUCE_ONLY_WILL_DISABLE: 'REDUCE_ONLY_SUPPORT_MODAL.REDUCE_ONLY_WILL_DISABLE', + REDUCE_ONLY_WILL_ENABLE: 'REDUCE_ONLY_SUPPORT_MODAL.REDUCE_ONLY_WILL_ENABLE', + + // Share Activity Modal + SHARE_ACTIVITY: 'SHARE_ACTIVITY_MODAL.SHARE_ACTIVITY', + SHARE_COPY: 'SHARE_ACTIVITY_MODAL.COPY', + SHARE_DOWNLOAD: 'SHARE_ACTIVITY_MODAL.DOWNLOAD', + SHARE_ENTRY: 'SHARE_ACTIVITY_MODAL.ENTRY', + SHARE_INDEX: 'SHARE_ACTIVITY_MODAL.INDEX', + SHARE_LEVERAGE: 'SHARE_ACTIVITY_MODAL.LEVERAGE', + SHARE_OPTIONS: 'SHARE_ACTIVITY_MODAL.OPTIONS', + SHARE_TWEET: 'SHARE_ACTIVITY_MODAL.SHARE_TO_TWITTER', + SHARE_TWEET_MARKET_POSITION: 'SHARE_ACTIVITY_MODAL.TWEET_MARKET_POSITION', + SHARE_TWEET_USE_MY_LINK: 'SHARE_ACTIVITY_MODAL.TWEET_USE_MY_LINK', + SHARE_TWEET_JOIN_ME_LINK: 'SHARE_ACTIVITY_MODAL.TWEET_JOIN_ME_LINK', + SHARE_TWEET_PASTE_IMAGE_AND_DELETE_THIS: 'SHARE_ACTIVITY_MODAL.TWEET_PASTE_IMAGE_AND_DELETE_THIS', + + // Direct Transfer Modal + CONFIRM_TRANSFER: 'DIRECT_TRANSFER_MODAL.CONFIRM_TRANSFER', + CONFIRM_TRANSFER_PROMPT: 'DIRECT_TRANSFER_MODAL.CONFIRM_TRANSFER_PROMPT', + DESTINATION: 'DIRECT_TRANSFER_MODAL.DESTINATION', + DYDX_CHAIN: 'DIRECT_TRANSFER_MODAL.DYDX_CHAIN', + DIRECTLY_TRANSFER: 'DIRECT_TRANSFER_MODAL.DIRECTLY_TRANSFER', + ETH_ADDRESS: 'DIRECT_TRANSFER_MODAL.ETH_ADDRESS', + PLEASE_CONFIRM_ADDRESS: 'DIRECT_TRANSFER_MODAL.PLEASE_CONFIRM_ADDRESS', + SELECT_ADDRESS: 'DIRECT_TRANSFER_MODAL.SELECT_ADDRESS', + + // Deposit with Fiat + FIAT_BANXA_SUPPORT_LINK: 'DEPOSIT_WITH_FIAT.BANXA_SUPPORT_LINK', + FIAT_CHECK_ORDER_STATUS: 'DEPOSIT_WITH_FIAT.CHECK_ORDER_STATUS', + FIAT_MODAL_BUY_CTA: 'DEPOSIT_WITH_FIAT.MODAL_BUY_CTA', + FIAT_MODAL_CONFIRMATION: 'DEPOSIT_WITH_FIAT.MODAL_CONFIRMATION', + FIAT_MODAL_CONFIRMATION_TITLE: 'DEPOSIT_WITH_FIAT.MODAL_CONFIRMATION_TITLE', + FIAT_MODAL_LEGAL_DISCLAIMER: 'DEPOSIT_WITH_FIAT.MODAL_LEGAL_DISCLAIMER', + FIAT_MODAL_NEED_HELP: 'DEPOSIT_WITH_FIAT.MODAL_NEED_HELP', + FIAT_MODAL_SUBTITLE: 'DEPOSIT_WITH_FIAT.MODAL_SUBTITLE', + FIAT_NO_GAS_FEES: 'DEPOSIT_WITH_FIAT.NO_GAS_FEES_STYLED', + FIAT_PROMO_COPY: 'DEPOSIT_WITH_FIAT.PROMO_COPY', + FIAT_PROMO_CTA: 'DEPOSIT_WITH_FIAT.PROMO_CTA', + + // Trade Box Cards + STOP_AND_PROFIT_LIMIT_BODY: 'TRADE_BOX_CARDS.STOP_AND_PROFIT_LIMIT_BODY', + STOP_AND_PROFIT_LIMIT_TITLE: 'TRADE_BOX_CARDS.STOP_AND_PROFIT_LIMIT_TITLE', + + // Referrals + REFERRALS_COMPLETE_REGISTRATION: 'REFERRALS.COMPLETE_REGISTRATION', + REFERRALS_LEGAL_COPY_AFFILIATE_LINK: 'REFERRALS.LEGAL_COPY_AFFILIATE_LINK', + REFERRALS_LEGAL_COPY_REFERRAL_CODE: 'REFERRALS.LEGAL_COPY_REFERRAL_CODE', + REFERRALS_MANDATORY_REGISTRATION_DESC: 'REFERRALS.MANDATORY_REGISTRATION_DESC', + REFERRALS_MODAL_DESC: 'REFERRALS.MODAL_DESC', + REFERRALS_MODAL_DESC_REGISTRATION: 'REFERRALS.MODAL_DESC_REGISTRATION', + REFERRALS_MODAL_MORE_DESC: 'REFERRALS.MODAL_MORE_DESC', + REFERRALS_MODAL_TITLE: 'REFERRALS.MODAL_TITLE', + REFERRALS_PAUSED_REWARDS_BODY: 'REFERRALS.PAUSED_REWARDS_BODY', + REFERRALS_PAUSED_REWARDS_DESCRIPTION: 'REFERRALS.PAUSED_REWARDS_DESCRIPTION', + REFERRALS_PAUSED_REWARDS_MESSAGE: 'REFERRALS.PAUSED_REWARDS_MESSAGE', + REFERRALS_PENDING_REWARDS_MESSAGE: 'REFERRALS.PENDING_REWARDS_MESSAGE', + + // Deposit Promo + DEPOSIT_PROMO_ABOUT_TITLE: 'DEPOSIT_PROMO.DEPOSIT_PROMO_ABOUT_TITLE', + DEPOSIT_PROMO_ABOUT_DESCRIPTION: 'DEPOSIT_PROMO.DEPOSIT_PROMO_ABOUT_DESCRIPTION', + DEPOSIT_PROMO_ABOUT_CTA: 'DEPOSIT_PROMO.DEPOSIT_PROMO_ABOUT_CTA', + DEPOSIT_PROMO_PAUSED: 'DEPOSIT_PROMO.DEPOSIT_PROMO_PAUSED', + DEPOSIT_PROMO_STEP_1_TITLE_MAKE_A_DEPOSIT: + 'DEPOSIT_PROMO.DEPOSIT_PROMO_STEP_1_TITLE_MAKE_A_DEPOSIT', + DEPOSIT_PROMO_STEP_1_DESCRIPTION: 'DEPOSIT_PROMO.DEPOSIT_PROMO_STEP_1_DESCRIPTION', + DEPOSIT_PROMO_STEP_1_DESCRIPTION_SINGLE: 'DEPOSIT_PROMO.DEPOSIT_PROMO_STEP_1_DESCRIPTION_SINGLE', + DEPOSIT_PROMO_STEP_1_PENDING_DEPOSITS: 'DEPOSIT_PROMO.DEPOSIT_PROMO_STEP_1_PENDING_DEPOSITS', + DEPOSIT_PROMO_STEP_1_ELIGIBLE_DEPOSIT_AMOUNT: + 'DEPOSIT_PROMO.DEPOSIT_PROMO_STEP_1_ELIGIBLE_DEPOSIT_AMOUNT', + DEPOSIT_PROMO_STEP_1_ELIGIBLE_DEPOSIT_AMOUNT_TOTAL: + 'DEPOSIT_PROMO.DEPOSIT_PROMO_STEP_1_ELIGIBLE_DEPOSIT_AMOUNT_TOTAL', + DEPOSIT_PROMO_STEP_2_TITLE_LIVENESS_CHECK: + 'DEPOSIT_PROMO.DEPOSIT_PROMO_STEP_2_TITLE_LIVENESS_CHECK', + DEPOSIT_PROMO_STEP_2_DESCRIPTION: 'DEPOSIT_PROMO.DEPOSIT_PROMO_STEP_2_DESCRIPTION', + DEPOSIT_PROMO_STEP_2_VERIFY_LIVENESS: 'DEPOSIT_PROMO.DEPOSIT_PROMO_STEP_2_VERIFY_LIVENESS', + DEPOSIT_PROMO_STEP_2_CHECK_STATUS: 'DEPOSIT_PROMO.DEPOSIT_PROMO_STEP_2_CHECK_STATUS', + DEPOSIT_PROMO_STEP_2_LIVENESS_PENDING: 'DEPOSIT_PROMO.DEPOSIT_PROMO_STEP_2_LIVENESS_PENDING', + DEPOSIT_PROMO_STEP_2_LIVENESS_ELIGIBLE: 'DEPOSIT_PROMO.DEPOSIT_PROMO_STEP_2_LIVENESS_ELIGIBLE', + DEPOSIT_PROMO_STEP_2_LIVENESS_NOT_ELIGIBLE: + 'DEPOSIT_PROMO.DEPOSIT_PROMO_STEP_2_LIVENESS_NOT_ELIGIBLE', + DEPOSIT_PROMO_STEP_3_TITLE_RECEIVE_BONUS: + 'DEPOSIT_PROMO.DEPOSIT_PROMO_STEP_3_TITLE_RECEIVE_BONUS', + DEPOSIT_PROMO_STEP_3_DESCRIPTION: 'DEPOSIT_PROMO.DEPOSIT_PROMO_STEP_3_DESCRIPTION', + DEPOSIT_PROMO_STEP_3_BONUS_RECEIVED: 'DEPOSIT_PROMO.DEPOSIT_PROMO_STEP_3_BONUS_RECEIVED', + DEPOSIT_PROMO_STEP_3_VIEW_BONUS_TRANSFER: + 'DEPOSIT_PROMO.DEPOSIT_PROMO_STEP_3_VIEW_BONUS_TRANSFER', + DEPOSIT_PROMO_DISCLAIMER: 'DEPOSIT_PROMO.DEPOSIT_PROMO_DISCLAIMER', + + // Rewards + EPOCH_DISTRIBUTION_DESCRIPTION: 'REWARDS.EPOCH_DISTRIBUTION_DESCRIPTION', + EPOCH_ENDS_IN: 'REWARDS.EPOCH_ENDS_IN', + HOW_DO_DYDX_REWARDS_WORK: 'REWARDS.HOW_DO_DYDX_REWARDS_WORK', + REWARDS_CLAIMABLE: 'REWARDS.REWARDS_CLAIMABLE', + YOU_WILL_EARN: 'REWARDS.YOU_WILL_EARN', + + // Mnemonic Export + EXPORT_SECRET_PHRASE: 'MNEMONIC_EXPORT.EXPORT_SECRET_PHRASE', + HIDE_PHRASE: 'MNEMONIC_EXPORT.HIDE_PHRASE', + NEVER_SHARE_PHRASE: 'MNEMONIC_EXPORT.NEVER_SHARE_PHRASE', + REVEAL_SECRET_PHRASE: 'MNEMONIC_EXPORT.REVEAL_SECRET_PHRASE', + REVEAL_SECRET_PHRASE_DESCRIPTION: 'MNEMONIC_EXPORT.REVEAL_SECRET_PHRASE_DESCRIPTION', + SECRET_PHRASE_RISK: 'MNEMONIC_EXPORT.SECRET_PHRASE_RISK', + SECRET_PHRASE_RISK_ACK: 'MNEMONIC_EXPORT.SECRET_PHRASE_RISK_ACK', + SHOW_PHRASE: 'MNEMONIC_EXPORT.SHOW_PHRASE', + + // API Status + INDEXER_DOWN: 'API_STATUS.INDEXER_DOWN', + INDEXER_HALTED: 'API_STATUS.INDEXER_HALTED', + INDEXER_TRAILING: 'API_STATUS.INDEXER_TRAILING', + NODE_DOWN: 'API_STATUS.NODE_DOWN', + NODE_HALTED: 'API_STATUS.NODE_HALTED', + UNKNOWN_API_ERROR: 'API_STATUS.UNKNOWN_API_ERROR', +}; diff --git a/src/constants/localization/errors.ts b/src/constants/localization/errors.ts new file mode 100644 index 0000000..a8f931f --- /dev/null +++ b/src/constants/localization/errors.ts @@ -0,0 +1,126 @@ +export const ERROR_STRING_KEYS = { + // General errors + SOMETHING_WENT_WRONG_WITH_MESSAGE: 'ERRORS.GENERAL.SOMETHING_WENT_WRONG_WITH_MESSAGE', + SOMETHING_WENT_WRONG: 'ERRORS.GENERAL.SOMETHING_WENT_WRONG', + TIMESTAMP_DISCREPANCY: 'ERRORS.GENERAL.TIMESTAMP_DISCREPANCY', + + // Trade box errors + AMOUNT_INPUT_STEP_SIZE: 'ERRORS.TRADE_BOX.AMOUNT_INPUT_STEP_SIZE', + BRACKET_ORDER_FAILED_TO_PLACE: 'ERRORS.TRADE_BOX.BRACKET_ORDER_FAILED_TO_PLACE', + BRACKET_ORDER_STOP_LOSS_ABOVE_EXPECTED_PRICE: + 'ERRORS.TRADE_BOX.BRACKET_ORDER_STOP_LOSS_ABOVE_EXPECTED_PRICE', + BRACKET_ORDER_STOP_LOSS_ABOVE_LIQUIDATION_PRICE: + 'ERRORS.TRADE_BOX.BRACKET_ORDER_STOP_LOSS_ABOVE_LIQUIDATION_PRICE', + BRACKET_ORDER_STOP_LOSS_BELOW_EXPECTED_PRICE: + 'ERRORS.TRADE_BOX.BRACKET_ORDER_STOP_LOSS_BELOW_EXPECTED_PRICE', + BRACKET_ORDER_STOP_LOSS_BELOW_LIQUIDATION_PRICE: + 'ERRORS.TRADE_BOX.BRACKET_ORDER_STOP_LOSS_BELOW_LIQUIDATION_PRICE', + BRACKET_ORDER_TAKE_PROFIT_ABOVE_EXPECTED_PRICE: + 'ERRORS.TRADE_BOX.BRACKET_ORDER_TAKE_PROFIT_ABOVE_EXPECTED_PRICE', + BRACKET_ORDER_TAKE_PROFIT_ABOVE_LIQUIDATION_PRICE: + 'ERRORS.TRADE_BOX.BRACKET_ORDER_TAKE_PROFIT_ABOVE_LIQUIDATION_PRICE', + BRACKET_ORDER_TAKE_PROFIT_BELOW_EXPECTED_PRICE: + 'ERRORS.TRADE_BOX.BRACKET_ORDER_TAKE_PROFIT_BELOW_EXPECTED_PRICE', + BRACKET_ORDER_TAKE_PROFIT_BELOW_LIQUIDATION_PRICE: + 'ERRORS.TRADE_BOX.BRACKET_ORDER_TAKE_PROFIT_BELOW_LIQUIDATION_PRICE', + BUY_TRIGGER_TOO_CLOSE_TO_LIQUIDATION_PRICE: + 'ERRORS.TRADE_BOX.BUY_TRIGGER_TOO_CLOSE_TO_LIQUIDATION_PRICE', + INVALID_LARGE_POSITION_LEVERAGE: 'ERRORS.TRADE_BOX.INVALID_LARGE_POSITION_LEVERAGE', + INVALID_NEW_ACCOUNT_MARGIN_USAGE: 'ERRORS.TRADE_BOX.INVALID_NEW_ACCOUNT_MARGIN_USAGE', + INVALID_NEW_POSITION_LEVERAGE: 'ERRORS.TRADE_BOX.INVALID_NEW_POSITION_LEVERAGE', + LIMIT_MUST_ABOVE_TRIGGER_PRICE: 'ERRORS.TRADE_BOX.LIMIT_MUST_ABOVE_TRIGGER_PRICE', + LIMIT_MUST_BELOW_TRIGGER_PRICE: 'ERRORS.TRADE_BOX.LIMIT_MUST_BELOW_TRIGGER_PRICE', + LIMITED_ORDERS_FOR_PAIR: 'ERRORS.TRADE_BOX.LIMITED_ORDERS_FOR_PAIR', + MARKET_ORDER_ERROR_INDEX_PRICE_SLIPPAGE: + 'ERRORS.TRADE_BOX.MARKET_ORDER_ERROR_INDEX_PRICE_SLIPPAGE', + MARKET_ORDER_ERROR_ORDERBOOK_SLIPPAGE: 'ERRORS.TRADE_BOX.MARKET_ORDER_ERROR_ORDERBOOK_SLIPPAGE', + MARKET_ORDER_NOT_ENOUGH_LIQUIDITY: 'ERRORS.TRADE_BOX.MARKET_ORDER_NOT_ENOUGH_LIQUIDITY', + MARKET_ORDER_PRICE_IMPACT_AT_MAX_LEVERAGE: + 'ERRORS.TRADE_BOX.MARKET_ORDER_PRICE_IMPACT_AT_MAX_LEVERAGE', + NEW_POSITION_SIZE_OVER_MAX: 'ERRORS.TRADE_BOX.NEW_POSITION_SIZE_OVER_MAX', + NO_EQUITY_DEPOSIT_FIRST: 'ERRORS.TRADE_BOX.NO_EQUITY_DEPOSIT_FIRST', + ORDER_BELOW_COLLATERALIZATION: 'ERRORS.TRADE_BOX.ORDER_BELOW_COLLATERALIZATION', + ORDER_CROSSES_OWN_ORDER: 'ERRORS.TRADE_BOX.ORDER_CROSSES_OWN_ORDER', + ORDER_SIZE_BELOW_MIN_SIZE: 'ERRORS.TRADE_BOX.ORDER_SIZE_BELOW_MIN_SIZE', + ORDER_WITH_CURRENT_ORDERS_INVALID: 'ERRORS.TRADE_BOX.ORDER_WITH_CURRENT_ORDERS_INVALID', + ORDER_WOULD_FLIP_POSITION: 'ERRORS.TRADE_BOX.ORDER_WOULD_FLIP_POSITION', + SELL_TRIGGER_TOO_CLOSE_TO_LIQUIDATION_PRICE: + 'ERRORS.TRADE_BOX.SELL_TRIGGER_TOO_CLOSE_TO_LIQUIDATION_PRICE', + TAKER_FEE_INVALID: 'ERRORS.TRADE_BOX.TAKER_FEE_INVALID', + TRIGGER_MUST_ABOVE_INDEX_PRICE: 'ERRORS.TRADE_BOX.TRIGGER_MUST_ABOVE_INDEX_PRICE', + TRIGGER_MUST_BELOW_INDEX_PRICE: 'ERRORS.TRADE_BOX.TRIGGER_MUST_BELOW_INDEX_PRICE', + TRIGGER_TOO_CLOSE_TO_LIQUIDATION_PRICE: 'ERRORS.TRADE_BOX.TRIGGER_TOO_CLOSE_TO_LIQUIDATION_PRICE', + USER_MAX_ORDERS: 'ERRORS.TRADE_BOX.USER_MAX_ORDERS', + WOULD_NOT_REDUCE: 'ERRORS.TRADE_BOX.WOULD_NOT_REDUCE', + WOULD_NOT_REDUCE_UNCHECK: 'ERRORS.TRADE_BOX.WOULD_NOT_REDUCE_UNCHECK', + + // Onboarding errors + BANNED_USER: 'ERRORS.ONBOARDING.BANNED_USER', + INVALID_EMAIL: 'ERRORS.ONBOARDING.INVALID_EMAIL', + INVALID_USERNAME: 'ERRORS.ONBOARDING.INVALID_USERNAME', + KEY_RECOVERY_FAILED: 'ERRORS.ONBOARDING.KEY_RECOVERY_FAILED', + LEDGER_U2F_REQUIRED: 'ERRORS.ONBOARDING.LEDGER_U2F_REQUIRED', + USERNAME_TAKEN: 'ERRORS.ONBOARDING.USERNAME_TAKEN', + WALLET_NO_TRANSACTIONS: 'ERRORS.ONBOARDING.WALLET_NO_TRANSACTIONS', + + // Deposit modal errors + DEPOSIT_ACCOUNT_OUT_OF_SYNC: 'ERRORS.DEPOSIT_MODAL.DEPOSIT_ACCOUNT_OUT_OF_SYNC', + DEPOSIT_MORE_THAN_BALANCE: 'ERRORS.DEPOSIT_MODAL.DEPOSIT_MORE_THAN_BALANCE', + DEPOSIT_WRONG_NETWORK_PRODUCTION: 'ERRORS.DEPOSIT_MODAL.DEPOSIT_WRONG_NETWORK_PRODUCTION', + DEPOSIT_WRONG_NETWORK_STAGING: 'ERRORS.DEPOSIT_MODAL.DEPOSIT_WRONG_NETWORK_STAGING', + MUST_SPECIFY_ASSET: 'ERRORS.DEPOSIT_MODAL.MUST_SPECIFY_ASSET', + MUST_SPECIFY_CHAIN: 'ERRORS.DEPOSIT_MODAL.MUST_SPECIFY_CHAIN', + + // Withdraw modal errors + FAST_WITHDRAW_NOT_ENOUGH_LIQUIDITY: 'ERRORS.WITHDRAW_MODAL.FAST_WITHDRAW_NOT_ENOUGH_LIQUIDITY', + MAX_FAST_WITHDRAW_AMOUNT: 'ERRORS.WITHDRAW_MODAL.MAX_FAST_WITHDRAW_AMOUNT', + MIN_SLOW_WITHDRAW_AMOUNT: 'ERRORS.WITHDRAW_MODAL.MIN_SLOW_WITHDRAW_AMOUNT', + RESTRICTED_OPEN_POSITIONS_WITHDRAW: 'ERRORS.WITHDRAW_MODAL.RESTRICTED_OPEN_POSITIONS_WITHDRAW', + WITHDRAW_MORE_THAN_FREE_DUE_TO_FEE: 'ERRORS.WITHDRAW_MODAL.WITHDRAW_MORE_THAN_FREE_DUE_TO_FEE', + WITHDRAW_MORE_THAN_FREE: 'ERRORS.WITHDRAW_MODAL.WITHDRAW_MORE_THAN_FREE', + + // Transfer modal errors + TRANSFER_INVALID_ETH_ADDRESS: 'ERRORS.TRANSFER_MODAL.TRANSFER_INVALID_ETH_ADDRESS', + TRANSFER_MORE_THAN_FREE: 'ERRORS.TRANSFER_MODAL.TRANSFER_MORE_THAN_FREE', + TRANSFER_TO_YOURSELF: 'ERRORS.TRANSFER_MODAL.TRANSFER_TO_YOURSELF', + TRANSFER_INVALID_DYDX_ADDRESS: 'ERRORS.TRANSFER_MODAL.TRANSFER_INVALID_DYDX_ADDRESS', + + // Order errors + '2000_FILL_OR_KILL_ORDER_COULD_NOT_BE_FULLY_FILLED': + 'ERRORS.ORDER.2000_FILL_OR_KILL_ORDER_COULD_NOT_BE_FULLY_FILLED', + '2001_REDUCE_ONLY_WOULD_INCREASE_POSITION_SIZE': + 'ERRORS.ORDER.2001_REDUCE_ONLY_WOULD_INCREASE_POSITION_SIZE', + '2002_REDUCE_ONLY_WOULD_CHANGE_POSITION_SIDE': + 'ERRORS.ORDER.2002_REDUCE_ONLY_WOULD_CHANGE_POSITION_SIDE', + '2003_POST_ONLY_WOULD_CROSS_MAKER_ORDER': 'ERRORS.ORDER.2003_POST_ONLY_WOULD_CROSS_MAKER_ORDER', + '3000_INVALID_ORDER_FLAGS': 'ERRORS.ORDER.3000_INVALID_ORDER_FLAGS', + '3001_INVALID_STATEFUL_ORDER_GOOD_TIL_BLOCK_TIME': + 'ERRORS.ORDER.3001_INVALID_STATEFUL_ORDER_GOOD_TIL_BLOCK_TIME', + '3002_STATEFUL_ORDERS_CANNOT_REQUIRE_IMMEDIATE_EXECUTION': + 'ERRORS.ORDER.3002_STATEFUL_ORDERS_CANNOT_REQUIRE_IMMEDIATE_EXECUTION', + '3003_TIME_EXCEEDS_GOOD_TIL_BLOCK_TIME': 'ERRORS.ORDER.3003_TIME_EXCEEDS_GOOD_TIL_BLOCK_TIME', + '3004_GOOD_TIL_BLOCK_TIME_EXCEEDS_STATEFUL_ORDER_TIME_WINDOW': + 'ERRORS.ORDER.3004_GOOD_TIL_BLOCK_TIME_EXCEEDS_STATEFUL_ORDER_TIME_WINDOW', + '3005_STATEFUL_ORDER_ALREADY_EXISTS': 'ERRORS.ORDER.3005_STATEFUL_ORDER_ALREADY_EXISTS', + '3006_STATEFUL_ORDER_DOES_NOT_EXIST': 'ERRORS.ORDER.3006_STATEFUL_ORDER_DOES_NOT_EXIST', + '3007_STATEFUL_ORDER_COLLATERALIZATION_CHECK_FAILED': + 'ERRORS.ORDER.3007_STATEFUL_ORDER_COLLATERALIZATION_CHECK_FAILED', + '3008_STATEFUL_ORDER_PREVIOUSLY_CANCELLED': + 'ERRORS.ORDER.3008_STATEFUL_ORDER_PREVIOUSLY_CANCELLED', +}; + +export const ORDER_ERROR_CODE_MAP: { [key: number]: string } = { + 2000: ERROR_STRING_KEYS['2000_FILL_OR_KILL_ORDER_COULD_NOT_BE_FULLY_FILLED'], + 2001: ERROR_STRING_KEYS['2001_REDUCE_ONLY_WOULD_INCREASE_POSITION_SIZE'], + 2002: ERROR_STRING_KEYS['2002_REDUCE_ONLY_WOULD_CHANGE_POSITION_SIDE'], + 2003: ERROR_STRING_KEYS['2003_POST_ONLY_WOULD_CROSS_MAKER_ORDER'], + 3000: ERROR_STRING_KEYS['3000_INVALID_ORDER_FLAGS'], + 3001: ERROR_STRING_KEYS['3001_INVALID_STATEFUL_ORDER_GOOD_TIL_BLOCK_TIME'], + 3002: ERROR_STRING_KEYS['3002_STATEFUL_ORDERS_CANNOT_REQUIRE_IMMEDIATE_EXECUTION'], + 3003: ERROR_STRING_KEYS['3003_TIME_EXCEEDS_GOOD_TIL_BLOCK_TIME'], + 3004: ERROR_STRING_KEYS['3004_GOOD_TIL_BLOCK_TIME_EXCEEDS_STATEFUL_ORDER_TIME_WINDOW'], + 3005: ERROR_STRING_KEYS['3005_STATEFUL_ORDER_ALREADY_EXISTS'], + 3006: ERROR_STRING_KEYS['3006_STATEFUL_ORDER_DOES_NOT_EXIST'], + 3007: ERROR_STRING_KEYS['3007_STATEFUL_ORDER_COLLATERALIZATION_CHECK_FAILED'], + 3008: ERROR_STRING_KEYS['3008_STATEFUL_ORDER_PREVIOUSLY_CANCELLED'], +}; diff --git a/src/constants/localization/index.ts b/src/constants/localization/index.ts new file mode 100644 index 0000000..0908dd2 --- /dev/null +++ b/src/constants/localization/index.ts @@ -0,0 +1,79 @@ +import enLocaleData from '@/localization/en'; + +import { APP_STRING_KEYS } from './app'; +import { ERROR_STRING_KEYS } from './errors'; +import { WARNING_STRING_KEYS } from './warnings'; + +export enum SupportedLocales { + EN = 'en', + ZH_CN = 'zh-CN', + JA = 'ja', + KO = 'ko', + RU = 'ru', + TR = 'tr', + FR = 'fr', + PT = 'pt', + ES = 'es', + DE = 'de', +} + +export type LocaleData = typeof enLocaleData; + +export type StringGetterFunction = (a: { + key: string; + params?: { + [key: string]: string | React.ReactNode; + }; +}) => string; + +export const SUPPORTED_LOCALE_STRING_LABELS: { [key in SupportedLocales]: string } = { + [SupportedLocales.EN]: 'English', + [SupportedLocales.ZH_CN]: '中文', + [SupportedLocales.JA]: '日本語', + [SupportedLocales.KO]: '한국어', + [SupportedLocales.RU]: 'русский', + [SupportedLocales.TR]: 'Türkçe', + [SupportedLocales.FR]: 'Français', + [SupportedLocales.PT]: 'Português', + [SupportedLocales.ES]: 'Español', + [SupportedLocales.DE]: 'Deutsch', +}; + +export const SUPPORTED_LOCALE_BASE_TAGS = { + [SupportedLocales.EN]: 'en', + [SupportedLocales.ZH_CN]: 'zh', + [SupportedLocales.JA]: 'ja', + [SupportedLocales.KO]: 'ko', + [SupportedLocales.RU]: 'ru', + [SupportedLocales.TR]: 'tr', + [SupportedLocales.FR]: 'fr', + [SupportedLocales.PT]: 'pt', + [SupportedLocales.ES]: 'es', + [SupportedLocales.DE]: 'de', +}; + +export const SUPPORTED_BASE_TAGS_LOCALE_MAPPING = Object.fromEntries( + Object.entries(SUPPORTED_LOCALE_BASE_TAGS).map(([locale, baseTag]) => [baseTag, locale]) +); + +export const STRING_KEYS: Record = { + ...APP_STRING_KEYS, + ...ERROR_STRING_KEYS, + ...WARNING_STRING_KEYS, +}; + +export { TOOLTIP_STRING_KEYS } from './tooltips'; + +export type TooltipStrings = { + [key: string]: ({ + stringGetter, + stringParams, + }: { + stringGetter: StringGetterFunction; + stringParams?: any; + }) => { + title: string; + body: string; + learnMoreLink?: string; + }; +}; diff --git a/src/constants/localization/tooltips.ts b/src/constants/localization/tooltips.ts new file mode 100644 index 0000000..4f6af96 --- /dev/null +++ b/src/constants/localization/tooltips.ts @@ -0,0 +1,120 @@ +export const TOOLTIP_STRING_KEYS = { + // General Tooltips + LEGACY_SIGNING_BODY: 'TOOLTIPS.GENERAL.LEGACY_SIGNING.BODY', + LEGACY_SIGNING_TITLE: 'TOOLTIPS.GENERAL.LEGACY_SIGNING.TITLE', + + REMEMBER_ME_BODY: 'TOOLTIPS.GENERAL.REMEMBER_ME.BODY', + REMEMBER_ME_TITLE: 'TOOLTIPS.GENERAL.REMEMBER_ME.TITLE', + + DYDX_ADDRESS_BODY: 'TOOLTIPS.GENERAL.DYDX_ADDRESS.BODY', + + // Deposit Modal Tooltips + AVAILABLE_GASLESS_DEPOSITS_BODY: 'TOOLTIPS.DEPOSIT.AVAILABLE_GASLESS_DEPOSITS.BODY', + AVAILABLE_GASLESS_DEPOSITS_TITLE: 'TOOLTIPS.DEPOSIT.AVAILABLE_GASLESS_DEPOSITS.TITLE', + DISABLED_GASLESS_DEPOSITS_BODY: 'TOOLTIPS.DEPOSIT.DISABLED_GASLESS_DEPOSITS.BODY', + DISABLED_GASLESS_DEPOSITS_TITLE: 'TOOLTIPS.DEPOSIT.DISABLED_GASLESS_DEPOSITS.TITLE', + GASLESS_DEPOSITS_BODY: 'TOOLTIPS.DEPOSIT.GASLESS_DEPOSITS.BODY', + GASLESS_DEPOSITS_TITLE: 'TOOLTIPS.DEPOSIT.GASLESS_DEPOSITS.TITLE', + SWAP_BODY: 'TOOLTIPS.DEPOSIT.SWAP.BODY', + SWAP_TITLE: 'TOOLTIPS.DEPOSIT.SWAP.TITLE', + + // Portfolio Tooltips + HOLDING_HEDGIES_BODY: 'TOOLTIPS.PORTFOLIO.HOLDING_HEDGIES.BODY', + HOLDING_HEDGIES_TITLE: 'TOOLTIPS.PORTFOLIO.HOLDING_HEDGIES.TITLE', + + // Withdraw Modal Tooltips + FAST_WITHDRAW_FEE_BODY: 'TOOLTIPS.WITHDRAW.FAST_WITHDRAW_FEE.BODY', + FAST_WITHDRAW_FEE_TITLE: 'TOOLTIPS.WITHDRAW.FAST_WITHDRAW_FEE.TITLE', + WITHDRAW_TYPES_BODY: 'TOOLTIPS.WITHDRAW.WITHDRAW_TYPES.BODY', + WITHDRAW_TYPES_TITLE: 'TOOLTIPS.WITHDRAW.WITHDRAW_TYPES.TITLE', + + // Trade Tooltips + ACCOUNT_LEVERAGE_BODY: 'TOOLTIPS.TRADE.ACCOUNT_LEVERAGE.BODY', + ACCOUNT_LEVERAGE_TITLE: 'TOOLTIPS.TRADE.ACCOUNT_LEVERAGE.TITLE', + BRACKET_ORDER_SL_BODY: 'TOOLTIPS.TRADE.BRACKET_ORDER_SL.BODY', + BRACKET_ORDER_SL_TITLE: 'TOOLTIPS.TRADE.BRACKET_ORDER_SL.TITLE', + BRACKET_ORDER_TP_BODY: 'TOOLTIPS.TRADE.BRACKET_ORDER_TP.BODY', + BRACKET_ORDER_TP_TITLE: 'TOOLTIPS.TRADE.BRACKET_ORDER_TP.TITLE', + BUYING_POWER_BODY: 'TOOLTIPS.TRADE.BUYING_POWER.BODY', + BUYING_POWER_TITLE: 'TOOLTIPS.TRADE.BUYING_POWER.TITLE', + DEFAULT_EXECUTION_BODY: 'TOOLTIPS.TRADE.DEFAULT_EXECUTION.BODY', + DEFAULT_EXECUTION_TITLE: 'TOOLTIPS.TRADE.DEFAULT_EXECUTION.TITLE', + EQUITY_BODY: 'TOOLTIPS.TRADE.EQUITY.BODY', + EQUITY_TITLE: 'TOOLTIPS.TRADE.EQUITY.TITLE', + EXPECTED_PRICE_BODY: 'TOOLTIPS.TRADE.EXPECTED_PRICE.BODY', + EXPECTED_PRICE_TITLE: 'TOOLTIPS.TRADE.EXPECTED_PRICE.TITLE', + FEE_BODY: 'TOOLTIPS.TRADE.FEE.BODY', + FEE_TITLE: 'TOOLTIPS.TRADE.FEE.TITLE', + FILL_OR_KILL_BODY: 'TOOLTIPS.TRADE.FILL_OR_KILL.BODY', + FILL_OR_KILL_TITLE: 'TOOLTIPS.TRADE.FILL_OR_KILL.TITLE', + FREE_COLLATERAL_BODY: 'TOOLTIPS.TRADE.FREE_COLLATERAL.BODY', + FREE_COLLATERAL_TITLE: 'TOOLTIPS.TRADE.FREE_COLLATERAL.TITLE', + GOOD_TIL_BODY: 'TOOLTIPS.TRADE.GOOD_TIL.BODY', + GOOD_TIL_TITLE: 'TOOLTIPS.TRADE.GOOD_TIL.TITLE', + IMMEDIATE_OR_CANCEL_BODY: 'TOOLTIPS.TRADE.IMMEDIATE_OR_CANCEL.BODY', + IMMEDIATE_OR_CANCEL_TITLE: 'TOOLTIPS.TRADE.IMMEDIATE_OR_CANCEL.TITLE', + INDEX_PRICE_BODY: 'TOOLTIPS.TRADE.INDEX_PRICE.BODY', + INDEX_PRICE_TITLE: 'TOOLTIPS.TRADE.INDEX_PRICE.TITLE', + INITIAL_MARGIN_FRACTION_BODY: 'TOOLTIPS.TRADE.INITIAL_MARGIN_FRACTION.BODY', + INITIAL_MARGIN_FRACTION_TITLE: 'TOOLTIPS.TRADE.INITIAL_MARGIN_FRACTION.TITLE', + INITIAL_STOP_BODY: 'TOOLTIPS.TRADE.INITIAL_STOP.BODY', + INITIAL_STOP_TITLE: 'TOOLTIPS.TRADE.INITIAL_STOP.TITLE', + LEVERAGE_BODY: 'TOOLTIPS.TRADE.LEVERAGE.BODY', + LEVERAGE_TITLE: 'TOOLTIPS.TRADE.LEVERAGE.TITLE', + LIMIT_PRICE_BODY: 'TOOLTIPS.TRADE.LIMIT_PRICE.BODY', + LIMIT_PRICE_TITLE: 'TOOLTIPS.TRADE.LIMIT_PRICE.TITLE', + LIMIT_PRICE_SLIPPAGE_BODY: 'TOOLTIPS.TRADE.LIMIT_PRICE_SLIPPAGE.BODY', + LIMIT_PRICE_SLIPPAGE_TITLE: 'TOOLTIPS.TRADE.LIMIT_PRICE_SLIPPAGE.TITLE', + LIQUIDATION_PRICE_BODY: 'TOOLTIPS.TRADE.LIQUIDATION_PRICE.BODY', + LIQUIDATION_PRICE_TITLE: 'TOOLTIPS.TRADE.LIQUIDATION_PRICE.TITLE', + LIQUIDATION_PRICE_GENERAL_BODY: 'TOOLTIPS.TRADE.LIQUIDATION_PRICE_GENERAL.BODY', + LIQUIDATION_PRICE_GENERAL_TITLE: 'TOOLTIPS.TRADE.LIQUIDATION_PRICE_GENERAL.TITLE', + LIQUIDITY_BODY: 'TOOLTIPS.TRADE.LIQUIDITY.BODY', + LIQUIDITY_TITLE: 'TOOLTIPS.TRADE.LIQUIDITY.TITLE', + MAINTENANCE_MARGIN_FRACTION_BODY: 'TOOLTIPS.TRADE.MAINTENANCE_MARGIN_FRACTION.BODY', + MAINTENANCE_MARGIN_FRACTION_TITLE: 'TOOLTIPS.TRADE.MAINTENANCE_MARGIN_FRACTION.TITLE', + MAKER_FEE_BODY: 'TOOLTIPS.TRADE.MAKER_FEE.BODY', + MAKER_FEE_TITLE: 'TOOLTIPS.TRADE.MAKER_FEE.TITLE', + MARGIN_USAGE_BODY: 'TOOLTIPS.TRADE.MARGIN_USAGE.BODY', + MARGIN_USAGE_TITLE: 'TOOLTIPS.TRADE.MARGIN_USAGE.TITLE', + MAX_WITHDRAW_BODY: 'TOOLTIPS.TRADE.MAX_WITHDRAW.BODY', + MAX_WITHDRAW_TITLE: 'TOOLTIPS.TRADE.MAX_WITHDRAW.TITLE', + MAXIMUM_LEVERAGE_BODY: 'TOOLTIPS.TRADE.MAXIMUM_LEVERAGE.BODY', + MAXIMUM_LEVERAGE_TITLE: 'TOOLTIPS.TRADE.MAXIMUM_LEVERAGE.TITLE', + NET_FUNDING_BODY: 'TOOLTIPS.TRADE.NET_FUNDING.BODY', + NET_FUNDING_TITLE: 'TOOLTIPS.TRADE.NET_FUNDING.TITLE', + OPEN_INTEREST_BODY: 'TOOLTIPS.TRADE.OPEN_INTEREST.BODY', + OPEN_INTEREST_TITLE: 'TOOLTIPS.TRADE.OPEN_INTEREST.TITLE', + ORACLE_PRICE_BODY: 'TOOLTIPS.TRADE.ORACLE_PRICE.BODY', + ORACLE_PRICE_TITLE: 'TOOLTIPS.TRADE.ORACLE_PRICE.TITLE', + ORDER_AMOUNT_BODY: 'TOOLTIPS.TRADE.ORDER_AMOUNT.BODY', + ORDER_AMOUNT_TITLE: 'TOOLTIPS.TRADE.ORDER_AMOUNT.TITLE', + ORDER_AMOUNT_USD_BODY: 'TOOLTIPS.TRADE.ORDER_AMOUNT_USD.BODY', + ORDER_AMOUNT_USD_TITLE: 'TOOLTIPS.TRADE.ORDER_AMOUNT_USD.TITLE', + POST_ONLY_BODY: 'TOOLTIPS.TRADE.POST_ONLY.BODY', + POST_ONLY_TITLE: 'TOOLTIPS.TRADE.POST_ONLY.TITLE', + PRICE_IMPACT_BODY: 'TOOLTIPS.TRADE.PRICE_IMPACT.BODY', + PRICE_IMPACT_TITLE: 'TOOLTIPS.TRADE.PRICE_IMPACT.TITLE', + REALIZED_PNL_BODY: 'TOOLTIPS.TRADE.REALIZED_PNL.BODY', + REALIZED_PNL_TITLE: 'TOOLTIPS.TRADE.REALIZED_PNL.TITLE', + REDUCE_ONLY_BODY: 'TOOLTIPS.TRADE.REDUCE_ONLY.BODY', + REDUCE_ONLY_TITLE: 'TOOLTIPS.TRADE.REDUCE_ONLY.TITLE', + STEP_SIZE_BODY: 'TOOLTIPS.TRADE.STEP_SIZE.BODY', + STEP_SIZE_TITLE: 'TOOLTIPS.TRADE.STEP_SIZE.TITLE', + TAKER_FEE_BODY: 'TOOLTIPS.TRADE.TAKER_FEE.BODY', + TAKER_FEE_TITLE: 'TOOLTIPS.TRADE.TAKER_FEE.TITLE', + TICK_SIZE_BODY: 'TOOLTIPS.TRADE.TICK_SIZE.BODY', + TICK_SIZE_TITLE: 'TOOLTIPS.TRADE.TICK_SIZE.TITLE', + TIME_IN_FORCE_BODY: 'TOOLTIPS.TRADE.TIME_IN_FORCE.BODY', + TIME_IN_FORCE_TITLE: 'TOOLTIPS.TRADE.TIME_IN_FORCE.TITLE', + TRAILING_PERCENT_BODY: 'TOOLTIPS.TRADE.TRAILING_PERCENT.BODY', + TRAILING_PERCENT_TITLE: 'TOOLTIPS.TRADE.TRAILING_PERCENT.TITLE', + TRIGGER_PRICE_BODY: 'TOOLTIPS.TRADE.TRIGGER_PRICE.BODY', + TRIGGER_PRICE_TITLE: 'TOOLTIPS.TRADE.TRIGGER_PRICE.TITLE', + UNREALIZED_PNL_BODY: 'TOOLTIPS.TRADE.UNREALIZED_PNL.BODY', + UNREALIZED_PNL_TITLE: 'TOOLTIPS.TRADE.UNREALIZED_PNL.TITLE', + + // Email Notifications + VERIFY_EMAIL_BODY: 'TOOLTIPS.EMAIL_NOTIFICATIONS.VERIFY_EMAIL.BODY', + VERIFY_EMAIL_TITLE: 'TOOLTIPS.EMAIL_NOTIFICATIONS.VERIFY_EMAIL.TITLE', +}; diff --git a/src/constants/localization/warnings.ts b/src/constants/localization/warnings.ts new file mode 100644 index 0000000..a205a9f --- /dev/null +++ b/src/constants/localization/warnings.ts @@ -0,0 +1,19 @@ +export const WARNING_STRING_KEYS = { + // Onboarding + ALWAYS_VERIFY_URL: 'WARNINGS.ONBOARDING.ALWAYS_VERIFY_URL', + + // Trade Box + LIMIT_PRICE_TRIGGER_PRICE_SLIPPAGE_HIGHER: + 'WARNINGS.TRADE_BOX.LIMIT_PRICE_TRIGGER_PRICE_SLIPPAGE_HIGHER', + LIMIT_PRICE_TRIGGER_PRICE_SLIPPAGE_LOWER: + 'WARNINGS.TRADE_BOX.LIMIT_PRICE_TRIGGER_PRICE_SLIPPAGE_LOWER', + MARKET_ORDER_CLOSE_TO_MAX_LEVERAGE: 'WARNINGS.TRADE_BOX.MARKET_ORDER_CLOSE_TO_MAX_LEVERAGE', + MARKET_ORDER_WARNING_INDEX_PRICE_SLIPPAGE: + 'WARNINGS.TRADE_BOX.MARKET_ORDER_WARNING_INDEX_PRICE_SLIPPAGE', + MARKET_ORDER_WARNING_ORDERBOOK_SLIPPAGE: + 'WARNINGS.TRADE_BOX.MARKET_ORDER_WARNING_ORDERBOOK_SLIPPAGE', + MARKET_STATUS_CLOSE_ONLY: 'WARNINGS.TRADE_BOX.MARKET_STATUS_CLOSE_ONLY', + STOP_MARKET_ORDER_MAY_NOT_EXECUTE: 'WARNINGS.TRADE_BOX.STOP_MARKET_ORDER_MAY_NOT_EXECUTE', + TAKE_PROFIT_MARKET_ORDER_MAY_NOT_EXECUTE: + 'WARNINGS.TRADE_BOX.TAKE_PROFIT_MARKET_ORDER_MAY_NOT_EXECUTE', +}; diff --git a/src/constants/markets.ts b/src/constants/markets.ts new file mode 100644 index 0000000..6d534c6 --- /dev/null +++ b/src/constants/markets.ts @@ -0,0 +1,58 @@ +import { Asset, PerpetualMarket } from '@/constants/abacus'; +import { STRING_KEYS } from '@/constants/localization'; + +export interface Market { + market: string; + status: string; + baseAsset: string; + quoteAsset: string; + stepSize: string; + tickSize: string; + oraclePrice: string; + priceChange24H: string; + nextFundingRate: string; + nextFundingAt: string; + minOrderSize: string; + type: string; + initialMarginFraction: string; + maintenanceMarginFraction: string; + volume24H: string; + trades24H: string; + openInterest: string; + incrementalInitialMarginFraction: string; + incrementalPositionSize: string; + maxPositionSize: string; + baselinePositionSize: string; + assetResolution: string; + syntheticAssetId: string; +} + +export type AllMarkets = { + [market: string]: Market; +}; + +export type MarketData = { + asset: Asset; + tickSizeDecimals: number; +} & PerpetualMarket & + PerpetualMarket['perpetual'] & + PerpetualMarket['configs']; + +export enum MarketFilters { + ALL = 'all', + LAYER_1 = 'Layer 1', + DEFI = 'Defi', +} + +export const MARKET_FILTER_LABELS = { + [MarketFilters.ALL]: STRING_KEYS.ALL, + [MarketFilters.LAYER_1]: STRING_KEYS.LAYER_1, + [MarketFilters.DEFI]: STRING_KEYS.DEFI, +}; + +export const DEFAULT_MARKETID = 'ETH-USD'; + +export enum FundingDirection { + ToShort = 'ToShort', + ToLong = 'ToLong', +} diff --git a/src/constants/menus.ts b/src/constants/menus.ts new file mode 100644 index 0000000..b350873 --- /dev/null +++ b/src/constants/menus.ts @@ -0,0 +1,37 @@ +import type React from 'react'; + +export type MenuConfig< + MenuItemValue extends string | number, + MenuGroupValue extends string | number, + MenuItemTypes extends string | number = string | number +> = MenuGroup[]; + +export type MenuGroup< + MenuItemValue extends string | number, + MenuGroupValue extends string | number, + MenuItemTypes extends string | number = string | number +> = { + group: MenuGroupValue; + groupLabel?: string; + items: MenuItem[]; +}; + +export type MenuItem = { + type?: MenuItemTypes; + value: MenuItemValue; + + slotBefore?: React.ReactNode; + label: string; + labelRight?: React.ReactNode; + tag?: React.ReactNode; + slotAfter?: React.ReactNode; + description?: string; + + href?: string; + onSelect?: (key: MenuItemValue) => void; + onClick?: () => void; + + disabled?: boolean; + + subitems?: MenuItem[]; +}; diff --git a/src/constants/mockData.ts b/src/constants/mockData.ts new file mode 100644 index 0000000..2e07d40 --- /dev/null +++ b/src/constants/mockData.ts @@ -0,0 +1,35 @@ +// Mock data for offline testing + +import type { MarketHistoricalFunding } from './abacus'; +import { timeUnits } from './time'; + +export const mockHistoricalFundingData = Array.from( + { length: 100 }, + (_, i) => + ({ + effectiveAtMilliseconds: + timeUnits.hour * Math.floor(Date.now() / timeUnits.hour) - (100 - i - 1) * timeUnits.hour, + rate: (Math.random() - 0.5) * 0.0001, + } as MarketHistoricalFunding) +); + +export const mockSubaccountPnlData = Array.from({ length: 3000 }, (_, i) => { + const j = 3000 - i - 1; + const netTransfers = 2000 + Math.floor(i / 150) * 1500 - Math.floor(i / 400) * 2500; + + const equity = + (Math.random() - 0.5) * 400 + + Math.sin(i * 0.5) * 200 + + Math.sin(i * 0.08) * Math.cos(i * 0.18) * 500; + + const totalPnl = netTransfers + equity; + + return { + id: i, + subaccountId: 0, + equity, + totalPnl, + netTransfers, + createdAt: j ? timeUnits.hour * (Math.floor(Date.now() / timeUnits.hour) - j) : Date.now(), + }; +}); diff --git a/src/constants/networks.tsx b/src/constants/networks.tsx new file mode 100644 index 0000000..f0a079f --- /dev/null +++ b/src/constants/networks.tsx @@ -0,0 +1,73 @@ +export enum DydxV4Network { + V4Mainnet = 'dydxprotocol-mainnet', + V4Staging = 'dydxprotocol-staging', + V4Testnet2 = 'dydxprotocol-testnet-2', + V4Local = 'dydxprotocol-dev', +} + +export enum DydxV3Network { + V3Mainnet = '1', + V3Testnet = '5', +} + +export function isDydxV4Network(network: any): network is DydxV4Network { + return Object.values(DydxV4Network).includes(network); +} + +export function isValidDydxNetwork(network: any): boolean { + return isDydxV4Network(network) || Object.values(DydxV3Network).includes(network); +} + +export type DydxNetwork = DydxV4Network | DydxV3Network; + +export const CHAIN_IDS = { + [DydxV4Network.V4Mainnet]: '', + [DydxV4Network.V4Staging]: 'dydxprotocol-testnet', + [DydxV4Network.V4Testnet2]: 'dydx-testnet-2', + [DydxV4Network.V4Local]: 'dydxprotocol-testnet', + [DydxV3Network.V3Mainnet]: '1', + [DydxV3Network.V3Testnet]: '5', +}; + +export const DEFAULT_APP_ENVIRONMENT = + import.meta.env.MODE === 'production' ? DydxV4Network.V4Testnet2 : DydxV4Network.V4Staging; + +export const CLIENT_NETWORK_CONFIGS: Record< + DydxV4Network, + { + chainId: string; + validatorUrl: string; + faucetUrl: string; + indexerUrl: string; + ethereumChainId: number; + } +> = { + [DydxV4Network.V4Mainnet]: { + chainId: CHAIN_IDS[DydxV4Network.V4Mainnet], + validatorUrl: import.meta.env.VITE_VALIDATOR_URL_STAGE, + faucetUrl: import.meta.env.VITE_FAUCET_URL_STAGE, + indexerUrl: import.meta.env.VITE_INDEXER_URL_STAGE, + ethereumChainId: 1, + }, + [DydxV4Network.V4Local]: { + chainId: CHAIN_IDS[DydxV4Network.V4Local], + validatorUrl: import.meta.env.VITE_VALIDATOR_URL_DEV, + faucetUrl: import.meta.env.VITE_FAUCET_URL_DEV, + indexerUrl: import.meta.env.VITE_INDEXER_URL_DEV, + ethereumChainId: 5, + }, + [DydxV4Network.V4Staging]: { + chainId: CHAIN_IDS[DydxV4Network.V4Staging], + validatorUrl: import.meta.env.VITE_VALIDATOR_URL_STAGE, + faucetUrl: import.meta.env.VITE_FAUCET_URL_STAGE, + indexerUrl: import.meta.env.VITE_INDEXER_URL_STAGE, + ethereumChainId: 5, + }, + [DydxV4Network.V4Testnet2]: { + chainId: CHAIN_IDS[DydxV4Network.V4Testnet2], + validatorUrl: import.meta.env.VITE_VALIDATOR_URL_TESTNET2, + faucetUrl: import.meta.env.VITE_FAUCET_URL_TESTNET2, + indexerUrl: import.meta.env.VITE_INDEXER_URL_TESTNET2, + ethereumChainId: 5, + }, +}; diff --git a/src/constants/notifications.ts b/src/constants/notifications.ts new file mode 100644 index 0000000..486ca4b --- /dev/null +++ b/src/constants/notifications.ts @@ -0,0 +1,103 @@ +/** implemented in useNotificationTypes */ +export enum NotificationType { + OrderStatusChanged = 'OrderStatusChanged', +} + +export enum NotificationComponentType {} + +export type NotificationId = string | number + +export type NotificationTypeConfig<_NotificationId extends NotificationId = string, NotificationUpdateKey = any> = { + type: NotificationType; + + /** React hook to trigger notifications based on app state */ + useTrigger: (_: { + trigger: ( + /** Unique ID for the triggered notification */ + id: _NotificationId, + + /** Display data for the triggered notification */ + displayData: NotificationDisplayData, + + /** + * JSON-serializable key. + * Re-triggers the notification if passed a different value from the last trigger() call (even from a previous browser session). + * Suggested usage: data dependency array + */ + updateKey?: NotificationUpdateKey, + + /** + * @param true (default): Notification initialized with status NotificationStatus.Triggered + * @param false: Notification initialized with status NotificationStatus.Cleared + */ + isNew?: boolean, + ) => void; + + lastUpdated: number; + }) => void; + + /** Callback for notification action (Toast action button click, NotificationsMenu item click, or native push notification interaction) */ + useNotificationAction?: () => (id: _NotificationId) => any; +}; + +export enum NotificationStatus { + /** Notification triggered for the first time. Toast timer started. "New" in NotificationsMenu. */ + Triggered, + + /** Notification re-triggered with a different NotificationUpdateKey. Toast timer restarted. "New" in NotificationsMenu. */ + Updated, + + /** Toast timer expired without user interaction. "New" in NotificationsMenu. */ + Unseen, + + /** Toast or NotificationsMenu item interacted with or dismissed. "Seen" in NotificationsMenu. */ + Seen, + + /** Notification marked for deletion. "Archived" in NotificationsMenu. */ + Cleared, +} + +/** Notification state. Serialized and cached into localStorage. */ +export type Notification<_NotificationId extends NotificationId = string, NotificationUpdateKey = any> = { + id: _NotificationId; + type: NotificationType; + status: NotificationStatus; + timestamps: Partial>; + updateKey: NotificationUpdateKey; +}; + +export type Notifications = Record>; + +/** Notification display data derived from app state at runtime. */ +export type NotificationDisplayData = { + icon?: React.ReactNode; + + title?: string; + + description?: string; + + actionDescription?: string; + + /** Screen reader: instructions for performing toast action after its timer expires */ + actionAltText?: string; + + /** + * @param foreground + Screen reader: announces immediately. + Push notification: vibrates device. + * @param background + Screen reader: announces at the next graceful opportunity. + Push notification: no vibration. + */ + toastSensitivity?: 'foreground' | 'background'; + + /** + * @param number + Radix UI Toast: automatically Unseen. + Push notification: requires interaction. + * @param Infinity + Radix UI Toast: no timer. + Push notification: requires interaction. + */ + toastDuration?: number; +}; diff --git a/src/constants/numbers.ts b/src/constants/numbers.ts new file mode 100644 index 0000000..8a28f00 --- /dev/null +++ b/src/constants/numbers.ts @@ -0,0 +1,22 @@ +import { getSeparator } from '@/lib/numbers'; + +export const USD_DECIMALS = 2; +export const SMALL_USD_DECIMALS = 4; + +export const PERCENT_DECIMALS = 2; +export const SMALL_PERCENT_DECIMALS = 4; +export const TINY_PERCENT_DECIMALS = 6; + +export const INTEGER_DECIMALS = 0; +export const LEVERAGE_DECIMALS = 2; +export const TOKEN_DECIMALS = 4; +export const LARGE_TOKEN_DECIMALS = 2; +export const FEE_DECIMALS = 3; + +export const QUANTUM_MULTIPLIER = 1_000_000; + +export enum NumberSign { + Positive = 'Positive', + Negative = 'Negative', + Neutral = 'Neutral', +} diff --git a/src/constants/page.ts b/src/constants/page.ts new file mode 100644 index 0000000..b3dc20f --- /dev/null +++ b/src/constants/page.ts @@ -0,0 +1,13 @@ +export const BREAKPOINT_REM = { + mobile: '48rem', + tablet: '64rem', + desktopSmall: '80rem', + desktopMedium: '90rem', + desktopLarge: '120rem', +}; + +export const PAGE_REM = { + maxContentWidth: '80rem', + collapsedSidebarWidth: '3.5rem', + sidebarWidth: '20.25rem', +}; diff --git a/src/constants/routes.ts b/src/constants/routes.ts new file mode 100644 index 0000000..bd8642a --- /dev/null +++ b/src/constants/routes.ts @@ -0,0 +1,40 @@ +export enum AppRoute { + Markets = '/markets', + Portfolio = '/portfolio', + Trade = '/trade', + Profile = '/profile', + Alerts = '/alerts', + Settings = '/settings', + Rewards = '/DYDX', +} + +export enum PortfolioRoute { + Fees = 'fees', + History = 'history', + Orders = 'orders', + Overview = 'overview', + Positions = 'positions', +} + +export enum HistoryRoute { + Trades = 'trades', + Transfers = 'transfers', + Payments = 'payments', +} + +export enum MobileSettingsRoute { + Language = 'language', + Notifications = 'notifications', + Network = 'network', +} + +export const TRADE_ROUTE = `${AppRoute.Trade}/:market`; +export const PORTFOLIO_ROUTE = `${AppRoute.Portfolio}/:subroute`; +export const HISTORY_ROUTE = `${AppRoute.Portfolio}/${PortfolioRoute.History}/:subroute`; +export const DEFAULT_TRADE_ROUTE = `${AppRoute.Trade}/ETH-USD`; +export const SETTINGS_ROUTE = `${AppRoute.Settings}/*`; +export const DEFAULT_DOCUMENT_TITLE = 'dYdX'; + +export enum ExternalLink { + Foundation = 'https://dydx.foundation', +} diff --git a/src/constants/time.ts b/src/constants/time.ts new file mode 100644 index 0000000..867725e --- /dev/null +++ b/src/constants/time.ts @@ -0,0 +1,40 @@ +export enum TimeUnit { + Day = 'Day', + Hour = 'Hour', + Minute = 'Minute', + Second = 'Second', +} + +// Good Til Time Timescales +export enum TimeUnitShort { + Minutes = 'M', + Hours = 'H', + Days = 'D', + Weeks = 'W', +} + +export const timeUnits = { + year: 31536000000, + month: 2628000000, + week: 604800000, + day: 86400000, + hour: 3600000, + minute: 60000, + second: 1000, +} satisfies Partial>; + +export const smallTimeUnits = { + decisecond: 100, + centisecond: 10, + millisecond: 1, +} satisfies Partial>; + +export const otherTimeUnits = { + threeDays: 3 * timeUnits.day, +} satisfies Partial>; + +export const allTimeUnits = { + ...timeUnits, + ...smallTimeUnits, + ...otherTimeUnits, +}; diff --git a/src/constants/tooltips/deposit.ts b/src/constants/tooltips/deposit.ts new file mode 100644 index 0000000..a358def --- /dev/null +++ b/src/constants/tooltips/deposit.ts @@ -0,0 +1,8 @@ +import { type TooltipStrings, TOOLTIP_STRING_KEYS } from '@/constants/localization'; + +export const depositTooltips: TooltipStrings = { + swap: ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.SWAP_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.SWAP_BODY }), + }), +} as const; diff --git a/src/constants/tooltips/general.ts b/src/constants/tooltips/general.ts new file mode 100644 index 0000000..9da6b45 --- /dev/null +++ b/src/constants/tooltips/general.ts @@ -0,0 +1,12 @@ +import { type TooltipStrings, TOOLTIP_STRING_KEYS } from '@/constants/localization'; + +export const generalTooltips: TooltipStrings = { + 'legacy-signing': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.LEGACY_SIGNING_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.LEGACY_SIGNING_BODY }), + }), + 'remember-me': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.REMEMBER_ME_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.REMEMBER_ME_BODY }), + }), +} as const; diff --git a/src/constants/tooltips/index.ts b/src/constants/tooltips/index.ts new file mode 100644 index 0000000..d36075c --- /dev/null +++ b/src/constants/tooltips/index.ts @@ -0,0 +1,15 @@ +import type { TooltipStrings } from '@/constants/localization'; + +import { depositTooltips } from './deposit'; +import { generalTooltips } from './general'; +import { portfolioTooltips } from './portfolio'; +import { tradeTooltips } from './trade'; +import { withdrawTooltips } from './withdraw'; + +export const tooltipStrings: TooltipStrings = { + ...depositTooltips, + ...generalTooltips, + ...portfolioTooltips, + ...tradeTooltips, + ...withdrawTooltips, +} as const; diff --git a/src/constants/tooltips/portfolio.ts b/src/constants/tooltips/portfolio.ts new file mode 100644 index 0000000..b995f40 --- /dev/null +++ b/src/constants/tooltips/portfolio.ts @@ -0,0 +1,8 @@ +import { type TooltipStrings, TOOLTIP_STRING_KEYS } from '@/constants/localization'; + +export const portfolioTooltips: TooltipStrings = { + 'holding-hedgies': ({ stringGetter, stringParams }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.HOLDING_HEDGIES_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.HOLDING_HEDGIES_BODY, params: stringParams }), + }), +} as const; diff --git a/src/constants/tooltips/trade.ts b/src/constants/tooltips/trade.ts new file mode 100644 index 0000000..d2beee4 --- /dev/null +++ b/src/constants/tooltips/trade.ts @@ -0,0 +1,178 @@ +import { type TooltipStrings, TOOLTIP_STRING_KEYS } from '@/constants/localization'; + +export const tradeTooltips: TooltipStrings = { + 'account-leverage': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.ACCOUNT_LEVERAGE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.ACCOUNT_LEVERAGE_BODY }), + }), + 'bracket-sl': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.BRACKET_ORDER_SL_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.BRACKET_ORDER_SL_BODY }), + }), + 'bracket-tp': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.BRACKET_ORDER_TP_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.BRACKET_ORDER_TP_BODY }), + }), + 'buying-power': ({ stringGetter, stringParams }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.BUYING_POWER_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.BUYING_POWER_BODY, params: stringParams }), + }), + 'default-execution': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.DEFAULT_EXECUTION_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.DEFAULT_EXECUTION_BODY }), + }), + equity: ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.EQUITY_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.EQUITY_BODY }), + }), + 'expected-price': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.EXPECTED_PRICE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.EXPECTED_PRICE_BODY }), + }), + fee: ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.FEE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.FEE_BODY }), + }), + 'fill-or-kill': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.FILL_OR_KILL_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.FILL_OR_KILL_BODY }), + }), + 'free-collateral': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.FREE_COLLATERAL_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.FREE_COLLATERAL_BODY }), + }), + 'good-til': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.GOOD_TIL_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.GOOD_TIL_BODY }), + }), + 'immediate-or-cancel': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.IMMEDIATE_OR_CANCEL_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.IMMEDIATE_OR_CANCEL_BODY }), + }), + 'index-price': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.INDEX_PRICE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.INDEX_PRICE_BODY }), + }), + 'initial-margin-fraction': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.INITIAL_MARGIN_FRACTION_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.INITIAL_MARGIN_FRACTION_BODY }), + learnMoreLink: 'https://help.dydx.exchange/articles/5232637-maximum-position-sizes', + }), + 'initial-stop': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.INITIAL_STOP_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.INITIAL_STOP_BODY }), + }), + leverage: ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.LEVERAGE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.LEVERAGE_BODY }), + }), + 'limit-price': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.LIMIT_PRICE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.LIMIT_PRICE_BODY }), + }), + 'limit-price-slippage': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.LIMIT_PRICE_SLIPPAGE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.LIMIT_PRICE_SLIPPAGE_BODY }), + }), + 'liquidation-price': ({ stringGetter, stringParams }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.LIQUIDATION_PRICE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.LIQUIDATION_PRICE_BODY, params: stringParams }), + }), + 'liquidation-price-general': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.LIQUIDATION_PRICE_GENERAL_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.LIQUIDATION_PRICE_GENERAL_BODY }), + }), + liquidity: ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.LIQUIDITY_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.LIQUIDITY_BODY }), + }), + 'maintenance-margin-fraction': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.MAINTENANCE_MARGIN_FRACTION_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.MAINTENANCE_MARGIN_FRACTION_BODY }), + }), + 'max-withdraw': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.MAX_WITHDRAW_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.MAX_WITHDRAW_BODY }), + }), + 'maker-fee': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.MAKER_FEE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.MAKER_FEE_BODY }), + }), + 'margin-usage': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.MARGIN_USAGE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.MARGIN_USAGE_BODY }), + }), + 'maximum-leverage': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.MAXIMUM_LEVERAGE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.MAXIMUM_LEVERAGE_BODY }), + }), + 'net-funding': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.NET_FUNDING_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.NET_FUNDING_BODY }), + }), + 'open-interest': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.OPEN_INTEREST_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.OPEN_INTEREST_BODY }), + }), + 'oracle-price': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.ORACLE_PRICE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.ORACLE_PRICE_BODY }), + }), + 'order-amount': ({ stringGetter, stringParams }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.ORDER_AMOUNT_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.ORDER_AMOUNT_BODY, params: stringParams }), + }), + 'order-amount-usd': ({ stringGetter, stringParams }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.ORDER_AMOUNT_USD_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.ORDER_AMOUNT_USD_BODY, params: stringParams }), + }), + 'post-only': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.POST_ONLY_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.POST_ONLY_BODY }), + }), + 'price-impact': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.PRICE_IMPACT_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.PRICE_IMPACT_BODY }), + }), + 'realized-pnl': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.REALIZED_PNL_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.REALIZED_PNL_BODY }), + }), + 'reduce-only': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.REDUCE_ONLY_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.REDUCE_ONLY_BODY }), + learnMoreLink: 'https://help.dydx.exchange/articles/6345793-reduce-only-orders', + }), + spread: () => ({ + title: 'Spread', + body: 'The difference in price between the highest bid (the price a buyer is willing to buy for) and lowest ask (the price a seller is willing to sell for) an asset.', + }), + 'step-size': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.STEP_SIZE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.STEP_SIZE_BODY }), + }), + 'taker-fee': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.TAKER_FEE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.TAKER_FEE_BODY }), + }), + 'tick-size': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.TICK_SIZE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.TICK_SIZE_BODY }), + }), + 'time-in-force': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.TIME_IN_FORCE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.TIME_IN_FORCE_BODY }), + }), + 'trailing-percent': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.TRAILING_PERCENT_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.TRAILING_PERCENT_BODY }), + }), + 'trigger-price': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.TRIGGER_PRICE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.TRIGGER_PRICE_BODY }), + }), + 'unrealized-pnl': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.UNREALIZED_PNL_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.UNREALIZED_PNL_BODY }), + }), +} as const; diff --git a/src/constants/tooltips/withdraw.ts b/src/constants/tooltips/withdraw.ts new file mode 100644 index 0000000..4b91aa7 --- /dev/null +++ b/src/constants/tooltips/withdraw.ts @@ -0,0 +1,12 @@ +import { type TooltipStrings, TOOLTIP_STRING_KEYS } from '@/constants/localization'; + +export const withdrawTooltips: TooltipStrings = { + 'fast-withdraw-fee': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.FAST_WITHDRAW_FEE_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.FAST_WITHDRAW_FEE_BODY }), + }), + 'withdraw-types': ({ stringGetter }) => ({ + title: stringGetter({ key: TOOLTIP_STRING_KEYS.WITHDRAW_TYPES_TITLE }), + body: stringGetter({ key: TOOLTIP_STRING_KEYS.WITHDRAW_TYPES_BODY }), + }), +} as const; diff --git a/src/constants/trade.ts b/src/constants/trade.ts new file mode 100644 index 0000000..bff4237 --- /dev/null +++ b/src/constants/trade.ts @@ -0,0 +1,118 @@ +import { OrderSide } from '@dydxprotocol/v4-client'; + +import { AlertType } from '@/constants/alerts'; +import { STRING_KEYS } from '@/constants/localization'; +import { TimeUnitShort } from '@/constants/time'; + +// TODO: rename to OrderType +export enum TradeTypes { + MARKET = 'MARKET', + LIMIT = 'LIMIT', + STOP_LIMIT = 'STOP_LIMIT', + STOP_MARKET = 'STOP_MARKET', + TAKE_PROFIT_LIMIT = 'TAKE_PROFIT_LIMIT', + TAKE_PROFIT_MARKET = 'TAKE_PROFIT_MARKET', + TRAILING_STOP = 'TRAILING_STOP', +} + +export enum TimeInForceOptions { + GTT = 'GTT', + FOK = 'FOK', + IOC = 'IOC', +} + +export enum PositionSide { + None = 'NONE', + Long = 'LONG', + Short = 'SHORT', +} + +export const UNCOMMITTED_ORDER_TIMEOUT = 10_000; + +export const ORDER_SIDE_STRINGS = { + [OrderSide.SIDE_BUY]: STRING_KEYS.BUY, + [OrderSide.SIDE_SELL]: STRING_KEYS.SELL, +} + +export const POSITION_SIDE_STRINGS: Record = { + [PositionSide.None]: STRING_KEYS.NONE, + [PositionSide.Long]: STRING_KEYS.LONG_POSITION_SHORT, + [PositionSide.Short]: STRING_KEYS.SHORT_POSITION_SHORT, +}; + +export const TRADE_TYPE_STRINGS: Record< + TradeTypes, + { + tradeTypeKeyShort: string; + tradeTypeKey: string; + descriptionKey: string; + } +> = { + [TradeTypes.LIMIT]: { + tradeTypeKeyShort: STRING_KEYS.LIMIT_ORDER_SHORT, + tradeTypeKey: STRING_KEYS.LIMIT_ORDER, + descriptionKey: STRING_KEYS.LIMIT_ORDER_DESCRIPTION, + }, + [TradeTypes.MARKET]: { + tradeTypeKeyShort: STRING_KEYS.MARKET_ORDER_SHORT, + tradeTypeKey: STRING_KEYS.MARKET_ORDER, + descriptionKey: STRING_KEYS.MARKET_ORDER_DESCRIPTION, + }, + [TradeTypes.STOP_LIMIT]: { + tradeTypeKeyShort: STRING_KEYS.STOP_LIMIT, + tradeTypeKey: STRING_KEYS.STOP_LIMIT, + descriptionKey: STRING_KEYS.STOP_LIMIT_DESCRIPTION, + }, + [TradeTypes.STOP_MARKET]: { + tradeTypeKeyShort: STRING_KEYS.STOP_MARKET, + tradeTypeKey: STRING_KEYS.STOP_MARKET, + descriptionKey: STRING_KEYS.STOP_MARKET_DESCRIPTION, + }, + [TradeTypes.TAKE_PROFIT_LIMIT]: { + tradeTypeKeyShort: STRING_KEYS.TAKE_PROFIT_LIMIT, + tradeTypeKey: STRING_KEYS.TAKE_PROFIT_LIMIT, + descriptionKey: STRING_KEYS.TAKE_PROFIT_LIMIT_DESCRIPTION, + }, + [TradeTypes.TAKE_PROFIT_MARKET]: { + tradeTypeKeyShort: STRING_KEYS.TAKE_PROFIT_MARKET, + tradeTypeKey: STRING_KEYS.TAKE_PROFIT_MARKET, + descriptionKey: STRING_KEYS.TAKE_PROFIT_MARKET_DESCRIPTION, + }, + [TradeTypes.TRAILING_STOP]: { + tradeTypeKeyShort: STRING_KEYS.TRAILING_STOP, + tradeTypeKey: STRING_KEYS.TRAILING_STOP, + descriptionKey: STRING_KEYS.TRAILING_STOP_DESCRIPTION, + }, +}; + +export const GOOD_TIL_TIME_TIMESCALE_STRINGS: Record = { + [TimeUnitShort.Minutes]: STRING_KEYS.MINUTES_SHORT, + [TimeUnitShort.Hours]: STRING_KEYS.HOURS, + [TimeUnitShort.Days]: STRING_KEYS.DAYS, + [TimeUnitShort.Weeks]: STRING_KEYS.WEEKS, +}; + +export enum TradeSizeInput { + Leverage = 'size.leverage', + Size = 'size.size', + Usdc = 'size.usdcSize', +} + +export enum TradeBoxKeys { + LimitPrice = 'price.limitPrice', + TrailingPercent = 'price.trailingPercent', + TriggerPrice = 'price.triggerPrice', +} + +export type InputErrorData = { + attached: boolean; + message: string; + type: AlertType; +}; + +export enum MobilePlaceOrderSteps { + EditOrder = 'EditOrder', + PreviewOrder = 'PreviewOrder', + PlacingOrder = 'PlacingOrder', + Confirmation = 'Confirmation', +} diff --git a/src/constants/unicode.ts b/src/constants/unicode.ts new file mode 100644 index 0000000..a655af2 --- /dev/null +++ b/src/constants/unicode.ts @@ -0,0 +1,5 @@ +export const UNICODE = { + MINUS: '\u2212', + PLUS: '\u002b', + ARROW_RIGHT: '\u2192', +}; diff --git a/src/constants/wallets.ts b/src/constants/wallets.ts new file mode 100644 index 0000000..6451456 --- /dev/null +++ b/src/constants/wallets.ts @@ -0,0 +1,386 @@ +import type { ExternalProvider } from '@ethersproject/providers'; + +import { STRING_KEYS } from '@/constants/localization'; + +import { + BitkeepIcon, + BitpieIcon, + CloverWalletIcon, + CoinbaseIcon, + Coin98Icon, + GenericWalletIcon, + HuobiIcon, + ImTokenIcon, + KeplrIcon, + MathWalletIcon, + MetaMaskIcon, + RainbowIcon, + TokenPocketIcon, + TrustWalletIcon, + WalletConnectIcon, +} from '@/icons'; + +import { isMetaMask } from '@/lib/wallet/providers'; + +// Wallet connection types + +export enum WalletConnectionType { + CoinbaseWalletSdk = 'coinbaseWalletSdk', + CosmosSigner = 'CosmosSigner', + InjectedEip1193 = 'injectedEip1193', + WalletConnect1 = 'walletConnect1', + WalletConnect2 = 'walletConnect2', +} + +type WalletConnectionTypeConfig = { + name: string; + wagmiConnectorId?: string; +}; + +export const walletConnectionTypes: Record = { + [WalletConnectionType.CoinbaseWalletSdk]: { + name: 'Coinbase Wallet SDK', + wagmiConnectorId: 'coinbaseWallet', + }, + [WalletConnectionType.InjectedEip1193]: { + name: 'injected EIP-1193 provider', + wagmiConnectorId: 'injected', + }, + [WalletConnectionType.WalletConnect1]: { + name: 'WalletConnect 1.0', + wagmiConnectorId: 'walletConnectLegacy', + }, + [WalletConnectionType.WalletConnect2]: { + name: 'WalletConnect 2.0', + wagmiConnectorId: 'walletConnect', + }, + [WalletConnectionType.CosmosSigner]: { + name: 'CosmosSigner', + }, +}; + +// Wallets + +export enum WalletType { + BitKeep = 'BITKEEP', + BitPie = 'BITPIE', + CloverWallet = 'CLOVER_WALLET', + CoinbaseWallet = 'COINBASE_WALLET', + Coin98 = 'COIN98', + HuobiWallet = 'HUOBI_WALLET', + ImToken = 'IMTOKEN', + Keplr = 'KEPLR', + // Ledger = 'LEDGER', + MathWallet = 'MATH_WALLET', + MetaMask = 'METAMASK', + Rainbow = 'RAINBOW_WALLET', + TokenPocket = 'TOKEN_POCKET', + TrustWallet = 'TRUST_WALLET', + WalletConnect = 'WALLETCONNECT', + WalletConnect2 = 'WALLETCONNECT_2', + // TestWallet = 'TEST_WALLET', + OtherWallet = 'OTHER_WALLET', +} + +type WalletConfig = { + type: WalletType; + stringKey: string; + icon: string; + connectionTypes: WalletConnectionType[]; + matchesInjectedEip1193?: (provider: ExternalProvider & any) => boolean; + walletconnect1Name?: string; + walletconnect2Id?: string; +}; + +export const wallets: Record = { + [WalletType.OtherWallet]: { + type: WalletType.OtherWallet, + stringKey: STRING_KEYS.OTHER_WALLET, + icon: GenericWalletIcon, + connectionTypes: [ + WalletConnectionType.InjectedEip1193, + // WalletConnectionType.CoinbaseWalletSdk, + WalletConnectionType.WalletConnect2, + WalletConnectionType.WalletConnect1, + ], + matchesInjectedEip1193: (provider) => + Object.entries(wallets).every( + ([walletType, walletConfig]) => + walletType === WalletType.OtherWallet || + !walletConfig.matchesInjectedEip1193 || + !walletConfig.matchesInjectedEip1193(provider) + ), + }, + [WalletType.BitKeep]: { + type: WalletType.BitKeep, + stringKey: STRING_KEYS.BITKEEP, + icon: BitkeepIcon, + connectionTypes: [ + WalletConnectionType.InjectedEip1193, + WalletConnectionType.WalletConnect2, + WalletConnectionType.WalletConnect1, + ], + matchesInjectedEip1193: (provider) => provider.isBitKeep, // isBitKeepChrome, isBitEthereum + walletconnect1Name: 'bitkeep', + walletconnect2Id: '38f5d18bd8522c244bdd70cb4a68e0e718865155811c043f052fb9f1c51de662', + }, + [WalletType.BitPie]: { + type: WalletType.BitPie, + stringKey: STRING_KEYS.BITPIE, + icon: BitpieIcon, + connectionTypes: [WalletConnectionType.InjectedEip1193, WalletConnectionType.WalletConnect1], + matchesInjectedEip1193: (provider) => provider.isBitpie, + walletconnect1Name: 'bitpie', + }, + [WalletType.CloverWallet]: { + type: WalletType.CloverWallet, + stringKey: STRING_KEYS.CLOVER_WALLET, + icon: CloverWalletIcon, + connectionTypes: [WalletConnectionType.InjectedEip1193, WalletConnectionType.WalletConnect1], + matchesInjectedEip1193: (provider) => provider.isClover, + // walletconnect1Name: 'clover', + }, + [WalletType.CoinbaseWallet]: { + type: WalletType.CoinbaseWallet, + stringKey: STRING_KEYS.COINBASE_WALLET, + icon: CoinbaseIcon, + connectionTypes: [ + WalletConnectionType.CoinbaseWalletSdk, + WalletConnectionType.InjectedEip1193, + WalletConnectionType.WalletConnect1, + ], + matchesInjectedEip1193: (provider) => provider.isCoinbaseWallet, // provider.selectedProvider?.isCoinbaseWallet, + walletconnect1Name: 'coinbase', + }, + [WalletType.Coin98]: { + type: WalletType.Coin98, + stringKey: STRING_KEYS.COIN98, + icon: Coin98Icon, + connectionTypes: [ + WalletConnectionType.InjectedEip1193, + WalletConnectionType.WalletConnect2, + WalletConnectionType.WalletConnect1, + ], + matchesInjectedEip1193: (provider) => provider.isCoin98, + walletconnect1Name: 'coin98', + walletconnect2Id: '2a3c89040ac3b723a1972a33a125b1db11e258a6975d3a61252cd64e6ea5ea01', + }, + [WalletType.HuobiWallet]: { + type: WalletType.HuobiWallet, + stringKey: STRING_KEYS.HUOBI_WALLET, + icon: HuobiIcon, + connectionTypes: [ + WalletConnectionType.InjectedEip1193, + WalletConnectionType.WalletConnect2, + WalletConnectionType.WalletConnect1, + ], + matchesInjectedEip1193: (provider) => provider.isHbWallet, + walletconnect2Id: '797c615e2c556b610c048eb35535f212c0dd58de5d03e763120e90a7d1350a77', + }, + [WalletType.ImToken]: { + type: WalletType.ImToken, + stringKey: STRING_KEYS.IMTOKEN, + icon: ImTokenIcon, + connectionTypes: [ + WalletConnectionType.InjectedEip1193, + WalletConnectionType.WalletConnect2, + WalletConnectionType.WalletConnect1, + ], + matchesInjectedEip1193: (provider) => provider.isImToken, + walletconnect1Name: 'imtoken', + walletconnect2Id: 'ef333840daf915aafdc4a004525502d6d49d77bd9c65e0642dbaefb3c2893bef', + }, + [WalletType.MathWallet]: { + type: WalletType.MathWallet, + stringKey: STRING_KEYS.MATH_WALLET, + icon: MathWalletIcon, + connectionTypes: [WalletConnectionType.InjectedEip1193, WalletConnectionType.WalletConnect1], + matchesInjectedEip1193: (provider) => provider.isMathWallet, + walletconnect1Name: 'math', + walletconnect2Id: '7674bb4e353bf52886768a3ddc2a4562ce2f4191c80831291218ebd90f5f5e26', + }, + [WalletType.MetaMask]: { + type: WalletType.MetaMask, + stringKey: STRING_KEYS.METAMASK, + icon: MetaMaskIcon, + connectionTypes: [ + WalletConnectionType.InjectedEip1193, + WalletConnectionType.WalletConnect2, + WalletConnectionType.WalletConnect1, + ], + matchesInjectedEip1193: isMetaMask, + walletconnect1Name: 'metamask', + walletconnect2Id: 'c57ca95b47569778a828d19178114f4db188b89b763c899ba0be274e97267d96', + }, + [WalletType.Rainbow]: { + type: WalletType.Rainbow, + stringKey: STRING_KEYS.RAINBOW_WALLET, + icon: RainbowIcon, + connectionTypes: [ + WalletConnectionType.InjectedEip1193, + WalletConnectionType.WalletConnect2, + WalletConnectionType.WalletConnect1, + ], + matchesInjectedEip1193: (provider) => provider.isRainbowWallet, + walletconnect1Name: 'rainbow', + walletconnect2Id: '1ae92b26df02f0abca6304df07debccd18262fdf5fe82daa81593582dac9a369', + }, + [WalletType.TokenPocket]: { + type: WalletType.TokenPocket, + stringKey: STRING_KEYS.TOKEN_POCKET, + icon: TokenPocketIcon, + connectionTypes: [ + WalletConnectionType.InjectedEip1193, + WalletConnectionType.WalletConnect2, + WalletConnectionType.WalletConnect1, + ], + matchesInjectedEip1193: (provider) => provider.isTokenPocket, + walletconnect1Name: 'tokenpocket', + walletconnect2Id: '20459438007b75f4f4acb98bf29aa3b800550309646d375da5fd4aac6c2a2c66', + }, + [WalletType.TrustWallet]: { + type: WalletType.TrustWallet, + stringKey: STRING_KEYS.TRUST_WALLET, + icon: TrustWalletIcon, + connectionTypes: [ + WalletConnectionType.InjectedEip1193, + WalletConnectionType.WalletConnect2, + WalletConnectionType.WalletConnect1, + ], + matchesInjectedEip1193: (provider) => provider.isTrust, + walletconnect1Name: 'trust', + walletconnect2Id: '4622a2b2d6af1c9844944291e5e7351a6aa24cd7b23099efac1b2fd875da31a0', + }, + [WalletType.WalletConnect2]: { + type: WalletType.WalletConnect, + stringKey: STRING_KEYS.WALLETCONNECT_2, + icon: WalletConnectIcon, + connectionTypes: [WalletConnectionType.WalletConnect2], + }, + [WalletType.WalletConnect]: { + type: WalletType.WalletConnect, + stringKey: STRING_KEYS.WALLETCONNECT, + icon: WalletConnectIcon, + connectionTypes: [WalletConnectionType.WalletConnect1], + }, + [WalletType.Keplr]: { + type: WalletType.Keplr, + stringKey: STRING_KEYS.KEPLR, + icon: KeplrIcon, + connectionTypes: [WalletConnectionType.CosmosSigner], + }, +}; + +// Injected EIP-1193 Providers +export type InjectedEthereumProvider = ExternalProvider; + +export type InjectedWeb3Provider = ExternalProvider; + +export type InjectedCoinbaseWalletExtensionProvider = InjectedEthereumProvider & { + isMetaMask: true; + overrideIsMetaMask: true; + providerMap: Map<'MetaMask' | 'CoinbaseWallet', ExternalProvider>; + providers: ExternalProvider[]; +}; + +export type WithInjectedEthereumProvider = { + ethereum: InjectedEthereumProvider; +}; + +export type WithInjectedWeb3Provider = { + web3: { + currentProvider: InjectedWeb3Provider; + }; +}; + +// Wallet connections + +export type WalletConnection = { + type: WalletConnectionType; + provider?: ExternalProvider; +}; + +// dYdX Chain wallets + +import { USDC_DENOM, type Onboarding, DYDX_DENOM } from '@dydxprotocol/v4-client'; +import type { suggestChain } from 'graz'; + +export const COSMOS_DERIVATION_PATH = "m/44'/118'/0'/0/0"; + +/** + * @description typed data to sign for v4 onboarding + */ +export const SIGN_TYPED_DATA = { + primaryType: 'dYdX', + domain: { + name: 'dYdX V4', + }, + types: { + dYdX: [{ name: 'action', type: 'string' }], + }, + message: { + action: 'dYdX V4 Onboarding', + }, +} as const; + +export type PrivateInformation = ReturnType< + typeof Onboarding.prototype.deriveHDKeyFromEthereumSignature +>; + +export type EthereumAddress = `0x${string}`; +export type DydxAddress = `dydx${string}`; + +export const DYDX_CHAIN_INFO: Parameters[0] = { + rpc: '13.59.4.93:26657', + rest: '13.59.4.93:1317', + chainId: 'dydx-testnet-2', + chainName: 'dYdX Public Testnet', + chainSymbolImageUrl: + 'https://raw.githubusercontent.com/chainapsis/keplr-chain-registry/main/images/dydx-testnet-2/chain.png', + bech32Config: { + bech32PrefixAccPub: 'dydxpub', + bech32PrefixValPub: 'dydxvaloperpub', + bech32PrefixAccAddr: 'dydx', + bech32PrefixConsPub: 'dydxvalconspub', + bech32PrefixValAddr: 'dydxvaloper', + bech32PrefixConsAddr: 'dydxvalcons', + }, + bip44: { + coinType: 118, + }, + stakeCurrency: { + coinDenom: 'DV4TNT', + coinDecimals: 6, + coinMinimalDenom: 'dv4tnt', + }, + currencies: [ + { + coinDenom: 'DV4TNT', + coinDecimals: 6, + coinMinimalDenom: 'dv4tnt', + }, + { + coinDenom: 'USDC', + coinMinimalDenom: 'ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5', + coinDecimals: 6, + }, + ], + feeCurrencies: [ + { + coinDenom: 'DV4TNT', + coinDecimals: 6, + coinMinimalDenom: 'dv4tnt', + }, + ], + features: [], +}; + +export enum DydxChainAsset { + USDC = 'USDC', + DYDX = 'DYDX', +} + +export const DYDX_CHAIN_ASSET_COIN_DENOM: Record = { + [DydxChainAsset.USDC]: USDC_DENOM, + [DydxChainAsset.DYDX]: DYDX_DENOM, +}; diff --git a/src/constants/websocket.ts b/src/constants/websocket.ts new file mode 100644 index 0000000..e6c9c4c --- /dev/null +++ b/src/constants/websocket.ts @@ -0,0 +1,6 @@ +export const PING_INTERVAL_MS = 2000; +export const PONG_TIMEOUT_MS = 5000; + +export const PONG_MESSAGE_TYPE = 'pong'; + +export const OUTGOING_PING_MESSAGE = JSON.stringify({ type: 'ping' }); diff --git a/src/contexts/LoadingContext.ts b/src/contexts/LoadingContext.ts new file mode 100644 index 0000000..bdea33a --- /dev/null +++ b/src/contexts/LoadingContext.ts @@ -0,0 +1,3 @@ +import { createContext } from 'react'; + +export const LoadingContext = createContext(false); diff --git a/src/hooks/index.ts b/src/hooks/index.ts new file mode 100644 index 0000000..12cfedd --- /dev/null +++ b/src/hooks/index.ts @@ -0,0 +1,43 @@ +import { useApiState } from './useApiState'; +import { useBreakpoints } from './useBreakpoints'; +import { useCommandMenu } from './useCommandMenu'; +import { useInterval } from './useInterval'; +import { useDocumentTitle } from './useDocumentTitle'; +import { useDydxClient } from './useDydxClient'; +import { useAccountBalance } from './useAccountBalance'; +import { useAccounts } from './useAccounts'; +import { useAnalytics } from './useAnalytics'; +import { useInitializePage } from './useInitializePage'; +import { useIsFirstRender } from './useIsFirstRender'; +import { useLocaleSeparators } from './useLocaleSeparators'; +import { useLocalStorage } from './useLocalStorage'; +import { useNow } from './useNow'; +import { useOnClickOutside } from './useOnClickOutside'; +import { usePageTitlePriceUpdates } from './usePageTitlePriceUpdates'; +import { useShouldShowFooter } from './useShouldShowFooter'; +import { useSelectedNetwork } from './useSelectedNetwork'; +import { useStringGetter } from './useStringGetter'; +import { useSubaccount } from './useSubaccount'; + +export { + useApiState, + useBreakpoints, + useCommandMenu, + useDocumentTitle, + useDydxClient, + useAccountBalance, + useAccounts, + useAnalytics, + useInitializePage, + useInterval, + useIsFirstRender, + useLocaleSeparators, + useLocalStorage, + useNow, + useOnClickOutside, + usePageTitlePriceUpdates, + useShouldShowFooter, + useSelectedNetwork, + useStringGetter, + useSubaccount, +}; diff --git a/src/hooks/tradingView/index.ts b/src/hooks/tradingView/index.ts new file mode 100644 index 0000000..13ecccc --- /dev/null +++ b/src/hooks/tradingView/index.ts @@ -0,0 +1,2 @@ +export { useTradingView } from './useTradingView'; +export { useTradingViewTheme } from './useTradingViewTheme'; diff --git a/src/hooks/tradingView/useTradingView.ts b/src/hooks/tradingView/useTradingView.ts new file mode 100644 index 0000000..45d2875 --- /dev/null +++ b/src/hooks/tradingView/useTradingView.ts @@ -0,0 +1,85 @@ +import { useEffect } from 'react'; +import { shallowEqual, useSelector } from 'react-redux'; +import { useLocation } from 'react-router-dom'; +import isEmpty from 'lodash/isEmpty'; + +import { LanguageCode, ResolutionString, widget } from 'public/tradingview/charting_library'; + +import { DEFAULT_RESOLUTION } from '@/constants/candles'; +import { SUPPORTED_LOCALE_BASE_TAGS } from '@/constants/localization'; +import { LocalStorageKey } from '@/constants/localStorage'; +import { useDydxClient, useLocalStorage } from '@/hooks'; +import { store } from '@/state/_store'; + +import { getSelectedNetwork } from '@/state/appSelectors'; +import { getAppTheme } from '@/state/configsSelectors'; +import { getSelectedLocale } from '@/state/localizationSelectors'; +import { getMarketIds } from '@/state/perpetualsSelectors'; + +import { getMarketIdFromLocation } from '@/lib/tradeData'; +import { getDydxDatafeed } from '@/lib/tradingView/dydxfeed'; +import { getSavedResolution, getWidgetOptions, getWidgetOverrides } from '@/lib/tradingView/utils'; + +/** + * @description Hook to initialize TradingView Chart + */ +export const useTradingView = ({ + tvWidgetRef, + setIsChartReady, +}: { + tvWidgetRef: React.MutableRefObject; + setIsChartReady: React.Dispatch>; +}) => { + const location = useLocation(); + const marketId = getMarketIdFromLocation(location); + const appTheme = useSelector(getAppTheme); + const marketIds = useSelector(getMarketIds, shallowEqual); + const selectedLocale = useSelector(getSelectedLocale); + const selectedNetwork = useSelector(getSelectedNetwork); + const { getCandlesForDatafeed } = useDydxClient(); + + const [savedTvChartConfig, setTvChartConfig] = useLocalStorage({ + key: LocalStorageKey.TradingViewChartConfig, + defaultValue: undefined, + }); + + const savedResolution = getSavedResolution({ savedConfig: savedTvChartConfig }); + const hasMarkets = marketIds.length > 0; + + useEffect(() => { + if (hasMarkets) { + const widgetOptions = getWidgetOptions(); + const widgetOverrides = getWidgetOverrides(appTheme); + + const options = { + // debug: true, + ...widgetOptions, + ...widgetOverrides, + datafeed: getDydxDatafeed(store, getCandlesForDatafeed), + interval: (savedResolution || DEFAULT_RESOLUTION) as ResolutionString, + locale: SUPPORTED_LOCALE_BASE_TAGS[selectedLocale] as LanguageCode, + symbol: marketId, + saved_data: !isEmpty(savedTvChartConfig) ? savedTvChartConfig : undefined, + }; + + const tvChartWidget = new widget(options); + tvWidgetRef.current = tvChartWidget; + + tvWidgetRef.current.onChartReady(() => { + tvWidgetRef?.current?.subscribe('onAutoSaveNeeded', () => + tvWidgetRef?.current?.save((chartConfig: object) => setTvChartConfig(chartConfig)) + ); + + setIsChartReady(true); + }); + } + + return () => { + tvWidgetRef.current?.remove(); + tvWidgetRef.current = null; + setIsChartReady(false); + }; + }, [getCandlesForDatafeed, hasMarkets, selectedLocale, selectedNetwork]); + + return { savedResolution }; +}; diff --git a/src/hooks/tradingView/useTradingViewTheme.ts b/src/hooks/tradingView/useTradingViewTheme.ts new file mode 100644 index 0000000..302c54f --- /dev/null +++ b/src/hooks/tradingView/useTradingViewTheme.ts @@ -0,0 +1,65 @@ +import { useEffect } from 'react'; +import { useSelector } from 'react-redux'; + +import type { IChartingLibraryWidget, ThemeName } from 'public/tradingview/charting_library'; + +import { AppTheme } from '@/state/configs'; + +import { getAppTheme } from '@/state/configsSelectors'; + +import { getWidgetOverrides } from '@/lib/tradingView/utils'; + +/** + * @description Method to define a type guard and check that an element is an IFRAME + * @param element: HTMLElement + * @returns boolean on whether the element is an IFRAME + */ +const isIFrame = (element: HTMLElement | null): element is HTMLIFrameElement => + element !== null && element.tagName === 'IFRAME'; + +/** + * @description Hook to manage switching Themes + * TradingView only handles 'Dark' | 'Light' themes. + * In order to support our Classic along with Dark/Light, we are directly accessing the within the iFrame. + */ +export const useTradingViewTheme = ({ + tvWidget, + isWidgetReady, +}: { + tvWidget: (IChartingLibraryWidget & { _id?: string; _ready?: boolean }) | null; + isWidgetReady?: boolean; +}) => { + const appTheme = useSelector(getAppTheme); + + useEffect(() => { + if (tvWidget && isWidgetReady) { + tvWidget + .changeTheme?.( + { + [AppTheme.Classic]: '', + [AppTheme.Dark]: 'Dark', + [AppTheme.Light]: 'Light', + }[appTheme] as ThemeName + ) + .then(() => { + const tvChartId = tvWidget?._id; + + if (tvChartId) { + const frame = document?.getElementById(tvChartId); + + if (isIFrame(frame) && frame.contentWindow) { + const innerHtml = frame.contentWindow.document.documentElement; + + if (appTheme === AppTheme.Classic) { + innerHtml?.classList.remove('theme-dark', 'theme-light'); + } + } + } + + const { overrides, studies_overrides } = getWidgetOverrides(appTheme); + tvWidget?.applyOverrides(overrides); + tvWidget?.applyStudiesOverrides(studies_overrides); + }); + } + }, [appTheme]); +}; diff --git a/src/hooks/useAccountBalance.ts b/src/hooks/useAccountBalance.ts new file mode 100644 index 0000000..1885b90 --- /dev/null +++ b/src/hooks/useAccountBalance.ts @@ -0,0 +1,119 @@ +import { useCallback } from 'react'; +import { useSelector } from 'react-redux'; +import { useBalance } from 'wagmi'; +import { StargateClient } from '@cosmjs/stargate'; +import { useQuery } from 'react-query'; +import { formatUnits } from 'ethers'; + +import { CLIENT_NETWORK_CONFIGS, type DydxV4Network } from '@/constants/networks'; +import { QUANTUM_MULTIPLIER } from '@/constants/numbers'; +import { EthereumAddress } from '@/constants/wallets'; + +import { convertBech32Address } from '@/lib/addressUtils'; +import { MustBigNumber } from '@/lib/numbers'; + +import { getSelectedNetwork } from '@/state/appSelectors'; + +import { useAccounts } from './useAccounts'; +// import { useDydxClient } from './useDydxClient'; +import { usePollNativeTokenBalance } from './usePollNativeTokenBalance'; + +type UseAccountBalanceProps = { + // Token Items + addressOrDenom?: string; + assetSymbol?: string; + decimals?: number; + + // Chain Items + chainId?: string | number; + bech32AddrPrefix?: string; + rpc?: string; + + isCosmosChain?: boolean; +}; + +/** + * 0xSquid uses this 0x address as the chain's default token. + * @todo We will need to add additional logic here if we 'useAccountBalance' on non-Squid related forms. + */ +const CHAIN_DEFAULT_TOKEN_ADDRESS = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE'; + +export const useAccountBalance = ({ + addressOrDenom = CHAIN_DEFAULT_TOKEN_ADDRESS, + assetSymbol, + bech32AddrPrefix, + chainId, + decimals, + rpc, + isCosmosChain, +}: UseAccountBalanceProps = {}) => { + const { evmAddress, dydxAddress } = useAccounts(); + + // TODO: let Abacus / useDydxClient handle EVM chain IDs + // const { networkConfig } = useDydxClient(); + const selectedNetwork = useSelector(getSelectedNetwork); + const evmChainId = Number(CLIENT_NETWORK_CONFIGS[selectedNetwork as DydxV4Network].ethereumChainId); + + const evmQuery = useBalance({ + enabled: Boolean(!isCosmosChain && addressOrDenom?.startsWith('0x')), + address: evmAddress, + chainId: typeof chainId === 'number' ? chainId : Number(evmChainId), + token: + addressOrDenom === CHAIN_DEFAULT_TOKEN_ADDRESS + ? undefined + : (addressOrDenom as EthereumAddress), + watch: true, + }); + + const cosmosQueryFn = useCallback(async () => { + if (dydxAddress && bech32AddrPrefix && rpc) { + const address = convertBech32Address({ + address: dydxAddress, + bech32Prefix: bech32AddrPrefix, + }); + + const client = await StargateClient.connect(rpc); + const balanceAsCoin = await client.getBalance(address, addressOrDenom); + await client.disconnect(); + + /** + * Hardcode decimals because most cosmos coins default to 6 decimals. + * Squids testnet has some coins as having 18 decimals instead of 6. + * @url https://github1s.com/cosmos/cosmjs/blob/HEAD/packages/amino/src/coins.ts#L8-L16 + * + * @todo: change '6' to 'decimals' when Squid testnet data is updated. + * */ + return formatUnits(balanceAsCoin.amount, decimals); + } + }, [addressOrDenom, chainId, rpc]); + + const cosmosQuery = useQuery({ + enabled: Boolean(isCosmosChain && dydxAddress && bech32AddrPrefix && rpc && addressOrDenom), + queryKey: `accountBalances_${chainId}_${addressOrDenom}`, + queryFn: cosmosQueryFn, + refetchOnWindowFocus: false, + refetchOnMount: false, + refetchOnReconnect: false, + refetchInterval: 10_000, + staleTime: 10_000, + }); + + const { formatted: evmBalance } = evmQuery.data || {}; + const balance = !assetSymbol ? '0' : isCosmosChain ? cosmosQuery.data : evmBalance; + + const nativeTokenCoinBalance = usePollNativeTokenBalance({ dydxAddress }); + const nativeTokenBalance = MustBigNumber(nativeTokenCoinBalance?.amount) + .div(QUANTUM_MULTIPLIER) + .toNumber(); + + return { + balance, + nativeTokenBalance, + isBalanceError: isCosmosChain + ? cosmosQuery.status === 'error' && !cosmosQuery.isFetching + : evmQuery.status === 'error' && evmQuery.fetchStatus === 'idle', + isBalanceLoading: isCosmosChain + ? cosmosQuery.status === 'loading' && cosmosQuery.isFetching + : evmQuery.status === 'loading' && evmQuery.fetchStatus === 'fetching', + }; +}; diff --git a/src/hooks/useAccounts.tsx b/src/hooks/useAccounts.tsx new file mode 100644 index 0000000..feae33a --- /dev/null +++ b/src/hooks/useAccounts.tsx @@ -0,0 +1,318 @@ +import { useCallback, useContext, createContext, useEffect, useState, useMemo } from 'react'; + +import { useDispatch } from 'react-redux'; +import { AES, enc } from 'crypto-js'; +import { LocalWallet, USDC_DENOM, type Subaccount } from '@dydxprotocol/v4-client'; + +import { SubAccountHistoricalPNLs } from '@/constants/abacus'; +import { OnboardingGuard, OnboardingState, type EvmDerivedAddresses } from '@/constants/account'; +import { LocalStorageKey, LOCAL_STORAGE_VERSIONS } from '@/constants/localStorage'; +import { DydxAddress, EthereumAddress, PrivateInformation } from '@/constants/wallets'; + +import { + setOnboardingState, + setOnboardingGuard, + setSubaccount, + setHistoricalPnl, +} from '@/state/account'; + +import abacusStateManager from '@/lib/abacus'; +import { log } from '@/lib/telemetry'; + +import { useLocalStorage } from './useLocalStorage'; + +import { useWalletConnection } from './useWalletConnection'; +import { useDydxClient } from './useDydxClient'; + +const AccountsContext = createContext | undefined>(undefined); + +AccountsContext.displayName = 'Accounts'; + +export const AccountsProvider = ({ ...props }) => ( + +); + +export const useAccounts = () => useContext(AccountsContext)!; + +const useAccountsContext = () => { + const dispatch = useDispatch(); + + // Wallet connection + const { + walletType, + walletConnectionType, + selectWalletType, + selectedWalletType, + selectedWalletError, + evmAddress, + signerWagmi, + dydxAddress: connectedDydxAddress, + signerGraz, + } = useWalletConnection(); + + // EVM wallet connection + const [previousEvmAddress, setPreviousEvmAddress] = useState(evmAddress); + + useEffect(() => { + // Wallet accounts switched + if (previousEvmAddress && evmAddress && evmAddress !== previousEvmAddress) { + // Disconnect local wallet + disconnectLocalDydxWallet(); + + // Forget EVM signature + forgetEvmSignature(previousEvmAddress); + } + + setPreviousEvmAddress(evmAddress); + }, [evmAddress]); + + // EVM → dYdX account derivation + + const [evmDerivedAddresses, saveEvmDerivedAddresses] = useLocalStorage({ + key: LocalStorageKey.EvmDerivedAddresses, + defaultValue: {} as EvmDerivedAddresses, + }); + + useEffect(() => { + // Clear data stored with deprecated LocalStorageKey + if (evmDerivedAddresses.version !== LOCAL_STORAGE_VERSIONS[LocalStorageKey.EvmDerivedAddresses]) + saveEvmDerivedAddresses({}); + }, []); + + const saveEvmDerivedAccount = ({ + evmAddress, + dydxAddress, + }: { + evmAddress: EthereumAddress; + dydxAddress?: DydxAddress; + }) => { + saveEvmDerivedAddresses({ + ...evmDerivedAddresses, + version: LOCAL_STORAGE_VERSIONS[LocalStorageKey.EvmDerivedAddresses], + [evmAddress]: { + ...evmDerivedAddresses[evmAddress], + dydxAddress, + }, + }); + }; + + const saveEvmSignature = useCallback( + (encryptedSignature: string) => { + evmDerivedAddresses[evmAddress!].encryptedSignature = encryptedSignature; + saveEvmDerivedAddresses(evmDerivedAddresses); + }, + [evmDerivedAddresses, evmAddress] + ); + + const forgetEvmSignature = useCallback( + (_evmAddress = evmAddress) => { + if (_evmAddress) { + delete evmDerivedAddresses[_evmAddress]?.encryptedSignature; + saveEvmDerivedAddresses(evmDerivedAddresses); + } + }, + [evmDerivedAddresses, evmAddress] + ); + + const decryptSignature = (encryptedSignature: string | undefined) => { + const staticEncryptionKey = import.meta.env.VITE_PK_ENCRYPTION_KEY; + + if (!staticEncryptionKey) throw new Error('No decryption key found'); + if (!encryptedSignature) throw new Error('No signature found'); + + const decrypted = AES.decrypt(encryptedSignature, staticEncryptionKey); + const signature = decrypted.toString(enc.Utf8); + return signature; + }; + + // dYdXClient Onboarding & Account Helpers + const { compositeClient, getWalletFromEvmSignature } = useDydxClient(); + // dYdX subaccounts + const [dydxSubaccounts, setDydxSubaccounts] = useState(); + + const { getAccountBalance, getSubaccounts } = useMemo( + () => ({ + getAccountBalance: async ({ + dydxAddress, + denom = USDC_DENOM, + }: { + dydxAddress: DydxAddress; + denom?: string; + }) => await compositeClient?.validatorClient.get.getAccountBalance(dydxAddress, denom), + + getSubaccounts: async ({ dydxAddress }: { dydxAddress: DydxAddress }) => { + try { + const response = await compositeClient?.indexerClient.account.getSubaccounts(dydxAddress); + setDydxSubaccounts(response.subaccounts); + return response.subaccounts; + } catch (error) { + // 404 is expected if the user has no subaccounts + if (error.status === 404) { + return []; + } else { + throw error; + } + } + }, + }), + [compositeClient] + ); + + // dYdX wallet / onboarding state + const [localDydxWallet, setLocalDydxWallet] = useState(); + const [hdKey, setHdKey] = useState(); + + const dydxAccounts = useMemo(() => localDydxWallet?.accounts, [localDydxWallet]); + + const dydxAddress = useMemo( + () => localDydxWallet?.address as DydxAddress | undefined, + [localDydxWallet] + ); + + const setWalletFromEvmSignature = async (signature: string) => { + const { wallet, mnemonic, privateKey, publicKey } = await getWalletFromEvmSignature({ + signature, + }); + setLocalDydxWallet(wallet); + setHdKey({ mnemonic, privateKey, publicKey }); + }; + + useEffect(() => { + if (evmAddress) { + saveEvmDerivedAccount({ evmAddress, dydxAddress }); + } + }, [evmAddress, dydxAddress]); + + useEffect(() => { + (async () => { + if (connectedDydxAddress && signerGraz) { + dispatch(setOnboardingState(OnboardingState.WalletConnected)); + try { + setLocalDydxWallet(await LocalWallet.fromOfflineSigner(signerGraz)); + dispatch(setOnboardingState(OnboardingState.AccountConnected)); + } catch (error) { + log('useAccounts/setLocalDydxWallet', error); + } + } else if (evmAddress && signerWagmi) { + if (!localDydxWallet) { + dispatch(setOnboardingState(OnboardingState.WalletConnected)); + + const evmDerivedAccount = evmDerivedAddresses[evmAddress]; + + if (evmDerivedAccount?.encryptedSignature) { + try { + const signature = decryptSignature(evmDerivedAccount.encryptedSignature); + + await setWalletFromEvmSignature(signature); + dispatch(setOnboardingState(OnboardingState.AccountConnected)); + } catch (error) { + log('useAccounts/decryptSignature', error); + forgetEvmSignature(); + } + } + } else { + dispatch(setOnboardingState(OnboardingState.AccountConnected)); + } + } else { + disconnectLocalDydxWallet(); + dispatch(setOnboardingState(OnboardingState.Disconnected)); + } + })(); + }, [evmAddress, evmDerivedAddresses, signerWagmi, connectedDydxAddress, signerGraz]); + + // abacus + // TODO: useAbacus({ dydxAddress }) + useEffect(() => { + if (dydxAddress) abacusStateManager.setAccount(dydxAddress); + else abacusStateManager.disconnectAccount(); + }, [dydxAddress]); + + // clear subaccounts when no dydxAddress is set + useEffect(() => { + (async () => { + if (!dydxAddress) { + setDydxSubaccounts(undefined); + } + })(); + }, [dydxAddress]); + + // Onboarding conditions + const [hasAcknowledgedTerms, saveHasAcknowledgedTerms] = useLocalStorage({ + key: LocalStorageKey.OnboardingHasAcknowledgedTerms, + defaultValue: false, + }); + + useEffect(() => { + dispatch( + setOnboardingGuard({ + guard: OnboardingGuard.hasAcknowledgedTerms, + value: hasAcknowledgedTerms, + }) + ); + }, [hasAcknowledgedTerms]); + + useEffect(() => { + const hasPreviousTransactions = Boolean(dydxSubaccounts?.length); + + dispatch( + setOnboardingGuard({ + guard: OnboardingGuard.hasPreviousTransactions, + value: hasPreviousTransactions, + }) + ); + }, [dydxSubaccounts]); + + // Disconnect wallet / accounts + const disconnectLocalDydxWallet = () => { + setLocalDydxWallet(undefined); + setHdKey(undefined); + }; + + const disconnect = async () => { + // Disconnect local wallet + disconnectLocalDydxWallet(); + + // Disconnect EVM wallet + forgetEvmSignature(); + selectWalletType(undefined); + }; + + return { + // Wallet connection + walletType, + walletConnectionType, + + // Wallet selection + selectWalletType, + selectedWalletType, + selectedWalletError, + + // Wallet connection (EVM) + evmAddress, + signerWagmi, + + // Wallet connection (Cosmos) + signerGraz, + + // EVM → dYdX account derivation + setWalletFromEvmSignature, + saveEvmSignature, + forgetEvmSignature, + + // dYdX accounts + hdKey, + localDydxWallet, + dydxAccounts, + dydxAddress, + + // Onboarding state + saveHasAcknowledgedTerms, + + // Disconnect wallet / accounts + disconnect, + + // dydxClient Account methods + getAccountBalance, + getSubaccounts, + }; +}; diff --git a/src/hooks/useAnalytics.ts b/src/hooks/useAnalytics.ts new file mode 100644 index 0000000..cec2f20 --- /dev/null +++ b/src/hooks/useAnalytics.ts @@ -0,0 +1,193 @@ +import { useEffect, useState } from 'react'; +import { useSelector, shallowEqual } from 'react-redux'; +import { useLocation } from 'react-router-dom'; + +import { AnalyticsEvent, AnalyticsUserProperty } from '@/constants/analytics'; + +import { track, identify } from '@/lib/analytics'; + +import { useApiState } from './useApiState'; +import { useBreakpoints } from './useBreakpoints'; +import { useSelectedNetwork } from './useSelectedNetwork'; +import { useAccounts } from './useAccounts'; + +import { getSelectedLocale } from '@/state/localizationSelectors'; +import { getOnboardingState, getSubaccountId } from '@/state/accountSelectors'; +import { calculateOnboardingStep } from '@/state/accountCalculators'; +import { getActiveDialog } from '@/state/dialogsSelectors'; +import type { DialogTypes } from '@/constants/dialogs'; + +import { getSelectedTradeType } from '@/lib/tradeData'; +import { getInputTradeData } from '@/state/inputsSelectors'; + +export const useAnalytics = () => { + const { walletType, walletConnectionType, evmAddress, dydxAddress, selectedWalletType } = useAccounts(); + + /** User properties */ + + // AnalyticsUserProperty.Breakpoint + const breakpointMatches = useBreakpoints(); + + const breakpoint = + breakpointMatches.isMobile ? + 'MOBILE' + : breakpointMatches.isTablet ? + 'TABLET' + : breakpointMatches.isDesktopSmall ? + 'DESKTOP_SMALL' + : breakpointMatches.isDesktopMedium ? + 'DESKTOP_MEDIUM' + : breakpointMatches.isDesktopLarge ? + 'DESKTOP_LARGE' + : + 'UNSUPPORTED'; + + useEffect(() => { + identify(AnalyticsUserProperty.Breakpoint, breakpoint); + }, [breakpoint]); + + // AnalyticsUserProperty.Locale + const selectedLocale = useSelector(getSelectedLocale); + + useEffect(() => { + identify(AnalyticsUserProperty.Locale, selectedLocale); + }, [selectedLocale]); + + // AnalyticsUserProperty.Network + const { selectedNetwork } = useSelectedNetwork(); + + useEffect(() => { + identify(AnalyticsUserProperty.Network, selectedNetwork); + }, [selectedNetwork]); + + // AnalyticsUserProperty.WalletType + useEffect(() => { + identify(AnalyticsUserProperty.WalletType, walletType); + }, [walletType]); + + // AnalyticsUserProperty.WalletConnectionType + useEffect(() => { + identify(AnalyticsUserProperty.WalletConnectionType, walletConnectionType); + }, [walletConnectionType]); + + // AnalyticsUserProperty.WalletAddress + useEffect(() => { + identify(AnalyticsUserProperty.WalletAddress, evmAddress || dydxAddress); + }, [evmAddress, dydxAddress]); + + // AnalyticsUserProperty.DydxAddress + useEffect(() => { + identify(AnalyticsUserProperty.DydxAddress, dydxAddress); + }, [dydxAddress]); + + // AnalyticsUserProperty.SubaccountNumber + const subaccountNumber = useSelector(getSubaccountId); + useEffect(() => { + identify(AnalyticsUserProperty.SubaccountNumber, subaccountNumber); + }, [subaccountNumber]); + + + /** Events */ + + // AnalyticsEvent.AppStart + useEffect(() => { + track(AnalyticsEvent.AppStart); + }, []); + + // AnalyticsEvent.NetworkStatus + const { status } = useApiState(); + + useEffect(() => { + if (status) track(AnalyticsEvent.NetworkStatus, { status: status.name }); + }, [status]); + + // AnalyticsEvent.NavigatePage + const location = useLocation(); + + useEffect(() => { + // Ignore hashchange events from