├── .eslintrc.json ├── .github └── workflows │ ├── build.yml │ └── publish.yml ├── .gitignore ├── .vscode └── settings.json ├── LICENSE ├── README.md ├── build.mjs ├── entry.js ├── package.json ├── pnpm-lock.yaml ├── src ├── api │ ├── Patcher.ts │ ├── SettingsAPI.ts │ └── index.ts ├── debug │ └── index.ts ├── global.d.ts ├── index.ts ├── managers │ ├── index.ts │ └── plugins.ts ├── metro │ ├── common.ts │ └── index.ts ├── native.ts ├── patches │ ├── chatInput.ts │ ├── experiments.ts │ ├── idle.ts │ ├── index.ts │ ├── settings.tsx │ └── theme.ts ├── themes.ts ├── ui │ └── screens │ │ ├── General.tsx │ │ ├── Plugins.tsx │ │ └── common.ts └── utils │ ├── assets.ts │ ├── awaitUntil.ts │ ├── findInReactTree.ts │ ├── findInTree.ts │ ├── index.ts │ ├── lazyNavigate.tsx │ ├── observeObject.ts │ └── proxyLazy.ts └── tsconfig.json /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "parser": "@typescript-eslint/parser", 4 | "ignorePatterns": [ "dist", "browser" ], 5 | "plugins": [ 6 | "@typescript-eslint", 7 | "simple-import-sort", 8 | "path-alias" 9 | ], 10 | "settings": { 11 | "import/resolver": { 12 | "alias": { 13 | "map": [ 14 | [ "@*", "./src/*" ] 15 | ] 16 | } 17 | } 18 | }, 19 | "rules": { 20 | "quotes": [ "error", "double", { "avoidEscape": true } ], 21 | "jsx-quotes": [ "error", "prefer-double" ], 22 | "no-mixed-spaces-and-tabs": "error", 23 | "indent": [ "error", 4, { "SwitchCase": 1 } ], 24 | "arrow-parens": [ "error", "as-needed" ], 25 | "eol-last": [ "error", "always" ], 26 | "func-call-spacing": [ "error", "never" ], 27 | "no-multi-spaces": "error", 28 | "no-trailing-spaces": "error", 29 | "no-whitespace-before-property": "error", 30 | "semi": [ "error", "always" ], 31 | "semi-style": [ "error", "last" ], 32 | "space-in-parens": [ "error", "never" ], 33 | "block-spacing": [ "error", "always" ], 34 | "object-curly-spacing": [ "error", "always" ], 35 | "eqeqeq": [ "error", "always", { "null": "ignore" } ], 36 | "spaced-comment": [ "error", "always", { "markers": [ "!" ] } ], 37 | "yoda": "error", 38 | "prefer-destructuring": [ "error", { "object": true, "array": false } ], 39 | "operator-assignment": [ "error", "always" ], 40 | "no-useless-computed-key": "error", 41 | "no-unneeded-ternary": [ "error", { "defaultAssignment": false } ], 42 | "no-invalid-regexp": "error", 43 | "no-constant-condition": [ "error", { "checkLoops": false } ], 44 | "no-duplicate-imports": "error", 45 | "no-extra-semi": "error", 46 | "dot-notation": "error", 47 | "no-useless-escape": [ "error" ], 48 | "no-fallthrough": "error", 49 | "for-direction": "error", 50 | "no-async-promise-executor": "error", 51 | "no-cond-assign": "error", 52 | "no-dupe-else-if": "error", 53 | "no-duplicate-case": "error", 54 | "no-irregular-whitespace": "error", 55 | "no-loss-of-precision": "error", 56 | "no-misleading-character-class": "error", 57 | "no-prototype-builtins": "error", 58 | "no-regex-spaces": "error", 59 | "no-shadow-restricted-names": "error", 60 | "no-unexpected-multiline": "error", 61 | "no-unsafe-optional-chaining": "error", 62 | "no-useless-backreference": "error", 63 | "use-isnan": "error", 64 | "prefer-const": "error", 65 | "prefer-spread": "error", 66 | 67 | "simple-import-sort/imports": "error", 68 | "simple-import-sort/exports": "error", 69 | 70 | "path-alias/no-relative": "error" 71 | } 72 | } -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | # https://github.com/Aliucord/AliucordRN/blob/main/.github/workflows/build.yml 2 | name: Pyoncord CI 3 | 4 | on: 5 | push: 6 | branches: 7 | - master 8 | pull_request: 9 | workflow_dispatch: 10 | 11 | jobs: 12 | Build: 13 | runs-on: ubuntu-latest 14 | permissions: 15 | contents: write 16 | 17 | steps: 18 | - name: Checkout main branch 19 | uses: actions/checkout@master 20 | 21 | - name: Checkout builds branch 22 | uses: actions/checkout@master 23 | with: 24 | ref: builds 25 | path: builds 26 | 27 | - uses: pnpm/action-setup@v2 # Install pnpm using packageManager key in package.json 28 | 29 | - name: Use Node.js 17 30 | uses: actions/setup-node@v2 31 | with: 32 | node-version: 17 33 | cache: 'pnpm' 34 | 35 | - name: Install dependencies 36 | run: pnpm install 37 | 38 | - name: Build pyoncord.js bundle 39 | run: pnpm lint && pnpm build 40 | 41 | - name: Upload dist folder to builds branch 42 | if: github.ref == format('refs/heads/{0}', github.event.repository.default_branch) # Only runs if this CI was triggered by the default branch 43 | run: | 44 | cd builds 45 | cp ../dist/* . 46 | git config --local user.email "actions@github.com" 47 | git config --local user.name "GitHub Actions" 48 | git pull 49 | git add -A 50 | git commit -m "Build $GITHUB_SHA" || true 51 | git push -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | # https://github.com/Aliucord/AliucordRN/blob/main/.github/workflows/build.yml 2 | name: Types Publish CI 3 | 4 | on: 5 | workflow_dispatch: 6 | inputs: 7 | version: 8 | type: string 9 | description: Package version 10 | required: true 11 | 12 | jobs: 13 | publish: 14 | runs-on: ubuntu-latest 15 | 16 | steps: 17 | - name: Checkout master branch 18 | uses: actions/checkout@master 19 | 20 | - uses: pnpm/action-setup@v2 # Install pnpm using packageManager key in package.json 21 | 22 | - name: Use Node.js 19 23 | uses: actions/setup-node@v3 24 | with: 25 | registry-url: 'https://registry.npmjs.org' 26 | node-version: 19 27 | 28 | - name: Publish types to NPM 29 | env: 30 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} # NPM_TOKEN is set in the repo secrets 31 | run: | 32 | pnpm install 33 | npm pkg set version=${{ inputs.version }} 34 | pnpm publish --no-git-checks -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | lib 4 | .idea -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.formatOnSave": true, 3 | "editor.codeActionsOnSave": { 4 | "source.fixAll.eslint": true 5 | }, 6 | "[typescript]": { 7 | "editor.defaultFormatter": "vscode.typescript-language-features" 8 | }, 9 | "[typescriptreact]": { 10 | "editor.defaultFormatter": "vscode.typescript-language-features" 11 | }, 12 | "javascript.format.semicolons": "insert", 13 | "typescript.format.semicolons": "insert", 14 | "typescript.preferences.quoteStyle": "double", 15 | "javascript.preferences.quoteStyle": "double" 16 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2023, Pyoncord 4 | 5 | Redistribution and use in source and binary forms, with or without 6 | modification, are permitted provided that the following conditions are met: 7 | 8 | 1. Redistributions of source code must retain the above copyright notice, this 9 | list of conditions and the following disclaimer. 10 | 11 | 2. Redistributions in binary form must reproduce the above copyright notice, 12 | this list of conditions and the following disclaimer in the documentation 13 | and/or other materials provided with the distribution. 14 | 15 | 3. Neither the name of the copyright holder nor the names of its 16 | contributors may be used to endorse or promote products derived from 17 | this software without specific prior written permission. 18 | 19 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 20 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 22 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 23 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 25 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 26 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 27 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | > [!IMPORTANT] 2 | > Due to maintenance difficulties *(why? read below)*, this project is now discontinued, hence being marked as a "proof-of-concept" project since it was never finished. Worry not, I am working on an alternative, which is a fork and a drop-in Vendetta replacement, [Bunny](https://github.com/pyoncord/Bunny). 3 | 4 | ## Pyoncord (client mod) 5 | 6 | ##### Pyoncord is often confused with [Bunny](https://github.com/pyoncord/Bunny). Pyoncord nowadays only exists as a form of "team" or community. If you see Pyoncord being mentioned as a client mod, it is likely referring to [Bunny](https://github.com/pyoncord/Bunny) rather than this discontinued project. 7 | 8 | Pyoncord *was* an experimental Discord mobile client mod that was not seriously made to compete with any other client mod and also a proof-of-concept of implementing lazy [Metro](https://github.com/facebook/metro) bundle runtime patching. Instead of force initializing all modules in the registry to find and patch, Pyoncord waits until Discord itself initializes a module when they require it and patches its exports right before Discord uses them. 9 | 10 | Thanks to [Hermes](https://github.com/facebook/hermes)' limitations, we are unable to depend on Discord's modules and libraries bundled with it, thus integrating this concept into an existing mod (like [Vendetta](https://github.com/vendetta-mod/Vendetta/)) isn't possible and mostly requires rewriting from the ground up (otherwise this project wouldn't exist as, fun fact, I was a part of Team Vendetta :nyaboom:). 11 | 12 | Due to how torturous it is for me to work on this mod with fragile goals, along with the discovery of another approach to achieve similar benefits, I've decided to drop this project without it being finished. The "other approach" is expected to be integrated into [Bunny](https://github.com/pyoncord/Bunny), Pyoncord's iteration of Vendetta. -------------------------------------------------------------------------------- /build.mjs: -------------------------------------------------------------------------------- 1 | // Derived from Vendetta's build script 2 | import swc from "@swc/core"; 3 | import { execSync } from "child_process"; 4 | import esbuild from "esbuild"; 5 | import { argv } from "process"; 6 | 7 | const flags = argv.slice(2).filter(arg => arg.startsWith("--")).map(arg => arg.slice(2)); 8 | const isDev = !flags.includes("release"); 9 | 10 | const commitHash = execSync("git rev-parse --short HEAD").toString().trim(); 11 | console.log(`Building with commit hash ${commitHash}, isDev=${isDev}`); 12 | 13 | const buildOutput = "dist/pyoncord.js"; 14 | 15 | /** @type {import("esbuild").Plugin} */ 16 | const swcPlugin = { 17 | name: "swc", 18 | setup(build) { 19 | build.onLoad({ filter: /\.[jt]sx?/ }, async args => { 20 | const result = await swc.transformFile(args.path, { 21 | jsc: { 22 | externalHelpers: true, 23 | }, 24 | env: { 25 | targets: "defaults", 26 | include: [ 27 | "transform-classes", 28 | "transform-arrow-functions", 29 | ], 30 | }, 31 | }); 32 | return { contents: result.code }; 33 | }); 34 | } 35 | }; 36 | 37 | await esbuild.build({ 38 | entryPoints: ["entry.js"], 39 | bundle: true, 40 | minify: !isDev, 41 | format: "iife", 42 | target: "esnext", 43 | outfile: buildOutput, 44 | footer: { 45 | js: "//# sourceURL=pyoncord", 46 | }, 47 | define: { 48 | __PYONCORD_COMMIT_HASH__: JSON.stringify(commitHash), 49 | __PYONCORD_DEV__: JSON.stringify(isDev), 50 | }, 51 | legalComments: "none", 52 | alias: { 53 | "@/*": "./src/*" 54 | }, 55 | plugins: [ 56 | swcPlugin 57 | ] 58 | }); 59 | 60 | console.log("Build complete!"); 61 | 62 | if (flags.includes("deploy-root")) { 63 | console.log("Deploying to device with root..."); 64 | 65 | // Hardcode stuff because I'm lazy :trollface: 66 | const packageName = "com.discord"; 67 | 68 | // Make sure to configure the loader to load from an invalid URL so it uses the cache 69 | // This is still an issue because the cache is cleared intervally so we need to make our own loader 70 | execSync("adb wait-for-device root"); 71 | execSync(`adb shell am force-stop ${packageName}`); 72 | // execSync(`adb push ${buildOutput} sdcard/Documents/pyoncord/pyoncord/cache/pyoncord.js`); 73 | execSync(`adb push ${buildOutput} /data/data/${packageName}/files/pyoncord/cache/pyoncord.js`); 74 | execSync(`adb shell am start ${packageName}/com.discord.main.MainActivity`); 75 | } 76 | -------------------------------------------------------------------------------- /entry.js: -------------------------------------------------------------------------------- 1 | import { findByProps } from "@metro"; 2 | 3 | console.log(`Pyon! (Pyoncord, hash=${__PYONCORD_COMMIT_HASH__}, dev=${__PYONCORD_DEV__})`); 4 | 5 | async function init() { 6 | try { 7 | window.React = findByProps("createElement"); 8 | window.ReactNative = findByProps("View"); 9 | window.pyoncord = { ...await import("@") }; 10 | 11 | pyoncord.unload = await pyoncord.default(); 12 | 13 | // Delete the initializer; Pyoncord has already been loaded. 14 | delete pyoncord.default; 15 | } catch (error) { 16 | error = error?.stack ?? error; 17 | 18 | alert([ 19 | "Failed to load Pyoncord.\n", 20 | `Build Hash: ${__PYONCORD_COMMIT_HASH__}`, 21 | `Debug Build: ${__PYONCORD_DEV__}`, 22 | `Build Number: ${nativeModuleProxy.RTNClientInfoManager?.Build}`, 23 | error 24 | ].join("\n")); 25 | 26 | console.error(error); 27 | } 28 | } 29 | 30 | init(); 31 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pyoncord", 3 | "license": "BSD-3-Clause", 4 | "description": "A Discord React Native client mod", 5 | "publishConfig": { 6 | "directory": "lib", 7 | "typings": "index.d.ts" 8 | }, 9 | "scripts": { 10 | "build": "node build.mjs --release", 11 | "deploy:root": "node build.mjs --deploy-root", 12 | "lint": "eslint ./src --ext .js,.jsx,.ts,.tsx --ignore-pattern src/*", 13 | "prepublishOnly": "if [ -d lib ]; then rm -r lib; fi && tsc && cp package.json lib && cp LICENSE lib && cp README.md lib" 14 | }, 15 | "repository": { 16 | "type": "git", 17 | "url": "git+https://github.com/pyoncord/pyoncord.git" 18 | }, 19 | "bugs": { 20 | "url": "https://github.com/pyoncord/pyoncord/issues" 21 | }, 22 | "keywords": [ 23 | "discord", 24 | "discordrn", 25 | "react-native" 26 | ], 27 | "author": "amsyarasyiq", 28 | "devDependencies": { 29 | "@swc/core": "^1.3.76", 30 | "@types/react": "^18.2.20", 31 | "@types/react-native": "^0.70.14", 32 | "@typescript-eslint/eslint-plugin": "^5.62.0", 33 | "@typescript-eslint/parser": "^5.62.0", 34 | "esbuild": "^0.17.19", 35 | "eslint": "^8.47.0", 36 | "eslint-import-resolver-alias": "^1.1.2", 37 | "eslint-plugin-import": "^2.28.0", 38 | "eslint-plugin-path-alias": "^1.0.0", 39 | "eslint-plugin-react": "^7.33.1", 40 | "eslint-plugin-simple-import-sort": "^10.0.0", 41 | "tsc-alias": "^1.8.7", 42 | "typescript": "^5.1.6" 43 | }, 44 | "dependencies": { 45 | "@swc/helpers": "^0.5.1", 46 | "spitroast": "^1.4.3" 47 | }, 48 | "pnpm": { 49 | "peerDependencyRules": { 50 | "allowedVersions": { 51 | "eslint": "*" 52 | } 53 | } 54 | }, 55 | "packageManager": "pnpm@7.0.0" 56 | } 57 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | '@swc/helpers': 9 | specifier: ^0.5.1 10 | version: 0.5.1 11 | spitroast: 12 | specifier: ^1.4.3 13 | version: 1.4.3 14 | 15 | devDependencies: 16 | '@swc/core': 17 | specifier: ^1.3.76 18 | version: 1.3.76(@swc/helpers@0.5.1) 19 | '@types/react': 20 | specifier: ^18.2.20 21 | version: 18.2.20 22 | '@types/react-native': 23 | specifier: ^0.70.14 24 | version: 0.70.14 25 | '@typescript-eslint/eslint-plugin': 26 | specifier: ^5.62.0 27 | version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.47.0)(typescript@5.1.6) 28 | '@typescript-eslint/parser': 29 | specifier: ^5.62.0 30 | version: 5.62.0(eslint@8.47.0)(typescript@5.1.6) 31 | esbuild: 32 | specifier: ^0.17.19 33 | version: 0.17.19 34 | eslint: 35 | specifier: ^8.47.0 36 | version: 8.47.0 37 | eslint-import-resolver-alias: 38 | specifier: ^1.1.2 39 | version: 1.1.2(eslint-plugin-import@2.28.0) 40 | eslint-plugin-import: 41 | specifier: ^2.28.0 42 | version: 2.28.0(@typescript-eslint/parser@5.62.0)(eslint@8.47.0) 43 | eslint-plugin-path-alias: 44 | specifier: ^1.0.0 45 | version: 1.0.0(eslint@8.47.0) 46 | eslint-plugin-react: 47 | specifier: ^7.33.1 48 | version: 7.33.1(eslint@8.47.0) 49 | eslint-plugin-simple-import-sort: 50 | specifier: ^10.0.0 51 | version: 10.0.0(eslint@8.47.0) 52 | tsc-alias: 53 | specifier: ^1.8.7 54 | version: 1.8.7 55 | typescript: 56 | specifier: ^5.1.6 57 | version: 5.1.6 58 | 59 | packages: 60 | 61 | /@aashutoshrathi/word-wrap@1.2.6: 62 | resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} 63 | engines: {node: '>=0.10.0'} 64 | dev: true 65 | 66 | /@esbuild/android-arm64@0.17.19: 67 | resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} 68 | engines: {node: '>=12'} 69 | cpu: [arm64] 70 | os: [android] 71 | requiresBuild: true 72 | dev: true 73 | optional: true 74 | 75 | /@esbuild/android-arm@0.17.19: 76 | resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} 77 | engines: {node: '>=12'} 78 | cpu: [arm] 79 | os: [android] 80 | requiresBuild: true 81 | dev: true 82 | optional: true 83 | 84 | /@esbuild/android-x64@0.17.19: 85 | resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} 86 | engines: {node: '>=12'} 87 | cpu: [x64] 88 | os: [android] 89 | requiresBuild: true 90 | dev: true 91 | optional: true 92 | 93 | /@esbuild/darwin-arm64@0.17.19: 94 | resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} 95 | engines: {node: '>=12'} 96 | cpu: [arm64] 97 | os: [darwin] 98 | requiresBuild: true 99 | dev: true 100 | optional: true 101 | 102 | /@esbuild/darwin-x64@0.17.19: 103 | resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} 104 | engines: {node: '>=12'} 105 | cpu: [x64] 106 | os: [darwin] 107 | requiresBuild: true 108 | dev: true 109 | optional: true 110 | 111 | /@esbuild/freebsd-arm64@0.17.19: 112 | resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} 113 | engines: {node: '>=12'} 114 | cpu: [arm64] 115 | os: [freebsd] 116 | requiresBuild: true 117 | dev: true 118 | optional: true 119 | 120 | /@esbuild/freebsd-x64@0.17.19: 121 | resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} 122 | engines: {node: '>=12'} 123 | cpu: [x64] 124 | os: [freebsd] 125 | requiresBuild: true 126 | dev: true 127 | optional: true 128 | 129 | /@esbuild/linux-arm64@0.17.19: 130 | resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} 131 | engines: {node: '>=12'} 132 | cpu: [arm64] 133 | os: [linux] 134 | requiresBuild: true 135 | dev: true 136 | optional: true 137 | 138 | /@esbuild/linux-arm@0.17.19: 139 | resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} 140 | engines: {node: '>=12'} 141 | cpu: [arm] 142 | os: [linux] 143 | requiresBuild: true 144 | dev: true 145 | optional: true 146 | 147 | /@esbuild/linux-ia32@0.17.19: 148 | resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} 149 | engines: {node: '>=12'} 150 | cpu: [ia32] 151 | os: [linux] 152 | requiresBuild: true 153 | dev: true 154 | optional: true 155 | 156 | /@esbuild/linux-loong64@0.17.19: 157 | resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} 158 | engines: {node: '>=12'} 159 | cpu: [loong64] 160 | os: [linux] 161 | requiresBuild: true 162 | dev: true 163 | optional: true 164 | 165 | /@esbuild/linux-mips64el@0.17.19: 166 | resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} 167 | engines: {node: '>=12'} 168 | cpu: [mips64el] 169 | os: [linux] 170 | requiresBuild: true 171 | dev: true 172 | optional: true 173 | 174 | /@esbuild/linux-ppc64@0.17.19: 175 | resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} 176 | engines: {node: '>=12'} 177 | cpu: [ppc64] 178 | os: [linux] 179 | requiresBuild: true 180 | dev: true 181 | optional: true 182 | 183 | /@esbuild/linux-riscv64@0.17.19: 184 | resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} 185 | engines: {node: '>=12'} 186 | cpu: [riscv64] 187 | os: [linux] 188 | requiresBuild: true 189 | dev: true 190 | optional: true 191 | 192 | /@esbuild/linux-s390x@0.17.19: 193 | resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} 194 | engines: {node: '>=12'} 195 | cpu: [s390x] 196 | os: [linux] 197 | requiresBuild: true 198 | dev: true 199 | optional: true 200 | 201 | /@esbuild/linux-x64@0.17.19: 202 | resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} 203 | engines: {node: '>=12'} 204 | cpu: [x64] 205 | os: [linux] 206 | requiresBuild: true 207 | dev: true 208 | optional: true 209 | 210 | /@esbuild/netbsd-x64@0.17.19: 211 | resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} 212 | engines: {node: '>=12'} 213 | cpu: [x64] 214 | os: [netbsd] 215 | requiresBuild: true 216 | dev: true 217 | optional: true 218 | 219 | /@esbuild/openbsd-x64@0.17.19: 220 | resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} 221 | engines: {node: '>=12'} 222 | cpu: [x64] 223 | os: [openbsd] 224 | requiresBuild: true 225 | dev: true 226 | optional: true 227 | 228 | /@esbuild/sunos-x64@0.17.19: 229 | resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} 230 | engines: {node: '>=12'} 231 | cpu: [x64] 232 | os: [sunos] 233 | requiresBuild: true 234 | dev: true 235 | optional: true 236 | 237 | /@esbuild/win32-arm64@0.17.19: 238 | resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} 239 | engines: {node: '>=12'} 240 | cpu: [arm64] 241 | os: [win32] 242 | requiresBuild: true 243 | dev: true 244 | optional: true 245 | 246 | /@esbuild/win32-ia32@0.17.19: 247 | resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} 248 | engines: {node: '>=12'} 249 | cpu: [ia32] 250 | os: [win32] 251 | requiresBuild: true 252 | dev: true 253 | optional: true 254 | 255 | /@esbuild/win32-x64@0.17.19: 256 | resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} 257 | engines: {node: '>=12'} 258 | cpu: [x64] 259 | os: [win32] 260 | requiresBuild: true 261 | dev: true 262 | optional: true 263 | 264 | /@eslint-community/eslint-utils@4.4.0(eslint@8.47.0): 265 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 266 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 267 | peerDependencies: 268 | eslint: '*' 269 | dependencies: 270 | eslint: 8.47.0 271 | eslint-visitor-keys: 3.4.3 272 | dev: true 273 | 274 | /@eslint-community/regexpp@4.6.2: 275 | resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==} 276 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 277 | dev: true 278 | 279 | /@eslint/eslintrc@2.1.2: 280 | resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} 281 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 282 | dependencies: 283 | ajv: 6.12.6 284 | debug: 4.3.4 285 | espree: 9.6.1 286 | globals: 13.21.0 287 | ignore: 5.2.4 288 | import-fresh: 3.3.0 289 | js-yaml: 4.1.0 290 | minimatch: 3.1.2 291 | strip-json-comments: 3.1.1 292 | transitivePeerDependencies: 293 | - supports-color 294 | dev: true 295 | 296 | /@eslint/js@8.47.0: 297 | resolution: {integrity: sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==} 298 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 299 | dev: true 300 | 301 | /@humanwhocodes/config-array@0.11.10: 302 | resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} 303 | engines: {node: '>=10.10.0'} 304 | dependencies: 305 | '@humanwhocodes/object-schema': 1.2.1 306 | debug: 4.3.4 307 | minimatch: 3.1.2 308 | transitivePeerDependencies: 309 | - supports-color 310 | dev: true 311 | 312 | /@humanwhocodes/module-importer@1.0.1: 313 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 314 | engines: {node: '>=12.22'} 315 | dev: true 316 | 317 | /@humanwhocodes/object-schema@1.2.1: 318 | resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} 319 | dev: true 320 | 321 | /@nodelib/fs.scandir@2.1.5: 322 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 323 | engines: {node: '>= 8'} 324 | dependencies: 325 | '@nodelib/fs.stat': 2.0.5 326 | run-parallel: 1.2.0 327 | dev: true 328 | 329 | /@nodelib/fs.stat@2.0.5: 330 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 331 | engines: {node: '>= 8'} 332 | dev: true 333 | 334 | /@nodelib/fs.walk@1.2.8: 335 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 336 | engines: {node: '>= 8'} 337 | dependencies: 338 | '@nodelib/fs.scandir': 2.1.5 339 | fastq: 1.15.0 340 | dev: true 341 | 342 | /@swc/core-darwin-arm64@1.3.76: 343 | resolution: {integrity: sha512-ovviEhZ/1E81Z9OGrO0ivLWk4VCa3I3ZzM+cd3gugglRRwVwtlIaoIYqY5S3KiCAupDd1+UCl5X7Vbio7a/V8g==} 344 | engines: {node: '>=10'} 345 | cpu: [arm64] 346 | os: [darwin] 347 | requiresBuild: true 348 | dev: true 349 | optional: true 350 | 351 | /@swc/core-darwin-x64@1.3.76: 352 | resolution: {integrity: sha512-tcySTDqs0SHCebtW35sCdcLWsmTEo7bEwx0gNL/spetqVT9fpFi6qU8qcnt7i2KaZHbeNl9g1aadu+Yrni+GzA==} 353 | engines: {node: '>=10'} 354 | cpu: [x64] 355 | os: [darwin] 356 | requiresBuild: true 357 | dev: true 358 | optional: true 359 | 360 | /@swc/core-linux-arm-gnueabihf@1.3.76: 361 | resolution: {integrity: sha512-apgzpGWy1AwoMF4urAAASsAjE7rEzZFIF+p6utuxhS7cNHzE0AyEVDYJbo+pzBdlZ8orBdzzsHtFwoEgKOjebA==} 362 | engines: {node: '>=10'} 363 | cpu: [arm] 364 | os: [linux] 365 | requiresBuild: true 366 | dev: true 367 | optional: true 368 | 369 | /@swc/core-linux-arm64-gnu@1.3.76: 370 | resolution: {integrity: sha512-c3c0zz6S0eludqidDpuqbadE0WT3OZczyQxe9Vw8lFFXES85mvNGtwYzyGK2o7TICpsuHrndwDIoYpmpWk879g==} 371 | engines: {node: '>=10'} 372 | cpu: [arm64] 373 | os: [linux] 374 | requiresBuild: true 375 | dev: true 376 | optional: true 377 | 378 | /@swc/core-linux-arm64-musl@1.3.76: 379 | resolution: {integrity: sha512-Is3bpq7F2qtlnkzEeOD6HIZJPpOmu3q6c82lKww90Q0NnrlSluVMozTHJgwVoFZyizH7uLnk0LuNcEAWLnmJIw==} 380 | engines: {node: '>=10'} 381 | cpu: [arm64] 382 | os: [linux] 383 | requiresBuild: true 384 | dev: true 385 | optional: true 386 | 387 | /@swc/core-linux-x64-gnu@1.3.76: 388 | resolution: {integrity: sha512-iwCeRzd9oSvUzqt7nU6p/ztceAWfnO9XVxBn502R5gs6QCBbE1HCKrWHDO77aKPK7ss+0NcIGHvXTd9L8/wRzw==} 389 | engines: {node: '>=10'} 390 | cpu: [x64] 391 | os: [linux] 392 | requiresBuild: true 393 | dev: true 394 | optional: true 395 | 396 | /@swc/core-linux-x64-musl@1.3.76: 397 | resolution: {integrity: sha512-a671g4tW8kyFeuICsgq4uB9ukQfiIyXJT4V6YSnmqhCTz5mazWuDxZ5wKnx/1g5nXTl+U5cWH2TZaCJatp4GKA==} 398 | engines: {node: '>=10'} 399 | cpu: [x64] 400 | os: [linux] 401 | requiresBuild: true 402 | dev: true 403 | optional: true 404 | 405 | /@swc/core-win32-arm64-msvc@1.3.76: 406 | resolution: {integrity: sha512-+swEFtjdMezS0vKUhJC3psdSDtOJGY5pEOt4e8XOPvn7aQpKQ9LfF49XVtIwDSk5SGuWtVoLFzkSY3reWUJCyg==} 407 | engines: {node: '>=10'} 408 | cpu: [arm64] 409 | os: [win32] 410 | requiresBuild: true 411 | dev: true 412 | optional: true 413 | 414 | /@swc/core-win32-ia32-msvc@1.3.76: 415 | resolution: {integrity: sha512-5CqwAykpGBJ3PqGLOlWGLGIPpBAG1IwWVDUfro3hhjQ7XJxV5Z1aQf5V5OJ90HJVtrEAVx2xx59UV/Dh081LOg==} 416 | engines: {node: '>=10'} 417 | cpu: [ia32] 418 | os: [win32] 419 | requiresBuild: true 420 | dev: true 421 | optional: true 422 | 423 | /@swc/core-win32-x64-msvc@1.3.76: 424 | resolution: {integrity: sha512-CiMpWLLlR3Cew9067E7XxaLBwYYJ90r9EhGSO6V1pvYSWj7ET/Ppmtj1ZhzPJMqRXAP6xflfl5R5o4ee1m4WLA==} 425 | engines: {node: '>=10'} 426 | cpu: [x64] 427 | os: [win32] 428 | requiresBuild: true 429 | dev: true 430 | optional: true 431 | 432 | /@swc/core@1.3.76(@swc/helpers@0.5.1): 433 | resolution: {integrity: sha512-aYYTA2aVYkwJAZepQXtPnkUthhOfn8qd6rsh+lrJxonFrjmpI7RHt2tMDVTXP6XDX7fvnvrVtT1bwZfmBFPh0Q==} 434 | engines: {node: '>=10'} 435 | requiresBuild: true 436 | peerDependencies: 437 | '@swc/helpers': ^0.5.0 438 | peerDependenciesMeta: 439 | '@swc/helpers': 440 | optional: true 441 | dependencies: 442 | '@swc/helpers': 0.5.1 443 | optionalDependencies: 444 | '@swc/core-darwin-arm64': 1.3.76 445 | '@swc/core-darwin-x64': 1.3.76 446 | '@swc/core-linux-arm-gnueabihf': 1.3.76 447 | '@swc/core-linux-arm64-gnu': 1.3.76 448 | '@swc/core-linux-arm64-musl': 1.3.76 449 | '@swc/core-linux-x64-gnu': 1.3.76 450 | '@swc/core-linux-x64-musl': 1.3.76 451 | '@swc/core-win32-arm64-msvc': 1.3.76 452 | '@swc/core-win32-ia32-msvc': 1.3.76 453 | '@swc/core-win32-x64-msvc': 1.3.76 454 | dev: true 455 | 456 | /@swc/helpers@0.5.1: 457 | resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} 458 | dependencies: 459 | tslib: 2.6.1 460 | 461 | /@types/json-schema@7.0.12: 462 | resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} 463 | dev: true 464 | 465 | /@types/json5@0.0.29: 466 | resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} 467 | dev: true 468 | 469 | /@types/prop-types@15.7.5: 470 | resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} 471 | dev: true 472 | 473 | /@types/react-native@0.70.14: 474 | resolution: {integrity: sha512-Kwc+BYBrnDqvacNxKp1UtcZJnJJnTih2NYmi/ieAKlHdxEPN6sYMwmIwgHdoLHggvml6bf3DYRaH2jt+gzaLjw==} 475 | dependencies: 476 | '@types/react': 18.2.20 477 | dev: true 478 | 479 | /@types/react@18.2.20: 480 | resolution: {integrity: sha512-WKNtmsLWJM/3D5mG4U84cysVY31ivmyw85dE84fOCk5Hx78wezB/XEjVPWl2JTZ5FkEeaTJf+VgUAUn3PE7Isw==} 481 | dependencies: 482 | '@types/prop-types': 15.7.5 483 | '@types/scheduler': 0.16.3 484 | csstype: 3.1.2 485 | dev: true 486 | 487 | /@types/scheduler@0.16.3: 488 | resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} 489 | dev: true 490 | 491 | /@types/semver@7.5.0: 492 | resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} 493 | dev: true 494 | 495 | /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.47.0)(typescript@5.1.6): 496 | resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} 497 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 498 | peerDependencies: 499 | '@typescript-eslint/parser': ^5.0.0 500 | eslint: '*' 501 | typescript: '*' 502 | peerDependenciesMeta: 503 | typescript: 504 | optional: true 505 | dependencies: 506 | '@eslint-community/regexpp': 4.6.2 507 | '@typescript-eslint/parser': 5.62.0(eslint@8.47.0)(typescript@5.1.6) 508 | '@typescript-eslint/scope-manager': 5.62.0 509 | '@typescript-eslint/type-utils': 5.62.0(eslint@8.47.0)(typescript@5.1.6) 510 | '@typescript-eslint/utils': 5.62.0(eslint@8.47.0)(typescript@5.1.6) 511 | debug: 4.3.4 512 | eslint: 8.47.0 513 | graphemer: 1.4.0 514 | ignore: 5.2.4 515 | natural-compare-lite: 1.4.0 516 | semver: 7.5.4 517 | tsutils: 3.21.0(typescript@5.1.6) 518 | typescript: 5.1.6 519 | transitivePeerDependencies: 520 | - supports-color 521 | dev: true 522 | 523 | /@typescript-eslint/parser@5.62.0(eslint@8.47.0)(typescript@5.1.6): 524 | resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} 525 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 526 | peerDependencies: 527 | eslint: '*' 528 | typescript: '*' 529 | peerDependenciesMeta: 530 | typescript: 531 | optional: true 532 | dependencies: 533 | '@typescript-eslint/scope-manager': 5.62.0 534 | '@typescript-eslint/types': 5.62.0 535 | '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.1.6) 536 | debug: 4.3.4 537 | eslint: 8.47.0 538 | typescript: 5.1.6 539 | transitivePeerDependencies: 540 | - supports-color 541 | dev: true 542 | 543 | /@typescript-eslint/scope-manager@5.62.0: 544 | resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} 545 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 546 | dependencies: 547 | '@typescript-eslint/types': 5.62.0 548 | '@typescript-eslint/visitor-keys': 5.62.0 549 | dev: true 550 | 551 | /@typescript-eslint/type-utils@5.62.0(eslint@8.47.0)(typescript@5.1.6): 552 | resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} 553 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 554 | peerDependencies: 555 | eslint: '*' 556 | typescript: '*' 557 | peerDependenciesMeta: 558 | typescript: 559 | optional: true 560 | dependencies: 561 | '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.1.6) 562 | '@typescript-eslint/utils': 5.62.0(eslint@8.47.0)(typescript@5.1.6) 563 | debug: 4.3.4 564 | eslint: 8.47.0 565 | tsutils: 3.21.0(typescript@5.1.6) 566 | typescript: 5.1.6 567 | transitivePeerDependencies: 568 | - supports-color 569 | dev: true 570 | 571 | /@typescript-eslint/types@5.62.0: 572 | resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} 573 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 574 | dev: true 575 | 576 | /@typescript-eslint/typescript-estree@5.62.0(typescript@5.1.6): 577 | resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} 578 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 579 | peerDependencies: 580 | typescript: '*' 581 | peerDependenciesMeta: 582 | typescript: 583 | optional: true 584 | dependencies: 585 | '@typescript-eslint/types': 5.62.0 586 | '@typescript-eslint/visitor-keys': 5.62.0 587 | debug: 4.3.4 588 | globby: 11.1.0 589 | is-glob: 4.0.3 590 | semver: 7.5.4 591 | tsutils: 3.21.0(typescript@5.1.6) 592 | typescript: 5.1.6 593 | transitivePeerDependencies: 594 | - supports-color 595 | dev: true 596 | 597 | /@typescript-eslint/utils@5.62.0(eslint@8.47.0)(typescript@5.1.6): 598 | resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} 599 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 600 | peerDependencies: 601 | eslint: '*' 602 | dependencies: 603 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) 604 | '@types/json-schema': 7.0.12 605 | '@types/semver': 7.5.0 606 | '@typescript-eslint/scope-manager': 5.62.0 607 | '@typescript-eslint/types': 5.62.0 608 | '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.1.6) 609 | eslint: 8.47.0 610 | eslint-scope: 5.1.1 611 | semver: 7.5.4 612 | transitivePeerDependencies: 613 | - supports-color 614 | - typescript 615 | dev: true 616 | 617 | /@typescript-eslint/visitor-keys@5.62.0: 618 | resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} 619 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 620 | dependencies: 621 | '@typescript-eslint/types': 5.62.0 622 | eslint-visitor-keys: 3.4.3 623 | dev: true 624 | 625 | /acorn-jsx@5.3.2(acorn@8.10.0): 626 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 627 | peerDependencies: 628 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 629 | dependencies: 630 | acorn: 8.10.0 631 | dev: true 632 | 633 | /acorn@8.10.0: 634 | resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} 635 | engines: {node: '>=0.4.0'} 636 | hasBin: true 637 | dev: true 638 | 639 | /ajv@6.12.6: 640 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 641 | dependencies: 642 | fast-deep-equal: 3.1.3 643 | fast-json-stable-stringify: 2.1.0 644 | json-schema-traverse: 0.4.1 645 | uri-js: 4.4.1 646 | dev: true 647 | 648 | /ansi-regex@5.0.1: 649 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 650 | engines: {node: '>=8'} 651 | dev: true 652 | 653 | /ansi-styles@4.3.0: 654 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 655 | engines: {node: '>=8'} 656 | dependencies: 657 | color-convert: 2.0.1 658 | dev: true 659 | 660 | /anymatch@3.1.3: 661 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 662 | engines: {node: '>= 8'} 663 | dependencies: 664 | normalize-path: 3.0.0 665 | picomatch: 2.3.1 666 | dev: true 667 | 668 | /argparse@2.0.1: 669 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 670 | dev: true 671 | 672 | /arr-diff@4.0.0: 673 | resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} 674 | engines: {node: '>=0.10.0'} 675 | dev: true 676 | 677 | /arr-union@3.1.0: 678 | resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} 679 | engines: {node: '>=0.10.0'} 680 | dev: true 681 | 682 | /array-buffer-byte-length@1.0.0: 683 | resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} 684 | dependencies: 685 | call-bind: 1.0.2 686 | is-array-buffer: 3.0.2 687 | dev: true 688 | 689 | /array-includes@3.1.6: 690 | resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} 691 | engines: {node: '>= 0.4'} 692 | dependencies: 693 | call-bind: 1.0.2 694 | define-properties: 1.2.0 695 | es-abstract: 1.22.1 696 | get-intrinsic: 1.2.1 697 | is-string: 1.0.7 698 | dev: true 699 | 700 | /array-union@2.1.0: 701 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 702 | engines: {node: '>=8'} 703 | dev: true 704 | 705 | /array-unique@0.3.2: 706 | resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} 707 | engines: {node: '>=0.10.0'} 708 | dev: true 709 | 710 | /array.prototype.findlastindex@1.2.2: 711 | resolution: {integrity: sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==} 712 | engines: {node: '>= 0.4'} 713 | dependencies: 714 | call-bind: 1.0.2 715 | define-properties: 1.2.0 716 | es-abstract: 1.22.1 717 | es-shim-unscopables: 1.0.0 718 | get-intrinsic: 1.2.1 719 | dev: true 720 | 721 | /array.prototype.flat@1.3.1: 722 | resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} 723 | engines: {node: '>= 0.4'} 724 | dependencies: 725 | call-bind: 1.0.2 726 | define-properties: 1.2.0 727 | es-abstract: 1.22.1 728 | es-shim-unscopables: 1.0.0 729 | dev: true 730 | 731 | /array.prototype.flatmap@1.3.1: 732 | resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} 733 | engines: {node: '>= 0.4'} 734 | dependencies: 735 | call-bind: 1.0.2 736 | define-properties: 1.2.0 737 | es-abstract: 1.22.1 738 | es-shim-unscopables: 1.0.0 739 | dev: true 740 | 741 | /array.prototype.tosorted@1.1.1: 742 | resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} 743 | dependencies: 744 | call-bind: 1.0.2 745 | define-properties: 1.2.0 746 | es-abstract: 1.22.1 747 | es-shim-unscopables: 1.0.0 748 | get-intrinsic: 1.2.1 749 | dev: true 750 | 751 | /arraybuffer.prototype.slice@1.0.1: 752 | resolution: {integrity: sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==} 753 | engines: {node: '>= 0.4'} 754 | dependencies: 755 | array-buffer-byte-length: 1.0.0 756 | call-bind: 1.0.2 757 | define-properties: 1.2.0 758 | get-intrinsic: 1.2.1 759 | is-array-buffer: 3.0.2 760 | is-shared-array-buffer: 1.0.2 761 | dev: true 762 | 763 | /assign-symbols@1.0.0: 764 | resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} 765 | engines: {node: '>=0.10.0'} 766 | dev: true 767 | 768 | /atob@2.1.2: 769 | resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} 770 | engines: {node: '>= 4.5.0'} 771 | hasBin: true 772 | dev: true 773 | 774 | /available-typed-arrays@1.0.5: 775 | resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} 776 | engines: {node: '>= 0.4'} 777 | dev: true 778 | 779 | /balanced-match@1.0.2: 780 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 781 | dev: true 782 | 783 | /base@0.11.2: 784 | resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} 785 | engines: {node: '>=0.10.0'} 786 | dependencies: 787 | cache-base: 1.0.1 788 | class-utils: 0.3.6 789 | component-emitter: 1.3.0 790 | define-property: 1.0.0 791 | isobject: 3.0.1 792 | mixin-deep: 1.3.2 793 | pascalcase: 0.1.1 794 | dev: true 795 | 796 | /binary-extensions@2.2.0: 797 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 798 | engines: {node: '>=8'} 799 | dev: true 800 | 801 | /brace-expansion@1.1.11: 802 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 803 | dependencies: 804 | balanced-match: 1.0.2 805 | concat-map: 0.0.1 806 | dev: true 807 | 808 | /braces@3.0.2: 809 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 810 | engines: {node: '>=8'} 811 | dependencies: 812 | fill-range: 7.0.1 813 | dev: true 814 | 815 | /cache-base@1.0.1: 816 | resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} 817 | engines: {node: '>=0.10.0'} 818 | dependencies: 819 | collection-visit: 1.0.0 820 | component-emitter: 1.3.0 821 | get-value: 2.0.6 822 | has-value: 1.0.0 823 | isobject: 3.0.1 824 | set-value: 2.0.1 825 | to-object-path: 0.3.0 826 | union-value: 1.0.1 827 | unset-value: 1.0.0 828 | dev: true 829 | 830 | /call-bind@1.0.2: 831 | resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} 832 | dependencies: 833 | function-bind: 1.1.1 834 | get-intrinsic: 1.2.1 835 | dev: true 836 | 837 | /callsites@3.1.0: 838 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 839 | engines: {node: '>=6'} 840 | dev: true 841 | 842 | /chalk@4.1.2: 843 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 844 | engines: {node: '>=10'} 845 | dependencies: 846 | ansi-styles: 4.3.0 847 | supports-color: 7.2.0 848 | dev: true 849 | 850 | /chokidar@3.5.3: 851 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 852 | engines: {node: '>= 8.10.0'} 853 | dependencies: 854 | anymatch: 3.1.3 855 | braces: 3.0.2 856 | glob-parent: 5.1.2 857 | is-binary-path: 2.1.0 858 | is-glob: 4.0.3 859 | normalize-path: 3.0.0 860 | readdirp: 3.6.0 861 | optionalDependencies: 862 | fsevents: 2.3.2 863 | dev: true 864 | 865 | /class-utils@0.3.6: 866 | resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} 867 | engines: {node: '>=0.10.0'} 868 | dependencies: 869 | arr-union: 3.1.0 870 | define-property: 0.2.5 871 | isobject: 3.0.1 872 | static-extend: 0.1.2 873 | dev: true 874 | 875 | /collection-visit@1.0.0: 876 | resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} 877 | engines: {node: '>=0.10.0'} 878 | dependencies: 879 | map-visit: 1.0.0 880 | object-visit: 1.0.1 881 | dev: true 882 | 883 | /color-convert@2.0.1: 884 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 885 | engines: {node: '>=7.0.0'} 886 | dependencies: 887 | color-name: 1.1.4 888 | dev: true 889 | 890 | /color-name@1.1.4: 891 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 892 | dev: true 893 | 894 | /commander@9.5.0: 895 | resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} 896 | engines: {node: ^12.20.0 || >=14} 897 | dev: true 898 | 899 | /component-emitter@1.3.0: 900 | resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} 901 | dev: true 902 | 903 | /concat-map@0.0.1: 904 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 905 | dev: true 906 | 907 | /copy-descriptor@0.1.1: 908 | resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} 909 | engines: {node: '>=0.10.0'} 910 | dev: true 911 | 912 | /cross-spawn@7.0.3: 913 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 914 | engines: {node: '>= 8'} 915 | dependencies: 916 | path-key: 3.1.1 917 | shebang-command: 2.0.0 918 | which: 2.0.2 919 | dev: true 920 | 921 | /csstype@3.1.2: 922 | resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} 923 | dev: true 924 | 925 | /debug@2.6.9: 926 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} 927 | peerDependencies: 928 | supports-color: '*' 929 | peerDependenciesMeta: 930 | supports-color: 931 | optional: true 932 | dependencies: 933 | ms: 2.0.0 934 | dev: true 935 | 936 | /debug@3.2.7: 937 | resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} 938 | peerDependencies: 939 | supports-color: '*' 940 | peerDependenciesMeta: 941 | supports-color: 942 | optional: true 943 | dependencies: 944 | ms: 2.1.3 945 | dev: true 946 | 947 | /debug@4.3.4: 948 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 949 | engines: {node: '>=6.0'} 950 | peerDependencies: 951 | supports-color: '*' 952 | peerDependenciesMeta: 953 | supports-color: 954 | optional: true 955 | dependencies: 956 | ms: 2.1.2 957 | dev: true 958 | 959 | /decode-uri-component@0.2.2: 960 | resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} 961 | engines: {node: '>=0.10'} 962 | dev: true 963 | 964 | /deep-is@0.1.4: 965 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 966 | dev: true 967 | 968 | /define-properties@1.2.0: 969 | resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} 970 | engines: {node: '>= 0.4'} 971 | dependencies: 972 | has-property-descriptors: 1.0.0 973 | object-keys: 1.1.1 974 | dev: true 975 | 976 | /define-property@0.2.5: 977 | resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} 978 | engines: {node: '>=0.10.0'} 979 | dependencies: 980 | is-descriptor: 0.1.6 981 | dev: true 982 | 983 | /define-property@1.0.0: 984 | resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} 985 | engines: {node: '>=0.10.0'} 986 | dependencies: 987 | is-descriptor: 1.0.2 988 | dev: true 989 | 990 | /define-property@2.0.2: 991 | resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} 992 | engines: {node: '>=0.10.0'} 993 | dependencies: 994 | is-descriptor: 1.0.2 995 | isobject: 3.0.1 996 | dev: true 997 | 998 | /dir-glob@3.0.1: 999 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 1000 | engines: {node: '>=8'} 1001 | dependencies: 1002 | path-type: 4.0.0 1003 | dev: true 1004 | 1005 | /doctrine@2.1.0: 1006 | resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} 1007 | engines: {node: '>=0.10.0'} 1008 | dependencies: 1009 | esutils: 2.0.3 1010 | dev: true 1011 | 1012 | /doctrine@3.0.0: 1013 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 1014 | engines: {node: '>=6.0.0'} 1015 | dependencies: 1016 | esutils: 2.0.3 1017 | dev: true 1018 | 1019 | /es-abstract@1.22.1: 1020 | resolution: {integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==} 1021 | engines: {node: '>= 0.4'} 1022 | dependencies: 1023 | array-buffer-byte-length: 1.0.0 1024 | arraybuffer.prototype.slice: 1.0.1 1025 | available-typed-arrays: 1.0.5 1026 | call-bind: 1.0.2 1027 | es-set-tostringtag: 2.0.1 1028 | es-to-primitive: 1.2.1 1029 | function.prototype.name: 1.1.5 1030 | get-intrinsic: 1.2.1 1031 | get-symbol-description: 1.0.0 1032 | globalthis: 1.0.3 1033 | gopd: 1.0.1 1034 | has: 1.0.3 1035 | has-property-descriptors: 1.0.0 1036 | has-proto: 1.0.1 1037 | has-symbols: 1.0.3 1038 | internal-slot: 1.0.5 1039 | is-array-buffer: 3.0.2 1040 | is-callable: 1.2.7 1041 | is-negative-zero: 2.0.2 1042 | is-regex: 1.1.4 1043 | is-shared-array-buffer: 1.0.2 1044 | is-string: 1.0.7 1045 | is-typed-array: 1.1.12 1046 | is-weakref: 1.0.2 1047 | object-inspect: 1.12.3 1048 | object-keys: 1.1.1 1049 | object.assign: 4.1.4 1050 | regexp.prototype.flags: 1.5.0 1051 | safe-array-concat: 1.0.0 1052 | safe-regex-test: 1.0.0 1053 | string.prototype.trim: 1.2.7 1054 | string.prototype.trimend: 1.0.6 1055 | string.prototype.trimstart: 1.0.6 1056 | typed-array-buffer: 1.0.0 1057 | typed-array-byte-length: 1.0.0 1058 | typed-array-byte-offset: 1.0.0 1059 | typed-array-length: 1.0.4 1060 | unbox-primitive: 1.0.2 1061 | which-typed-array: 1.1.11 1062 | dev: true 1063 | 1064 | /es-set-tostringtag@2.0.1: 1065 | resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} 1066 | engines: {node: '>= 0.4'} 1067 | dependencies: 1068 | get-intrinsic: 1.2.1 1069 | has: 1.0.3 1070 | has-tostringtag: 1.0.0 1071 | dev: true 1072 | 1073 | /es-shim-unscopables@1.0.0: 1074 | resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} 1075 | dependencies: 1076 | has: 1.0.3 1077 | dev: true 1078 | 1079 | /es-to-primitive@1.2.1: 1080 | resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} 1081 | engines: {node: '>= 0.4'} 1082 | dependencies: 1083 | is-callable: 1.2.7 1084 | is-date-object: 1.0.5 1085 | is-symbol: 1.0.4 1086 | dev: true 1087 | 1088 | /esbuild@0.17.19: 1089 | resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} 1090 | engines: {node: '>=12'} 1091 | hasBin: true 1092 | requiresBuild: true 1093 | optionalDependencies: 1094 | '@esbuild/android-arm': 0.17.19 1095 | '@esbuild/android-arm64': 0.17.19 1096 | '@esbuild/android-x64': 0.17.19 1097 | '@esbuild/darwin-arm64': 0.17.19 1098 | '@esbuild/darwin-x64': 0.17.19 1099 | '@esbuild/freebsd-arm64': 0.17.19 1100 | '@esbuild/freebsd-x64': 0.17.19 1101 | '@esbuild/linux-arm': 0.17.19 1102 | '@esbuild/linux-arm64': 0.17.19 1103 | '@esbuild/linux-ia32': 0.17.19 1104 | '@esbuild/linux-loong64': 0.17.19 1105 | '@esbuild/linux-mips64el': 0.17.19 1106 | '@esbuild/linux-ppc64': 0.17.19 1107 | '@esbuild/linux-riscv64': 0.17.19 1108 | '@esbuild/linux-s390x': 0.17.19 1109 | '@esbuild/linux-x64': 0.17.19 1110 | '@esbuild/netbsd-x64': 0.17.19 1111 | '@esbuild/openbsd-x64': 0.17.19 1112 | '@esbuild/sunos-x64': 0.17.19 1113 | '@esbuild/win32-arm64': 0.17.19 1114 | '@esbuild/win32-ia32': 0.17.19 1115 | '@esbuild/win32-x64': 0.17.19 1116 | dev: true 1117 | 1118 | /escape-string-regexp@4.0.0: 1119 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 1120 | engines: {node: '>=10'} 1121 | dev: true 1122 | 1123 | /eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.28.0): 1124 | resolution: {integrity: sha512-WdviM1Eu834zsfjHtcGHtGfcu+F30Od3V7I9Fi57uhBEwPkjDcii7/yW8jAT+gOhn4P/vOxxNAXbFAKsrrc15w==} 1125 | engines: {node: '>= 4'} 1126 | peerDependencies: 1127 | eslint-plugin-import: '>=1.4.0' 1128 | dependencies: 1129 | eslint-plugin-import: 2.28.0(@typescript-eslint/parser@5.62.0)(eslint@8.47.0) 1130 | dev: true 1131 | 1132 | /eslint-import-resolver-node@0.3.9: 1133 | resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} 1134 | dependencies: 1135 | debug: 3.2.7 1136 | is-core-module: 2.13.0 1137 | resolve: 1.22.4 1138 | transitivePeerDependencies: 1139 | - supports-color 1140 | dev: true 1141 | 1142 | /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.47.0): 1143 | resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} 1144 | engines: {node: '>=4'} 1145 | peerDependencies: 1146 | '@typescript-eslint/parser': '*' 1147 | eslint: '*' 1148 | eslint-import-resolver-node: '*' 1149 | eslint-import-resolver-typescript: '*' 1150 | eslint-import-resolver-webpack: '*' 1151 | peerDependenciesMeta: 1152 | '@typescript-eslint/parser': 1153 | optional: true 1154 | eslint: 1155 | optional: true 1156 | eslint-import-resolver-node: 1157 | optional: true 1158 | eslint-import-resolver-typescript: 1159 | optional: true 1160 | eslint-import-resolver-webpack: 1161 | optional: true 1162 | dependencies: 1163 | '@typescript-eslint/parser': 5.62.0(eslint@8.47.0)(typescript@5.1.6) 1164 | debug: 3.2.7 1165 | eslint: 8.47.0 1166 | eslint-import-resolver-node: 0.3.9 1167 | transitivePeerDependencies: 1168 | - supports-color 1169 | dev: true 1170 | 1171 | /eslint-plugin-import@2.28.0(@typescript-eslint/parser@5.62.0)(eslint@8.47.0): 1172 | resolution: {integrity: sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q==} 1173 | engines: {node: '>=4'} 1174 | peerDependencies: 1175 | '@typescript-eslint/parser': '*' 1176 | eslint: '*' 1177 | peerDependenciesMeta: 1178 | '@typescript-eslint/parser': 1179 | optional: true 1180 | dependencies: 1181 | '@typescript-eslint/parser': 5.62.0(eslint@8.47.0)(typescript@5.1.6) 1182 | array-includes: 3.1.6 1183 | array.prototype.findlastindex: 1.2.2 1184 | array.prototype.flat: 1.3.1 1185 | array.prototype.flatmap: 1.3.1 1186 | debug: 3.2.7 1187 | doctrine: 2.1.0 1188 | eslint: 8.47.0 1189 | eslint-import-resolver-node: 0.3.9 1190 | eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.47.0) 1191 | has: 1.0.3 1192 | is-core-module: 2.13.0 1193 | is-glob: 4.0.3 1194 | minimatch: 3.1.2 1195 | object.fromentries: 2.0.6 1196 | object.groupby: 1.0.0 1197 | object.values: 1.1.6 1198 | resolve: 1.22.4 1199 | semver: 6.3.1 1200 | tsconfig-paths: 3.14.2 1201 | transitivePeerDependencies: 1202 | - eslint-import-resolver-typescript 1203 | - eslint-import-resolver-webpack 1204 | - supports-color 1205 | dev: true 1206 | 1207 | /eslint-plugin-path-alias@1.0.0(eslint@8.47.0): 1208 | resolution: {integrity: sha512-FXus57yC+Zd3sMv46pbloXYwFeNVNHJqlACr9V68FG/IzGFBBokGJpmjDbEjpt8ZCeVSndUubeDWWl2A8sCNVQ==} 1209 | peerDependencies: 1210 | eslint: '*' 1211 | dependencies: 1212 | eslint: 8.47.0 1213 | nanomatch: 1.2.13 1214 | transitivePeerDependencies: 1215 | - supports-color 1216 | dev: true 1217 | 1218 | /eslint-plugin-react@7.33.1(eslint@8.47.0): 1219 | resolution: {integrity: sha512-L093k0WAMvr6VhNwReB8VgOq5s2LesZmrpPdKz/kZElQDzqS7G7+DnKoqT+w4JwuiGeAhAvHO0fvy0Eyk4ejDA==} 1220 | engines: {node: '>=4'} 1221 | peerDependencies: 1222 | eslint: '*' 1223 | dependencies: 1224 | array-includes: 3.1.6 1225 | array.prototype.flatmap: 1.3.1 1226 | array.prototype.tosorted: 1.1.1 1227 | doctrine: 2.1.0 1228 | eslint: 8.47.0 1229 | estraverse: 5.3.0 1230 | jsx-ast-utils: 3.3.5 1231 | minimatch: 3.1.2 1232 | object.entries: 1.1.6 1233 | object.fromentries: 2.0.6 1234 | object.hasown: 1.1.2 1235 | object.values: 1.1.6 1236 | prop-types: 15.8.1 1237 | resolve: 2.0.0-next.4 1238 | semver: 6.3.1 1239 | string.prototype.matchall: 4.0.8 1240 | dev: true 1241 | 1242 | /eslint-plugin-simple-import-sort@10.0.0(eslint@8.47.0): 1243 | resolution: {integrity: sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw==} 1244 | peerDependencies: 1245 | eslint: '*' 1246 | dependencies: 1247 | eslint: 8.47.0 1248 | dev: true 1249 | 1250 | /eslint-scope@5.1.1: 1251 | resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} 1252 | engines: {node: '>=8.0.0'} 1253 | dependencies: 1254 | esrecurse: 4.3.0 1255 | estraverse: 4.3.0 1256 | dev: true 1257 | 1258 | /eslint-scope@7.2.2: 1259 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} 1260 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1261 | dependencies: 1262 | esrecurse: 4.3.0 1263 | estraverse: 5.3.0 1264 | dev: true 1265 | 1266 | /eslint-visitor-keys@3.4.3: 1267 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 1268 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1269 | dev: true 1270 | 1271 | /eslint@8.47.0: 1272 | resolution: {integrity: sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==} 1273 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1274 | hasBin: true 1275 | dependencies: 1276 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) 1277 | '@eslint-community/regexpp': 4.6.2 1278 | '@eslint/eslintrc': 2.1.2 1279 | '@eslint/js': 8.47.0 1280 | '@humanwhocodes/config-array': 0.11.10 1281 | '@humanwhocodes/module-importer': 1.0.1 1282 | '@nodelib/fs.walk': 1.2.8 1283 | ajv: 6.12.6 1284 | chalk: 4.1.2 1285 | cross-spawn: 7.0.3 1286 | debug: 4.3.4 1287 | doctrine: 3.0.0 1288 | escape-string-regexp: 4.0.0 1289 | eslint-scope: 7.2.2 1290 | eslint-visitor-keys: 3.4.3 1291 | espree: 9.6.1 1292 | esquery: 1.5.0 1293 | esutils: 2.0.3 1294 | fast-deep-equal: 3.1.3 1295 | file-entry-cache: 6.0.1 1296 | find-up: 5.0.0 1297 | glob-parent: 6.0.2 1298 | globals: 13.21.0 1299 | graphemer: 1.4.0 1300 | ignore: 5.2.4 1301 | imurmurhash: 0.1.4 1302 | is-glob: 4.0.3 1303 | is-path-inside: 3.0.3 1304 | js-yaml: 4.1.0 1305 | json-stable-stringify-without-jsonify: 1.0.1 1306 | levn: 0.4.1 1307 | lodash.merge: 4.6.2 1308 | minimatch: 3.1.2 1309 | natural-compare: 1.4.0 1310 | optionator: 0.9.3 1311 | strip-ansi: 6.0.1 1312 | text-table: 0.2.0 1313 | transitivePeerDependencies: 1314 | - supports-color 1315 | dev: true 1316 | 1317 | /espree@9.6.1: 1318 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} 1319 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1320 | dependencies: 1321 | acorn: 8.10.0 1322 | acorn-jsx: 5.3.2(acorn@8.10.0) 1323 | eslint-visitor-keys: 3.4.3 1324 | dev: true 1325 | 1326 | /esquery@1.5.0: 1327 | resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} 1328 | engines: {node: '>=0.10'} 1329 | dependencies: 1330 | estraverse: 5.3.0 1331 | dev: true 1332 | 1333 | /esrecurse@4.3.0: 1334 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 1335 | engines: {node: '>=4.0'} 1336 | dependencies: 1337 | estraverse: 5.3.0 1338 | dev: true 1339 | 1340 | /estraverse@4.3.0: 1341 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} 1342 | engines: {node: '>=4.0'} 1343 | dev: true 1344 | 1345 | /estraverse@5.3.0: 1346 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1347 | engines: {node: '>=4.0'} 1348 | dev: true 1349 | 1350 | /esutils@2.0.3: 1351 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1352 | engines: {node: '>=0.10.0'} 1353 | dev: true 1354 | 1355 | /extend-shallow@2.0.1: 1356 | resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} 1357 | engines: {node: '>=0.10.0'} 1358 | dependencies: 1359 | is-extendable: 0.1.1 1360 | dev: true 1361 | 1362 | /extend-shallow@3.0.2: 1363 | resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} 1364 | engines: {node: '>=0.10.0'} 1365 | dependencies: 1366 | assign-symbols: 1.0.0 1367 | is-extendable: 1.0.1 1368 | dev: true 1369 | 1370 | /fast-deep-equal@3.1.3: 1371 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1372 | dev: true 1373 | 1374 | /fast-glob@3.3.1: 1375 | resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} 1376 | engines: {node: '>=8.6.0'} 1377 | dependencies: 1378 | '@nodelib/fs.stat': 2.0.5 1379 | '@nodelib/fs.walk': 1.2.8 1380 | glob-parent: 5.1.2 1381 | merge2: 1.4.1 1382 | micromatch: 4.0.5 1383 | dev: true 1384 | 1385 | /fast-json-stable-stringify@2.1.0: 1386 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1387 | dev: true 1388 | 1389 | /fast-levenshtein@2.0.6: 1390 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1391 | dev: true 1392 | 1393 | /fastq@1.15.0: 1394 | resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} 1395 | dependencies: 1396 | reusify: 1.0.4 1397 | dev: true 1398 | 1399 | /file-entry-cache@6.0.1: 1400 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 1401 | engines: {node: ^10.12.0 || >=12.0.0} 1402 | dependencies: 1403 | flat-cache: 3.0.4 1404 | dev: true 1405 | 1406 | /fill-range@7.0.1: 1407 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1408 | engines: {node: '>=8'} 1409 | dependencies: 1410 | to-regex-range: 5.0.1 1411 | dev: true 1412 | 1413 | /find-up@5.0.0: 1414 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 1415 | engines: {node: '>=10'} 1416 | dependencies: 1417 | locate-path: 6.0.0 1418 | path-exists: 4.0.0 1419 | dev: true 1420 | 1421 | /flat-cache@3.0.4: 1422 | resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} 1423 | engines: {node: ^10.12.0 || >=12.0.0} 1424 | dependencies: 1425 | flatted: 3.2.7 1426 | rimraf: 3.0.2 1427 | dev: true 1428 | 1429 | /flatted@3.2.7: 1430 | resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} 1431 | dev: true 1432 | 1433 | /for-each@0.3.3: 1434 | resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} 1435 | dependencies: 1436 | is-callable: 1.2.7 1437 | dev: true 1438 | 1439 | /for-in@1.0.2: 1440 | resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} 1441 | engines: {node: '>=0.10.0'} 1442 | dev: true 1443 | 1444 | /fragment-cache@0.2.1: 1445 | resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} 1446 | engines: {node: '>=0.10.0'} 1447 | dependencies: 1448 | map-cache: 0.2.2 1449 | dev: true 1450 | 1451 | /fs.realpath@1.0.0: 1452 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 1453 | dev: true 1454 | 1455 | /fsevents@2.3.2: 1456 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 1457 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1458 | os: [darwin] 1459 | requiresBuild: true 1460 | dev: true 1461 | optional: true 1462 | 1463 | /function-bind@1.1.1: 1464 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 1465 | dev: true 1466 | 1467 | /function.prototype.name@1.1.5: 1468 | resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} 1469 | engines: {node: '>= 0.4'} 1470 | dependencies: 1471 | call-bind: 1.0.2 1472 | define-properties: 1.2.0 1473 | es-abstract: 1.22.1 1474 | functions-have-names: 1.2.3 1475 | dev: true 1476 | 1477 | /functions-have-names@1.2.3: 1478 | resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} 1479 | dev: true 1480 | 1481 | /get-intrinsic@1.2.1: 1482 | resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} 1483 | dependencies: 1484 | function-bind: 1.1.1 1485 | has: 1.0.3 1486 | has-proto: 1.0.1 1487 | has-symbols: 1.0.3 1488 | dev: true 1489 | 1490 | /get-symbol-description@1.0.0: 1491 | resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} 1492 | engines: {node: '>= 0.4'} 1493 | dependencies: 1494 | call-bind: 1.0.2 1495 | get-intrinsic: 1.2.1 1496 | dev: true 1497 | 1498 | /get-value@2.0.6: 1499 | resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} 1500 | engines: {node: '>=0.10.0'} 1501 | dev: true 1502 | 1503 | /glob-parent@5.1.2: 1504 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1505 | engines: {node: '>= 6'} 1506 | dependencies: 1507 | is-glob: 4.0.3 1508 | dev: true 1509 | 1510 | /glob-parent@6.0.2: 1511 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1512 | engines: {node: '>=10.13.0'} 1513 | dependencies: 1514 | is-glob: 4.0.3 1515 | dev: true 1516 | 1517 | /glob@7.2.3: 1518 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 1519 | dependencies: 1520 | fs.realpath: 1.0.0 1521 | inflight: 1.0.6 1522 | inherits: 2.0.4 1523 | minimatch: 3.1.2 1524 | once: 1.4.0 1525 | path-is-absolute: 1.0.1 1526 | dev: true 1527 | 1528 | /globals@13.21.0: 1529 | resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==} 1530 | engines: {node: '>=8'} 1531 | dependencies: 1532 | type-fest: 0.20.2 1533 | dev: true 1534 | 1535 | /globalthis@1.0.3: 1536 | resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} 1537 | engines: {node: '>= 0.4'} 1538 | dependencies: 1539 | define-properties: 1.2.0 1540 | dev: true 1541 | 1542 | /globby@11.1.0: 1543 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 1544 | engines: {node: '>=10'} 1545 | dependencies: 1546 | array-union: 2.1.0 1547 | dir-glob: 3.0.1 1548 | fast-glob: 3.3.1 1549 | ignore: 5.2.4 1550 | merge2: 1.4.1 1551 | slash: 3.0.0 1552 | dev: true 1553 | 1554 | /gopd@1.0.1: 1555 | resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} 1556 | dependencies: 1557 | get-intrinsic: 1.2.1 1558 | dev: true 1559 | 1560 | /graphemer@1.4.0: 1561 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 1562 | dev: true 1563 | 1564 | /has-bigints@1.0.2: 1565 | resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} 1566 | dev: true 1567 | 1568 | /has-flag@4.0.0: 1569 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1570 | engines: {node: '>=8'} 1571 | dev: true 1572 | 1573 | /has-property-descriptors@1.0.0: 1574 | resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} 1575 | dependencies: 1576 | get-intrinsic: 1.2.1 1577 | dev: true 1578 | 1579 | /has-proto@1.0.1: 1580 | resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} 1581 | engines: {node: '>= 0.4'} 1582 | dev: true 1583 | 1584 | /has-symbols@1.0.3: 1585 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 1586 | engines: {node: '>= 0.4'} 1587 | dev: true 1588 | 1589 | /has-tostringtag@1.0.0: 1590 | resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} 1591 | engines: {node: '>= 0.4'} 1592 | dependencies: 1593 | has-symbols: 1.0.3 1594 | dev: true 1595 | 1596 | /has-value@0.3.1: 1597 | resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} 1598 | engines: {node: '>=0.10.0'} 1599 | dependencies: 1600 | get-value: 2.0.6 1601 | has-values: 0.1.4 1602 | isobject: 2.1.0 1603 | dev: true 1604 | 1605 | /has-value@1.0.0: 1606 | resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} 1607 | engines: {node: '>=0.10.0'} 1608 | dependencies: 1609 | get-value: 2.0.6 1610 | has-values: 1.0.0 1611 | isobject: 3.0.1 1612 | dev: true 1613 | 1614 | /has-values@0.1.4: 1615 | resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} 1616 | engines: {node: '>=0.10.0'} 1617 | dev: true 1618 | 1619 | /has-values@1.0.0: 1620 | resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} 1621 | engines: {node: '>=0.10.0'} 1622 | dependencies: 1623 | is-number: 3.0.0 1624 | kind-of: 4.0.0 1625 | dev: true 1626 | 1627 | /has@1.0.3: 1628 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 1629 | engines: {node: '>= 0.4.0'} 1630 | dependencies: 1631 | function-bind: 1.1.1 1632 | dev: true 1633 | 1634 | /ignore@5.2.4: 1635 | resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} 1636 | engines: {node: '>= 4'} 1637 | dev: true 1638 | 1639 | /import-fresh@3.3.0: 1640 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 1641 | engines: {node: '>=6'} 1642 | dependencies: 1643 | parent-module: 1.0.1 1644 | resolve-from: 4.0.0 1645 | dev: true 1646 | 1647 | /imurmurhash@0.1.4: 1648 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1649 | engines: {node: '>=0.8.19'} 1650 | dev: true 1651 | 1652 | /inflight@1.0.6: 1653 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1654 | dependencies: 1655 | once: 1.4.0 1656 | wrappy: 1.0.2 1657 | dev: true 1658 | 1659 | /inherits@2.0.4: 1660 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1661 | dev: true 1662 | 1663 | /internal-slot@1.0.5: 1664 | resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} 1665 | engines: {node: '>= 0.4'} 1666 | dependencies: 1667 | get-intrinsic: 1.2.1 1668 | has: 1.0.3 1669 | side-channel: 1.0.4 1670 | dev: true 1671 | 1672 | /is-accessor-descriptor@0.1.6: 1673 | resolution: {integrity: sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==} 1674 | engines: {node: '>=0.10.0'} 1675 | dependencies: 1676 | kind-of: 3.2.2 1677 | dev: true 1678 | 1679 | /is-accessor-descriptor@1.0.0: 1680 | resolution: {integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==} 1681 | engines: {node: '>=0.10.0'} 1682 | dependencies: 1683 | kind-of: 6.0.3 1684 | dev: true 1685 | 1686 | /is-array-buffer@3.0.2: 1687 | resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} 1688 | dependencies: 1689 | call-bind: 1.0.2 1690 | get-intrinsic: 1.2.1 1691 | is-typed-array: 1.1.12 1692 | dev: true 1693 | 1694 | /is-bigint@1.0.4: 1695 | resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} 1696 | dependencies: 1697 | has-bigints: 1.0.2 1698 | dev: true 1699 | 1700 | /is-binary-path@2.1.0: 1701 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 1702 | engines: {node: '>=8'} 1703 | dependencies: 1704 | binary-extensions: 2.2.0 1705 | dev: true 1706 | 1707 | /is-boolean-object@1.1.2: 1708 | resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} 1709 | engines: {node: '>= 0.4'} 1710 | dependencies: 1711 | call-bind: 1.0.2 1712 | has-tostringtag: 1.0.0 1713 | dev: true 1714 | 1715 | /is-buffer@1.1.6: 1716 | resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} 1717 | dev: true 1718 | 1719 | /is-callable@1.2.7: 1720 | resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} 1721 | engines: {node: '>= 0.4'} 1722 | dev: true 1723 | 1724 | /is-core-module@2.13.0: 1725 | resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} 1726 | dependencies: 1727 | has: 1.0.3 1728 | dev: true 1729 | 1730 | /is-data-descriptor@0.1.4: 1731 | resolution: {integrity: sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==} 1732 | engines: {node: '>=0.10.0'} 1733 | dependencies: 1734 | kind-of: 3.2.2 1735 | dev: true 1736 | 1737 | /is-data-descriptor@1.0.0: 1738 | resolution: {integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==} 1739 | engines: {node: '>=0.10.0'} 1740 | dependencies: 1741 | kind-of: 6.0.3 1742 | dev: true 1743 | 1744 | /is-date-object@1.0.5: 1745 | resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} 1746 | engines: {node: '>= 0.4'} 1747 | dependencies: 1748 | has-tostringtag: 1.0.0 1749 | dev: true 1750 | 1751 | /is-descriptor@0.1.6: 1752 | resolution: {integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==} 1753 | engines: {node: '>=0.10.0'} 1754 | dependencies: 1755 | is-accessor-descriptor: 0.1.6 1756 | is-data-descriptor: 0.1.4 1757 | kind-of: 5.1.0 1758 | dev: true 1759 | 1760 | /is-descriptor@1.0.2: 1761 | resolution: {integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==} 1762 | engines: {node: '>=0.10.0'} 1763 | dependencies: 1764 | is-accessor-descriptor: 1.0.0 1765 | is-data-descriptor: 1.0.0 1766 | kind-of: 6.0.3 1767 | dev: true 1768 | 1769 | /is-extendable@0.1.1: 1770 | resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} 1771 | engines: {node: '>=0.10.0'} 1772 | dev: true 1773 | 1774 | /is-extendable@1.0.1: 1775 | resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} 1776 | engines: {node: '>=0.10.0'} 1777 | dependencies: 1778 | is-plain-object: 2.0.4 1779 | dev: true 1780 | 1781 | /is-extglob@2.1.1: 1782 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1783 | engines: {node: '>=0.10.0'} 1784 | dev: true 1785 | 1786 | /is-glob@4.0.3: 1787 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1788 | engines: {node: '>=0.10.0'} 1789 | dependencies: 1790 | is-extglob: 2.1.1 1791 | dev: true 1792 | 1793 | /is-negative-zero@2.0.2: 1794 | resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} 1795 | engines: {node: '>= 0.4'} 1796 | dev: true 1797 | 1798 | /is-number-object@1.0.7: 1799 | resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} 1800 | engines: {node: '>= 0.4'} 1801 | dependencies: 1802 | has-tostringtag: 1.0.0 1803 | dev: true 1804 | 1805 | /is-number@3.0.0: 1806 | resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} 1807 | engines: {node: '>=0.10.0'} 1808 | dependencies: 1809 | kind-of: 3.2.2 1810 | dev: true 1811 | 1812 | /is-number@7.0.0: 1813 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1814 | engines: {node: '>=0.12.0'} 1815 | dev: true 1816 | 1817 | /is-path-inside@3.0.3: 1818 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 1819 | engines: {node: '>=8'} 1820 | dev: true 1821 | 1822 | /is-plain-object@2.0.4: 1823 | resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} 1824 | engines: {node: '>=0.10.0'} 1825 | dependencies: 1826 | isobject: 3.0.1 1827 | dev: true 1828 | 1829 | /is-regex@1.1.4: 1830 | resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} 1831 | engines: {node: '>= 0.4'} 1832 | dependencies: 1833 | call-bind: 1.0.2 1834 | has-tostringtag: 1.0.0 1835 | dev: true 1836 | 1837 | /is-shared-array-buffer@1.0.2: 1838 | resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} 1839 | dependencies: 1840 | call-bind: 1.0.2 1841 | dev: true 1842 | 1843 | /is-string@1.0.7: 1844 | resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} 1845 | engines: {node: '>= 0.4'} 1846 | dependencies: 1847 | has-tostringtag: 1.0.0 1848 | dev: true 1849 | 1850 | /is-symbol@1.0.4: 1851 | resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} 1852 | engines: {node: '>= 0.4'} 1853 | dependencies: 1854 | has-symbols: 1.0.3 1855 | dev: true 1856 | 1857 | /is-typed-array@1.1.12: 1858 | resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} 1859 | engines: {node: '>= 0.4'} 1860 | dependencies: 1861 | which-typed-array: 1.1.11 1862 | dev: true 1863 | 1864 | /is-weakref@1.0.2: 1865 | resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} 1866 | dependencies: 1867 | call-bind: 1.0.2 1868 | dev: true 1869 | 1870 | /is-windows@1.0.2: 1871 | resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} 1872 | engines: {node: '>=0.10.0'} 1873 | dev: true 1874 | 1875 | /isarray@1.0.0: 1876 | resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} 1877 | dev: true 1878 | 1879 | /isarray@2.0.5: 1880 | resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} 1881 | dev: true 1882 | 1883 | /isexe@2.0.0: 1884 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1885 | dev: true 1886 | 1887 | /isobject@2.1.0: 1888 | resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} 1889 | engines: {node: '>=0.10.0'} 1890 | dependencies: 1891 | isarray: 1.0.0 1892 | dev: true 1893 | 1894 | /isobject@3.0.1: 1895 | resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} 1896 | engines: {node: '>=0.10.0'} 1897 | dev: true 1898 | 1899 | /js-tokens@4.0.0: 1900 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1901 | dev: true 1902 | 1903 | /js-yaml@4.1.0: 1904 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1905 | hasBin: true 1906 | dependencies: 1907 | argparse: 2.0.1 1908 | dev: true 1909 | 1910 | /json-schema-traverse@0.4.1: 1911 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1912 | dev: true 1913 | 1914 | /json-stable-stringify-without-jsonify@1.0.1: 1915 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1916 | dev: true 1917 | 1918 | /json5@1.0.2: 1919 | resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} 1920 | hasBin: true 1921 | dependencies: 1922 | minimist: 1.2.8 1923 | dev: true 1924 | 1925 | /jsx-ast-utils@3.3.5: 1926 | resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} 1927 | engines: {node: '>=4.0'} 1928 | dependencies: 1929 | array-includes: 3.1.6 1930 | array.prototype.flat: 1.3.1 1931 | object.assign: 4.1.4 1932 | object.values: 1.1.6 1933 | dev: true 1934 | 1935 | /kind-of@3.2.2: 1936 | resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} 1937 | engines: {node: '>=0.10.0'} 1938 | dependencies: 1939 | is-buffer: 1.1.6 1940 | dev: true 1941 | 1942 | /kind-of@4.0.0: 1943 | resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} 1944 | engines: {node: '>=0.10.0'} 1945 | dependencies: 1946 | is-buffer: 1.1.6 1947 | dev: true 1948 | 1949 | /kind-of@5.1.0: 1950 | resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} 1951 | engines: {node: '>=0.10.0'} 1952 | dev: true 1953 | 1954 | /kind-of@6.0.3: 1955 | resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} 1956 | engines: {node: '>=0.10.0'} 1957 | dev: true 1958 | 1959 | /levn@0.4.1: 1960 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1961 | engines: {node: '>= 0.8.0'} 1962 | dependencies: 1963 | prelude-ls: 1.2.1 1964 | type-check: 0.4.0 1965 | dev: true 1966 | 1967 | /locate-path@6.0.0: 1968 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1969 | engines: {node: '>=10'} 1970 | dependencies: 1971 | p-locate: 5.0.0 1972 | dev: true 1973 | 1974 | /lodash.merge@4.6.2: 1975 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1976 | dev: true 1977 | 1978 | /loose-envify@1.4.0: 1979 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 1980 | hasBin: true 1981 | dependencies: 1982 | js-tokens: 4.0.0 1983 | dev: true 1984 | 1985 | /lru-cache@6.0.0: 1986 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 1987 | engines: {node: '>=10'} 1988 | dependencies: 1989 | yallist: 4.0.0 1990 | dev: true 1991 | 1992 | /map-cache@0.2.2: 1993 | resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} 1994 | engines: {node: '>=0.10.0'} 1995 | dev: true 1996 | 1997 | /map-visit@1.0.0: 1998 | resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} 1999 | engines: {node: '>=0.10.0'} 2000 | dependencies: 2001 | object-visit: 1.0.1 2002 | dev: true 2003 | 2004 | /merge2@1.4.1: 2005 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 2006 | engines: {node: '>= 8'} 2007 | dev: true 2008 | 2009 | /micromatch@4.0.5: 2010 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 2011 | engines: {node: '>=8.6'} 2012 | dependencies: 2013 | braces: 3.0.2 2014 | picomatch: 2.3.1 2015 | dev: true 2016 | 2017 | /minimatch@3.1.2: 2018 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 2019 | dependencies: 2020 | brace-expansion: 1.1.11 2021 | dev: true 2022 | 2023 | /minimist@1.2.8: 2024 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 2025 | dev: true 2026 | 2027 | /mixin-deep@1.3.2: 2028 | resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} 2029 | engines: {node: '>=0.10.0'} 2030 | dependencies: 2031 | for-in: 1.0.2 2032 | is-extendable: 1.0.1 2033 | dev: true 2034 | 2035 | /ms@2.0.0: 2036 | resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} 2037 | dev: true 2038 | 2039 | /ms@2.1.2: 2040 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 2041 | dev: true 2042 | 2043 | /ms@2.1.3: 2044 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 2045 | dev: true 2046 | 2047 | /mylas@2.1.13: 2048 | resolution: {integrity: sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg==} 2049 | engines: {node: '>=12.0.0'} 2050 | dev: true 2051 | 2052 | /nanomatch@1.2.13: 2053 | resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} 2054 | engines: {node: '>=0.10.0'} 2055 | dependencies: 2056 | arr-diff: 4.0.0 2057 | array-unique: 0.3.2 2058 | define-property: 2.0.2 2059 | extend-shallow: 3.0.2 2060 | fragment-cache: 0.2.1 2061 | is-windows: 1.0.2 2062 | kind-of: 6.0.3 2063 | object.pick: 1.3.0 2064 | regex-not: 1.0.2 2065 | snapdragon: 0.8.2 2066 | to-regex: 3.0.2 2067 | transitivePeerDependencies: 2068 | - supports-color 2069 | dev: true 2070 | 2071 | /natural-compare-lite@1.4.0: 2072 | resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} 2073 | dev: true 2074 | 2075 | /natural-compare@1.4.0: 2076 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 2077 | dev: true 2078 | 2079 | /normalize-path@3.0.0: 2080 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 2081 | engines: {node: '>=0.10.0'} 2082 | dev: true 2083 | 2084 | /object-assign@4.1.1: 2085 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 2086 | engines: {node: '>=0.10.0'} 2087 | dev: true 2088 | 2089 | /object-copy@0.1.0: 2090 | resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} 2091 | engines: {node: '>=0.10.0'} 2092 | dependencies: 2093 | copy-descriptor: 0.1.1 2094 | define-property: 0.2.5 2095 | kind-of: 3.2.2 2096 | dev: true 2097 | 2098 | /object-inspect@1.12.3: 2099 | resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} 2100 | dev: true 2101 | 2102 | /object-keys@1.1.1: 2103 | resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 2104 | engines: {node: '>= 0.4'} 2105 | dev: true 2106 | 2107 | /object-visit@1.0.1: 2108 | resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} 2109 | engines: {node: '>=0.10.0'} 2110 | dependencies: 2111 | isobject: 3.0.1 2112 | dev: true 2113 | 2114 | /object.assign@4.1.4: 2115 | resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} 2116 | engines: {node: '>= 0.4'} 2117 | dependencies: 2118 | call-bind: 1.0.2 2119 | define-properties: 1.2.0 2120 | has-symbols: 1.0.3 2121 | object-keys: 1.1.1 2122 | dev: true 2123 | 2124 | /object.entries@1.1.6: 2125 | resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==} 2126 | engines: {node: '>= 0.4'} 2127 | dependencies: 2128 | call-bind: 1.0.2 2129 | define-properties: 1.2.0 2130 | es-abstract: 1.22.1 2131 | dev: true 2132 | 2133 | /object.fromentries@2.0.6: 2134 | resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} 2135 | engines: {node: '>= 0.4'} 2136 | dependencies: 2137 | call-bind: 1.0.2 2138 | define-properties: 1.2.0 2139 | es-abstract: 1.22.1 2140 | dev: true 2141 | 2142 | /object.groupby@1.0.0: 2143 | resolution: {integrity: sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==} 2144 | dependencies: 2145 | call-bind: 1.0.2 2146 | define-properties: 1.2.0 2147 | es-abstract: 1.22.1 2148 | get-intrinsic: 1.2.1 2149 | dev: true 2150 | 2151 | /object.hasown@1.1.2: 2152 | resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} 2153 | dependencies: 2154 | define-properties: 1.2.0 2155 | es-abstract: 1.22.1 2156 | dev: true 2157 | 2158 | /object.pick@1.3.0: 2159 | resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} 2160 | engines: {node: '>=0.10.0'} 2161 | dependencies: 2162 | isobject: 3.0.1 2163 | dev: true 2164 | 2165 | /object.values@1.1.6: 2166 | resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} 2167 | engines: {node: '>= 0.4'} 2168 | dependencies: 2169 | call-bind: 1.0.2 2170 | define-properties: 1.2.0 2171 | es-abstract: 1.22.1 2172 | dev: true 2173 | 2174 | /once@1.4.0: 2175 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 2176 | dependencies: 2177 | wrappy: 1.0.2 2178 | dev: true 2179 | 2180 | /optionator@0.9.3: 2181 | resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} 2182 | engines: {node: '>= 0.8.0'} 2183 | dependencies: 2184 | '@aashutoshrathi/word-wrap': 1.2.6 2185 | deep-is: 0.1.4 2186 | fast-levenshtein: 2.0.6 2187 | levn: 0.4.1 2188 | prelude-ls: 1.2.1 2189 | type-check: 0.4.0 2190 | dev: true 2191 | 2192 | /p-limit@3.1.0: 2193 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 2194 | engines: {node: '>=10'} 2195 | dependencies: 2196 | yocto-queue: 0.1.0 2197 | dev: true 2198 | 2199 | /p-locate@5.0.0: 2200 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 2201 | engines: {node: '>=10'} 2202 | dependencies: 2203 | p-limit: 3.1.0 2204 | dev: true 2205 | 2206 | /parent-module@1.0.1: 2207 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 2208 | engines: {node: '>=6'} 2209 | dependencies: 2210 | callsites: 3.1.0 2211 | dev: true 2212 | 2213 | /pascalcase@0.1.1: 2214 | resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} 2215 | engines: {node: '>=0.10.0'} 2216 | dev: true 2217 | 2218 | /path-exists@4.0.0: 2219 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 2220 | engines: {node: '>=8'} 2221 | dev: true 2222 | 2223 | /path-is-absolute@1.0.1: 2224 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 2225 | engines: {node: '>=0.10.0'} 2226 | dev: true 2227 | 2228 | /path-key@3.1.1: 2229 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 2230 | engines: {node: '>=8'} 2231 | dev: true 2232 | 2233 | /path-parse@1.0.7: 2234 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 2235 | dev: true 2236 | 2237 | /path-type@4.0.0: 2238 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 2239 | engines: {node: '>=8'} 2240 | dev: true 2241 | 2242 | /picomatch@2.3.1: 2243 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 2244 | engines: {node: '>=8.6'} 2245 | dev: true 2246 | 2247 | /plimit-lit@1.5.0: 2248 | resolution: {integrity: sha512-Eb/MqCb1Iv/ok4m1FqIXqvUKPISufcjZ605hl3KM/n8GaX8zfhtgdLwZU3vKjuHGh2O9Rjog/bHTq8ofIShdng==} 2249 | dependencies: 2250 | queue-lit: 1.5.0 2251 | dev: true 2252 | 2253 | /prelude-ls@1.2.1: 2254 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 2255 | engines: {node: '>= 0.8.0'} 2256 | dev: true 2257 | 2258 | /prop-types@15.8.1: 2259 | resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} 2260 | dependencies: 2261 | loose-envify: 1.4.0 2262 | object-assign: 4.1.1 2263 | react-is: 16.13.1 2264 | dev: true 2265 | 2266 | /punycode@2.3.0: 2267 | resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} 2268 | engines: {node: '>=6'} 2269 | dev: true 2270 | 2271 | /queue-lit@1.5.0: 2272 | resolution: {integrity: sha512-IslToJ4eiCEE9xwMzq3viOO5nH8sUWUCwoElrhNMozzr9IIt2qqvB4I+uHu/zJTQVqc9R5DFwok4ijNK1pU3fA==} 2273 | dev: true 2274 | 2275 | /queue-microtask@1.2.3: 2276 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 2277 | dev: true 2278 | 2279 | /react-is@16.13.1: 2280 | resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} 2281 | dev: true 2282 | 2283 | /readdirp@3.6.0: 2284 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 2285 | engines: {node: '>=8.10.0'} 2286 | dependencies: 2287 | picomatch: 2.3.1 2288 | dev: true 2289 | 2290 | /regex-not@1.0.2: 2291 | resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} 2292 | engines: {node: '>=0.10.0'} 2293 | dependencies: 2294 | extend-shallow: 3.0.2 2295 | safe-regex: 1.1.0 2296 | dev: true 2297 | 2298 | /regexp.prototype.flags@1.5.0: 2299 | resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} 2300 | engines: {node: '>= 0.4'} 2301 | dependencies: 2302 | call-bind: 1.0.2 2303 | define-properties: 1.2.0 2304 | functions-have-names: 1.2.3 2305 | dev: true 2306 | 2307 | /resolve-from@4.0.0: 2308 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 2309 | engines: {node: '>=4'} 2310 | dev: true 2311 | 2312 | /resolve-url@0.2.1: 2313 | resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} 2314 | deprecated: https://github.com/lydell/resolve-url#deprecated 2315 | dev: true 2316 | 2317 | /resolve@1.22.4: 2318 | resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} 2319 | hasBin: true 2320 | dependencies: 2321 | is-core-module: 2.13.0 2322 | path-parse: 1.0.7 2323 | supports-preserve-symlinks-flag: 1.0.0 2324 | dev: true 2325 | 2326 | /resolve@2.0.0-next.4: 2327 | resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} 2328 | hasBin: true 2329 | dependencies: 2330 | is-core-module: 2.13.0 2331 | path-parse: 1.0.7 2332 | supports-preserve-symlinks-flag: 1.0.0 2333 | dev: true 2334 | 2335 | /ret@0.1.15: 2336 | resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} 2337 | engines: {node: '>=0.12'} 2338 | dev: true 2339 | 2340 | /reusify@1.0.4: 2341 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 2342 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 2343 | dev: true 2344 | 2345 | /rimraf@3.0.2: 2346 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 2347 | hasBin: true 2348 | dependencies: 2349 | glob: 7.2.3 2350 | dev: true 2351 | 2352 | /run-parallel@1.2.0: 2353 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 2354 | dependencies: 2355 | queue-microtask: 1.2.3 2356 | dev: true 2357 | 2358 | /safe-array-concat@1.0.0: 2359 | resolution: {integrity: sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==} 2360 | engines: {node: '>=0.4'} 2361 | dependencies: 2362 | call-bind: 1.0.2 2363 | get-intrinsic: 1.2.1 2364 | has-symbols: 1.0.3 2365 | isarray: 2.0.5 2366 | dev: true 2367 | 2368 | /safe-regex-test@1.0.0: 2369 | resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} 2370 | dependencies: 2371 | call-bind: 1.0.2 2372 | get-intrinsic: 1.2.1 2373 | is-regex: 1.1.4 2374 | dev: true 2375 | 2376 | /safe-regex@1.1.0: 2377 | resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} 2378 | dependencies: 2379 | ret: 0.1.15 2380 | dev: true 2381 | 2382 | /semver@6.3.1: 2383 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 2384 | hasBin: true 2385 | dev: true 2386 | 2387 | /semver@7.5.4: 2388 | resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} 2389 | engines: {node: '>=10'} 2390 | hasBin: true 2391 | dependencies: 2392 | lru-cache: 6.0.0 2393 | dev: true 2394 | 2395 | /set-value@2.0.1: 2396 | resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} 2397 | engines: {node: '>=0.10.0'} 2398 | dependencies: 2399 | extend-shallow: 2.0.1 2400 | is-extendable: 0.1.1 2401 | is-plain-object: 2.0.4 2402 | split-string: 3.1.0 2403 | dev: true 2404 | 2405 | /shebang-command@2.0.0: 2406 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 2407 | engines: {node: '>=8'} 2408 | dependencies: 2409 | shebang-regex: 3.0.0 2410 | dev: true 2411 | 2412 | /shebang-regex@3.0.0: 2413 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 2414 | engines: {node: '>=8'} 2415 | dev: true 2416 | 2417 | /side-channel@1.0.4: 2418 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} 2419 | dependencies: 2420 | call-bind: 1.0.2 2421 | get-intrinsic: 1.2.1 2422 | object-inspect: 1.12.3 2423 | dev: true 2424 | 2425 | /slash@3.0.0: 2426 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 2427 | engines: {node: '>=8'} 2428 | dev: true 2429 | 2430 | /snapdragon@0.8.2: 2431 | resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} 2432 | engines: {node: '>=0.10.0'} 2433 | dependencies: 2434 | base: 0.11.2 2435 | debug: 2.6.9 2436 | define-property: 0.2.5 2437 | extend-shallow: 2.0.1 2438 | map-cache: 0.2.2 2439 | source-map: 0.5.7 2440 | source-map-resolve: 0.5.3 2441 | use: 3.1.1 2442 | transitivePeerDependencies: 2443 | - supports-color 2444 | dev: true 2445 | 2446 | /source-map-resolve@0.5.3: 2447 | resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} 2448 | deprecated: See https://github.com/lydell/source-map-resolve#deprecated 2449 | dependencies: 2450 | atob: 2.1.2 2451 | decode-uri-component: 0.2.2 2452 | resolve-url: 0.2.1 2453 | source-map-url: 0.4.1 2454 | urix: 0.1.0 2455 | dev: true 2456 | 2457 | /source-map-url@0.4.1: 2458 | resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} 2459 | deprecated: See https://github.com/lydell/source-map-url#deprecated 2460 | dev: true 2461 | 2462 | /source-map@0.5.7: 2463 | resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} 2464 | engines: {node: '>=0.10.0'} 2465 | dev: true 2466 | 2467 | /spitroast@1.4.3: 2468 | resolution: {integrity: sha512-JdkzAy2tT82ahx+eEtM5ohBeHICqFln/Yzo+vPGnE5sX1LYgPHCU2qcaSIJfR/xNrhI0q+ftwFz0H2aJysv3EA==} 2469 | dev: false 2470 | 2471 | /split-string@3.1.0: 2472 | resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} 2473 | engines: {node: '>=0.10.0'} 2474 | dependencies: 2475 | extend-shallow: 3.0.2 2476 | dev: true 2477 | 2478 | /static-extend@0.1.2: 2479 | resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} 2480 | engines: {node: '>=0.10.0'} 2481 | dependencies: 2482 | define-property: 0.2.5 2483 | object-copy: 0.1.0 2484 | dev: true 2485 | 2486 | /string.prototype.matchall@4.0.8: 2487 | resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} 2488 | dependencies: 2489 | call-bind: 1.0.2 2490 | define-properties: 1.2.0 2491 | es-abstract: 1.22.1 2492 | get-intrinsic: 1.2.1 2493 | has-symbols: 1.0.3 2494 | internal-slot: 1.0.5 2495 | regexp.prototype.flags: 1.5.0 2496 | side-channel: 1.0.4 2497 | dev: true 2498 | 2499 | /string.prototype.trim@1.2.7: 2500 | resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} 2501 | engines: {node: '>= 0.4'} 2502 | dependencies: 2503 | call-bind: 1.0.2 2504 | define-properties: 1.2.0 2505 | es-abstract: 1.22.1 2506 | dev: true 2507 | 2508 | /string.prototype.trimend@1.0.6: 2509 | resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} 2510 | dependencies: 2511 | call-bind: 1.0.2 2512 | define-properties: 1.2.0 2513 | es-abstract: 1.22.1 2514 | dev: true 2515 | 2516 | /string.prototype.trimstart@1.0.6: 2517 | resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} 2518 | dependencies: 2519 | call-bind: 1.0.2 2520 | define-properties: 1.2.0 2521 | es-abstract: 1.22.1 2522 | dev: true 2523 | 2524 | /strip-ansi@6.0.1: 2525 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 2526 | engines: {node: '>=8'} 2527 | dependencies: 2528 | ansi-regex: 5.0.1 2529 | dev: true 2530 | 2531 | /strip-bom@3.0.0: 2532 | resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 2533 | engines: {node: '>=4'} 2534 | dev: true 2535 | 2536 | /strip-json-comments@3.1.1: 2537 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 2538 | engines: {node: '>=8'} 2539 | dev: true 2540 | 2541 | /supports-color@7.2.0: 2542 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 2543 | engines: {node: '>=8'} 2544 | dependencies: 2545 | has-flag: 4.0.0 2546 | dev: true 2547 | 2548 | /supports-preserve-symlinks-flag@1.0.0: 2549 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 2550 | engines: {node: '>= 0.4'} 2551 | dev: true 2552 | 2553 | /text-table@0.2.0: 2554 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 2555 | dev: true 2556 | 2557 | /to-object-path@0.3.0: 2558 | resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} 2559 | engines: {node: '>=0.10.0'} 2560 | dependencies: 2561 | kind-of: 3.2.2 2562 | dev: true 2563 | 2564 | /to-regex-range@5.0.1: 2565 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 2566 | engines: {node: '>=8.0'} 2567 | dependencies: 2568 | is-number: 7.0.0 2569 | dev: true 2570 | 2571 | /to-regex@3.0.2: 2572 | resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} 2573 | engines: {node: '>=0.10.0'} 2574 | dependencies: 2575 | define-property: 2.0.2 2576 | extend-shallow: 3.0.2 2577 | regex-not: 1.0.2 2578 | safe-regex: 1.1.0 2579 | dev: true 2580 | 2581 | /tsc-alias@1.8.7: 2582 | resolution: {integrity: sha512-59Q/zUQa3miTf99mLbSqaW0hi1jt4WoG8Uhe5hSZJHQpSoFW9eEwvW7jlKMHXWvT+zrzy3SN9PE/YBhQ+WVydA==} 2583 | hasBin: true 2584 | dependencies: 2585 | chokidar: 3.5.3 2586 | commander: 9.5.0 2587 | globby: 11.1.0 2588 | mylas: 2.1.13 2589 | normalize-path: 3.0.0 2590 | plimit-lit: 1.5.0 2591 | dev: true 2592 | 2593 | /tsconfig-paths@3.14.2: 2594 | resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} 2595 | dependencies: 2596 | '@types/json5': 0.0.29 2597 | json5: 1.0.2 2598 | minimist: 1.2.8 2599 | strip-bom: 3.0.0 2600 | dev: true 2601 | 2602 | /tslib@1.14.1: 2603 | resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} 2604 | dev: true 2605 | 2606 | /tslib@2.6.1: 2607 | resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} 2608 | 2609 | /tsutils@3.21.0(typescript@5.1.6): 2610 | resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} 2611 | engines: {node: '>= 6'} 2612 | peerDependencies: 2613 | 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' 2614 | dependencies: 2615 | tslib: 1.14.1 2616 | typescript: 5.1.6 2617 | dev: true 2618 | 2619 | /type-check@0.4.0: 2620 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 2621 | engines: {node: '>= 0.8.0'} 2622 | dependencies: 2623 | prelude-ls: 1.2.1 2624 | dev: true 2625 | 2626 | /type-fest@0.20.2: 2627 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 2628 | engines: {node: '>=10'} 2629 | dev: true 2630 | 2631 | /typed-array-buffer@1.0.0: 2632 | resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} 2633 | engines: {node: '>= 0.4'} 2634 | dependencies: 2635 | call-bind: 1.0.2 2636 | get-intrinsic: 1.2.1 2637 | is-typed-array: 1.1.12 2638 | dev: true 2639 | 2640 | /typed-array-byte-length@1.0.0: 2641 | resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} 2642 | engines: {node: '>= 0.4'} 2643 | dependencies: 2644 | call-bind: 1.0.2 2645 | for-each: 0.3.3 2646 | has-proto: 1.0.1 2647 | is-typed-array: 1.1.12 2648 | dev: true 2649 | 2650 | /typed-array-byte-offset@1.0.0: 2651 | resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} 2652 | engines: {node: '>= 0.4'} 2653 | dependencies: 2654 | available-typed-arrays: 1.0.5 2655 | call-bind: 1.0.2 2656 | for-each: 0.3.3 2657 | has-proto: 1.0.1 2658 | is-typed-array: 1.1.12 2659 | dev: true 2660 | 2661 | /typed-array-length@1.0.4: 2662 | resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} 2663 | dependencies: 2664 | call-bind: 1.0.2 2665 | for-each: 0.3.3 2666 | is-typed-array: 1.1.12 2667 | dev: true 2668 | 2669 | /typescript@5.1.6: 2670 | resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} 2671 | engines: {node: '>=14.17'} 2672 | hasBin: true 2673 | dev: true 2674 | 2675 | /unbox-primitive@1.0.2: 2676 | resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} 2677 | dependencies: 2678 | call-bind: 1.0.2 2679 | has-bigints: 1.0.2 2680 | has-symbols: 1.0.3 2681 | which-boxed-primitive: 1.0.2 2682 | dev: true 2683 | 2684 | /union-value@1.0.1: 2685 | resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} 2686 | engines: {node: '>=0.10.0'} 2687 | dependencies: 2688 | arr-union: 3.1.0 2689 | get-value: 2.0.6 2690 | is-extendable: 0.1.1 2691 | set-value: 2.0.1 2692 | dev: true 2693 | 2694 | /unset-value@1.0.0: 2695 | resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} 2696 | engines: {node: '>=0.10.0'} 2697 | dependencies: 2698 | has-value: 0.3.1 2699 | isobject: 3.0.1 2700 | dev: true 2701 | 2702 | /uri-js@4.4.1: 2703 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 2704 | dependencies: 2705 | punycode: 2.3.0 2706 | dev: true 2707 | 2708 | /urix@0.1.0: 2709 | resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} 2710 | deprecated: Please see https://github.com/lydell/urix#deprecated 2711 | dev: true 2712 | 2713 | /use@3.1.1: 2714 | resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} 2715 | engines: {node: '>=0.10.0'} 2716 | dev: true 2717 | 2718 | /which-boxed-primitive@1.0.2: 2719 | resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} 2720 | dependencies: 2721 | is-bigint: 1.0.4 2722 | is-boolean-object: 1.1.2 2723 | is-number-object: 1.0.7 2724 | is-string: 1.0.7 2725 | is-symbol: 1.0.4 2726 | dev: true 2727 | 2728 | /which-typed-array@1.1.11: 2729 | resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} 2730 | engines: {node: '>= 0.4'} 2731 | dependencies: 2732 | available-typed-arrays: 1.0.5 2733 | call-bind: 1.0.2 2734 | for-each: 0.3.3 2735 | gopd: 1.0.1 2736 | has-tostringtag: 1.0.0 2737 | dev: true 2738 | 2739 | /which@2.0.2: 2740 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 2741 | engines: {node: '>= 8'} 2742 | hasBin: true 2743 | dependencies: 2744 | isexe: 2.0.0 2745 | dev: true 2746 | 2747 | /wrappy@1.0.2: 2748 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 2749 | dev: true 2750 | 2751 | /yallist@4.0.0: 2752 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 2753 | dev: true 2754 | 2755 | /yocto-queue@0.1.0: 2756 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 2757 | engines: {node: '>=10'} 2758 | dev: true 2759 | 2760 | publishDirectory: lib 2761 | -------------------------------------------------------------------------------- /src/api/Patcher.ts: -------------------------------------------------------------------------------- 1 | import { FilterFn, filters, waitForModule } from "@metro"; 2 | import { after, before, instead } from "spitroast"; 3 | 4 | type Unpatcher = () => (void | boolean); 5 | type NonPrimitive = Exclude; 6 | 7 | type BeforeCallback = Parameters[2]; 8 | type AfterCallback = Parameters[2]; 9 | type InsteadCallback = Parameters[2]; 10 | 11 | export const patchesInstances = new Map(); 12 | 13 | export default class Patcher { 14 | identifier: string; 15 | patches: Unpatcher[] = []; 16 | stopped = false; 17 | 18 | constructor(identifier: string) { 19 | if (!identifier || typeof identifier !== "string") { 20 | throw new Error("Patcher identifier must be a non-empty string"); 21 | } 22 | 23 | if (patchesInstances.has(identifier)) { 24 | throw new Error(`Patcher with identifier "${identifier}" already exists`); 25 | } 26 | 27 | this.identifier = identifier; 28 | patchesInstances.set(identifier, this); 29 | } 30 | 31 | before = (parent: NonPrimitive, method: string, patch: BeforeCallback) => this.addUnpatcher(before(method, parent, patch)); 32 | after = (parent: NonPrimitive, method: string, patch: AfterCallback) => this.addUnpatcher(after(method, parent, patch)); 33 | instead = (parent: NonPrimitive, method: string, patch: InsteadCallback) => this.addUnpatcher(instead(method, parent, patch)); 34 | 35 | private waitAndPatch

( 36 | patchType: P, 37 | filter: FilterFn, 38 | method: string, 39 | patch: Parameters[2], 40 | ) { 41 | let unpatch: Unpatcher; 42 | const unwaiter = waitForModule(filter, module => { 43 | if (this.stopped) return false; 44 | unpatch = this[patchType](module, method, patch); 45 | }); 46 | 47 | return () => (this.addUnpatcher(unwaiter), unpatch()); 48 | } 49 | 50 | patch = (filter: FilterFn) => ({ 51 | before: (method: string, patch: BeforeCallback) => this.waitAndPatch("before", filter, method, patch), 52 | after: (method: string, patch: AfterCallback) => this.waitAndPatch("after", filter, method, patch), 53 | instead: (method: string, patch: InsteadCallback) => this.waitAndPatch("instead", filter, method, patch), 54 | }); 55 | 56 | addUnpatcher = (callback: Unpatcher) => { 57 | if (this.stopped) return () => false; 58 | if (typeof callback !== "function") { 59 | throw new Error("Unpatcher must be a function"); 60 | } 61 | 62 | this.patches.push(callback); 63 | return callback; 64 | }; 65 | 66 | unpatchAllAndStop() { 67 | let success = true; 68 | this.stopped = true; 69 | 70 | for (const unpatch of this.patches) { 71 | try { 72 | if (unpatch?.() === false) throw void 0; 73 | } catch { 74 | success = false; 75 | } 76 | } 77 | 78 | patchesInstances.delete(this.identifier); 79 | return success; 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /src/api/SettingsAPI.ts: -------------------------------------------------------------------------------- 1 | import { readFile, writeFile } from "@native"; 2 | import { observeObject } from "@utils"; 3 | 4 | type JSONSerializable = number | string | boolean | object | JSONSerializable[]; 5 | 6 | type CastDown = 7 | T extends number ? number : 8 | T extends string ? string : 9 | T extends boolean ? boolean : 10 | T extends object ? CastDownObject : 11 | T; 12 | 13 | type CastDownObject = { 14 | [K in keyof T]?: T[K] extends object ? CastDownObject : CastDown; 15 | }; 16 | 17 | /** 18 | * Awaits all current tasks 19 | */ 20 | export let _globalAwaiter = Promise.resolve(); 21 | 22 | // TODO: Make faster 23 | export default class SettingsAPI { 24 | private _cachedProxy: T | null = null; 25 | private readonly _readAwaiter; 26 | private readonly callbacks = new Set<(snapshot: T) => void>(); 27 | private snapshot!: T; 28 | 29 | constructor( 30 | public readonly path: string, 31 | public readonly defaultData: CastDownObject = {} 32 | ) { 33 | this._readAwaiter = this.init(); 34 | } 35 | 36 | init = async (): Promise => { 37 | if (this._readAwaiter) return this._readAwaiter; 38 | 39 | this.snapshot = JSON.parse(await readFile(this.path, JSON.stringify(this.defaultData))); 40 | return this; 41 | }; 42 | 43 | subscribe = (callback: (snapshot: T) => void) => { 44 | this.callbacks.add(callback); 45 | return () => this.callbacks.delete(callback); 46 | }; 47 | 48 | useStorage = () => { 49 | const forceUpdate = React.useReducer(n => ~n, 0)[1]; 50 | 51 | React.useEffect(() => { 52 | const unsub = this.subscribe(forceUpdate); 53 | return () => void unsub(); 54 | }, []); 55 | 56 | return this.proxy; 57 | }; 58 | 59 | get proxy() { 60 | if (!this.snapshot) throw new Error("StorageWrapper not initialized"); 61 | 62 | return this._cachedProxy ??= observeObject(this.snapshot, async obj => { 63 | this.callbacks.forEach(cb => cb(this.snapshot)); 64 | 65 | const writeTask = writeFile(this.path, JSON.stringify(obj)); 66 | _globalAwaiter = _globalAwaiter.then(() => writeTask); 67 | }); 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /src/api/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Patcher } from "./Patcher"; 2 | export { default as SettingsAPI } from "./SettingsAPI"; 3 | -------------------------------------------------------------------------------- /src/debug/index.ts: -------------------------------------------------------------------------------- 1 | import Patcher from "@api/Patcher"; 2 | 3 | const { before } = new Patcher("debug-ws-patcher"); 4 | const patcher = new Patcher("ws-patcher"); 5 | 6 | let websocket: WebSocket | null = null; 7 | 8 | const AsyncFunction = Object.getPrototypeOf(async function () { }).constructor; 9 | 10 | /** 11 | * Connects to the debugger. 12 | */ 13 | export function connectToDebugger() { 14 | if (websocket) return; 15 | 16 | websocket = new WebSocket("ws://localhost:9090/"); 17 | 18 | const toExpose = { 19 | ...pyoncord.metro, 20 | ...pyoncord.utils, 21 | patcher 22 | }; 23 | 24 | const [exposeKeys, exposeValues] = [Object.keys(toExpose), Object.values(toExpose)]; 25 | 26 | websocket.addEventListener("open", () => console.log("Connected to debug websocket")); 27 | websocket.addEventListener("error", (e: any) => console.error(e.message)); 28 | websocket.addEventListener("message", message => { 29 | try { 30 | const toEval = new AsyncFunction(...exposeKeys, `return (${message.data as string})`); 31 | toEval(...exposeValues).then(console.log).catch(console.error); 32 | } catch (e) { 33 | console.error(e); 34 | } 35 | }); 36 | 37 | const unpatch = before(globalThis, "nativeLoggingHook", ([message, level]) => { 38 | if (websocket?.readyState === WebSocket.OPEN) { 39 | websocket.send(JSON.stringify({ level, message })); 40 | } 41 | }); 42 | 43 | websocket.addEventListener("close", () => { 44 | unpatch(); 45 | websocket = null; 46 | // Always attempt to reconnect every 3 seconds 47 | setTimeout(connectToDebugger, 3000); 48 | }); 49 | } 50 | -------------------------------------------------------------------------------- /src/global.d.ts: -------------------------------------------------------------------------------- 1 | type PyoncordObject = Omit & { 2 | unload: () => void; 3 | }; 4 | 5 | declare global { 6 | const __PYONCORD_COMMIT_HASH__: string; 7 | const __PYONCORD_DEV__: boolean; 8 | 9 | const nativeModuleProxy: any; 10 | 11 | // These are set by the mod 12 | const React: typeof import("react"); 13 | const ReactNative: typeof import("react-native"); 14 | 15 | const pyoncord: PyoncordObject; 16 | } 17 | 18 | export { }; 19 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { SettingsAPI } from "@api"; 2 | import { connectToDebugger } from "@debug"; 3 | import { loadPlugins } from "@managers/plugins"; 4 | import { initMetro } from "@metro"; 5 | import { patchChatInput, patchExperiments, patchIdle, patchSettings } from "@patches"; 6 | import { patchAssets } from "@utils/assets"; 7 | 8 | export * as api from "@api"; 9 | export * as debug from "@debug"; 10 | export * as metro from "@metro"; 11 | export * as native from "@native"; 12 | export * as patches from "@patches"; 13 | export * as themes from "@themes"; 14 | export * as utils from "@utils"; 15 | 16 | export const settings = new SettingsAPI("settings.json", { 17 | experiments: true, 18 | hideGiftButton: true, 19 | hideIdling: true 20 | }); 21 | 22 | export default async () => { 23 | initMetro(); 24 | connectToDebugger(); 25 | 26 | const settingsProxy = (await settings.init()).proxy; 27 | 28 | const patches = [ 29 | patchAssets(), 30 | settingsProxy.experiments && patchExperiments(), 31 | settingsProxy.hideGiftButton && patchChatInput(), 32 | settingsProxy.hideIdling && patchIdle(), 33 | patchSettings() 34 | ]; 35 | 36 | loadPlugins(); 37 | 38 | await Promise.all(patches); 39 | 40 | return () => { 41 | console.log("Unloading Pyoncord..."); 42 | patches.forEach(async p => p && (await p)?.()); 43 | }; 44 | }; 45 | -------------------------------------------------------------------------------- /src/managers/index.ts: -------------------------------------------------------------------------------- 1 | export * as plugins from "./plugins"; 2 | -------------------------------------------------------------------------------- /src/managers/plugins.ts: -------------------------------------------------------------------------------- 1 | import { SettingsAPI } from "@api"; 2 | import { readFile } from "@native"; 3 | 4 | interface Plugin { 5 | name: string; 6 | enabled: boolean; 7 | description: string; 8 | version: string; 9 | js: string; 10 | } 11 | 12 | type PluginReturn = { 13 | onLoad?: () => void; 14 | onUnload?: () => void; 15 | }; 16 | 17 | export const pluginStorage = new SettingsAPI("plugins/plugins.json", [ 18 | // { 19 | // name: "NoAutoReplyMention", 20 | // description: "Turns off auto mention when replying", 21 | // version: "1.0.0", // Keep? 22 | // js: "noAutoReplyMention.js" 23 | // } 24 | ]); 25 | 26 | export const pluginInstances = new Map(); 27 | 28 | async function loadPlugin(plugin: Plugin) { 29 | const pluginJS = await readFile(`plugins/${plugin.js}`); 30 | const wrappedJS = `(()=>{return ${pluginJS}})//# sourceURL=pyon-plugin-${plugin.name}`; 31 | 32 | try { 33 | const evaled = eval?.(wrappedJS)(); 34 | const ret: PluginReturn = evaled?.default ?? evaled ?? {}; 35 | 36 | ret.onLoad?.(); 37 | pluginInstances.set(plugin.name, ret); 38 | 39 | console.log(`Loaded plugin ${plugin.name}`); 40 | } catch (err) { 41 | console.error(`Failed to load plugin ${plugin.name}: ${err}`); 42 | delete pluginInstances[plugin.name]; 43 | } 44 | } 45 | 46 | export async function loadPlugins() { 47 | await pluginStorage.init(); 48 | 49 | for (const plugin of pluginStorage.proxy) if (plugin.enabled) { 50 | loadPlugin(plugin); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/metro/common.ts: -------------------------------------------------------------------------------- 1 | import { findByPropsLazy } from "@metro"; 2 | 3 | // To prevent from getting top-level side effects, always load modules lazily. 4 | export const AssetManager = findByPropsLazy("getAssetByID"); 5 | export const I18n = findByPropsLazy("Messages"); 6 | export const Forms = findByPropsLazy("FormSection"); 7 | export const Tables = findByPropsLazy("TableRow"); 8 | export const NavigationNative = findByPropsLazy("NavigationContainer"); 9 | export const Styles = findByPropsLazy("createThemedStyleSheet"); 10 | export const Colors = findByPropsLazy("unsafe_rawColors"); 11 | export const Constants = findByPropsLazy("NODE_SIZE"); 12 | export const FluxDispatcher = findByPropsLazy("dispatch", "subscribe"); 13 | export const TabsNavigationRef = findByPropsLazy("getRootNavigationRef"); 14 | -------------------------------------------------------------------------------- /src/metro/index.ts: -------------------------------------------------------------------------------- 1 | // NOTE: This file is import-sensitive, circular dependencies might crash the app! 2 | import proxyLazy from "@utils/proxyLazy"; 3 | import { after } from "spitroast"; 4 | 5 | export * as common from "@metro/common"; 6 | 7 | declare const modules: Record; 8 | export const factoryCallbacks = new Set<(exports: any) => void>(); 9 | 10 | export let _resolveReady: () => void; 11 | export const onceReady = new Promise(resolve => _resolveReady = resolve); 12 | 13 | export type FilterFn = (mod: any) => boolean; 14 | 15 | function isInvalidExport(exports: any) { 16 | return ( 17 | exports == null 18 | || exports === globalThis 19 | || typeof exports === "boolean" 20 | || typeof exports === "number" 21 | || typeof exports === "string" 22 | || exports["whar???"] === null 23 | ); 24 | } 25 | 26 | function blacklist(id: number) { 27 | Object.defineProperty(modules, id, { 28 | value: modules[id], 29 | enumerable: false, 30 | configurable: true, 31 | writable: true 32 | }); 33 | } 34 | 35 | export const filters = { 36 | byProps: (...props: string[]) => (exp: any) => props.length === 1 ? exp[props[0]] != null : props.every(prop => exp?.[prop] != null), 37 | byName: (name: string, deExp = true) => (exp: any) => (deExp ? exp.name : exp.default?.name) === name, 38 | byDisplayName: (displayName: string, deExp = true) => (exp: any) => (deExp ? exp.displayName : exp.default?.displayName) === displayName, 39 | byStoreName: (storeName: string, deExp = true) => (exp: any) => exp._dispatcher && (deExp ? exp : exp.default)?.getName?.() === storeName, 40 | }; 41 | 42 | /** 43 | * @private 44 | * Called during the initialization of a module. 45 | * Patches the module factory to emit an event when the module is loaded. 46 | */ 47 | export function initMetro() { 48 | for (const id in modules) { 49 | const module = modules[id]; 50 | 51 | if (module.factory) { 52 | /** 53 | * The factory method contains these args: 54 | * 0: the global object 55 | * 1: the metroRequire function (window.__r) 56 | * 2: the metroImportDefault function (window.__r.metroImportDefault) 57 | * 3: the metroImportAll function (window.__r.metroImportAll) 58 | * 4: the exports object 59 | * 5: the module/return object 60 | * 6: the module dependencies ids (array) 61 | * 62 | * - It doesn't return any value, but it modifies the module/return object. 63 | * - Everything is done synchronously. 64 | */ 65 | 66 | after("factory", module, ({ 5: exports }) => { 67 | if (isInvalidExport(exports)) return; 68 | factoryCallbacks.forEach(cb => cb(exports)); 69 | }, true); 70 | } 71 | } 72 | 73 | waitForModule( 74 | ["dispatch", "_actionHandlers"], 75 | FluxDispatcher => { 76 | const cb = () => { 77 | _resolveReady(); 78 | FluxDispatcher.unsubscribe("CONNECTION_OPEN", cb); 79 | }; 80 | FluxDispatcher.subscribe("CONNECTION_OPEN", cb); 81 | } 82 | ); 83 | } 84 | 85 | /** 86 | * Get all the modules that are already initialized. 87 | * @returns An iterable of the modules 88 | * @example for (const m of getInititializedModules()) { console.log(m.exports) } 89 | */ 90 | export function* getInitializedModules(): IterableIterator { 91 | for (const id in modules) { 92 | if (modules[id].isInitialized) { 93 | if (isInvalidExport(modules[id].publicModule.exports)) { 94 | blacklist(id as unknown as number); 95 | continue; 96 | } 97 | 98 | yield modules[id].publicModule; 99 | } 100 | } 101 | } 102 | 103 | /** 104 | * Wait for a module to be loaded, then call a callback with the module exports. 105 | * @param {(m) => boolean} filter 106 | * @param {(exports) => void} callback 107 | */ 108 | export function waitForModule(filter: string | string[] | FilterFn, callback: (exports: any) => void) { 109 | if (typeof filter !== "function") { 110 | filter = Array.isArray(filter) ? filters.byProps(...filter) : filters.byProps(filter); 111 | } 112 | 113 | const find = findInitializedModule(filter as FilterFn); 114 | if (find) return (callback(find), () => { }); 115 | 116 | const matches = (exports: any) => { 117 | if (exports.default && exports.__esModule && (filter as FilterFn)(exports.default)) { 118 | factoryCallbacks.delete(matches); 119 | callback(exports.default); 120 | } 121 | 122 | if ((filter as FilterFn)(exports)) { 123 | factoryCallbacks.delete(matches); 124 | callback(exports); 125 | } 126 | }; 127 | 128 | factoryCallbacks.add(matches); 129 | return () => factoryCallbacks.delete(matches); 130 | } 131 | 132 | /** 133 | * Synchronously get an already loaded/initialized module. 134 | * @param filter A function that returns true if the module is the one we're looking for 135 | * @param returnDefault Whether to return the default export or the module itself 136 | * @returns Returns the module exports 137 | */ 138 | export function findInitializedModule(filter: (m: any) => boolean, returnDefault = true): any { 139 | for (const { exports } of getInitializedModules()) { 140 | if (exports?.default && exports.__esModule && filter(exports.default)) { 141 | return returnDefault ? exports.default : exports; 142 | } 143 | if (filter(exports)) { 144 | return exports; 145 | } 146 | } 147 | } 148 | 149 | /** 150 | * Same as findInitializedModule, but lazy. 151 | * @param filter A function that returns true if the module is the one we're looking for 152 | * @param returnDefault Whether to return the default export or the module itself 153 | * @returns A proxy that will return the module exports when a property is accessed 154 | */ 155 | export function findLazy(filter: (m: any) => boolean, returnDefault = true): any { 156 | return proxyLazy(() => findInitializedModule(filter, returnDefault)); 157 | } 158 | 159 | /** 160 | * Find an initialized module by its props. 161 | * @param {string[]} props Props of the module to look for 162 | * @returns The module's export 163 | */ 164 | export function findByProps(...props: string[]) { 165 | return findInitializedModule(filters.byProps(...props)); 166 | } 167 | 168 | /** 169 | * Same as findByProps, but lazy. 170 | */ 171 | export function findByPropsLazy(...props: string[]) { 172 | return proxyLazy(() => findByProps(...props)); 173 | } 174 | 175 | /** 176 | * Get an already loaded module by its [function] name. 177 | * @param {string} name The module's name 178 | * @param {boolean} defaultExport Whether to return the default export or the module itself 179 | * @returns The function's exports 180 | */ 181 | export function findByName(name: string, defaultExport: boolean = true) { 182 | return findInitializedModule(filters.byName(name), defaultExport); 183 | } 184 | 185 | /** 186 | * Same as findByName, but lazy. 187 | */ 188 | export function findByNameLazy(name: string, defaultExport: boolean = true) { 189 | return proxyLazy(() => findByName(name, defaultExport)); 190 | } 191 | 192 | /** 193 | * Find an initialized module (usually class components) by its display name. 194 | * @param {string} displayName The component's display name 195 | * @param {boolean} defaultExport Export the default export or the module itself 196 | * @returns The component's exports 197 | */ 198 | export function findByDisplayName(displayName: string, defaultExport: boolean = true) { 199 | return findInitializedModule(filters.byDisplayName(displayName), defaultExport); 200 | } 201 | 202 | /** 203 | * Same as findByDisplayName, but lazy. 204 | */ 205 | export function findByDisplayNameLazy(displayName: string, defaultExport = true) { 206 | return proxyLazy(() => findByDisplayName(displayName, defaultExport)); 207 | } 208 | 209 | /** 210 | * Synchonously get an already loaded Flux store.\ 211 | * /!\ Only works if the store is already loaded, hence inconsistent. 212 | * @param {string} storeName The Flux store name 213 | * @returns The Flux store 214 | */ 215 | export function findByStoreName(storeName: string) { 216 | return findInitializedModule(filters.byStoreName(storeName)); 217 | } 218 | 219 | /** 220 | * Same as findByStoreName, but lazy. 221 | */ 222 | export function findByStoreNameLazy(storeName: string) { 223 | return proxyLazy(() => findByStoreName(storeName)); 224 | } 225 | -------------------------------------------------------------------------------- /src/native.ts: -------------------------------------------------------------------------------- 1 | const { 2 | RTNFileManager 3 | } = ReactNative.NativeModules; 4 | 5 | /** 6 | * A wrapper to write to a file to the documents directory 7 | * @param path Path to the file 8 | * @param data String data to write to the file 9 | */ 10 | export async function writeFile(path: string, data: string, prefix = "pyoncord/"): Promise { 11 | return void await RTNFileManager.writeFile("documents", `${prefix}${path}`, data, "utf8"); 12 | } 13 | 14 | /** 15 | * A wrapper to read a file from the documents directory 16 | * @param path Path to the file 17 | * @param fallback Fallback data to return if the file doesn't exist, and will be written to the file 18 | */ 19 | export async function readFile(path: string, fallback?: string, prefix = "pyoncord/"): Promise { 20 | try { 21 | return await RTNFileManager.readFile(`${RTNFileManager.getConstants().DocumentsDirPath}/${prefix}${path}`, "utf8"); 22 | } catch { 23 | if (fallback == null) { 24 | throw new Error(`File ${path} doesn't exist`); 25 | } 26 | 27 | writeFile(path, fallback); 28 | return fallback; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/patches/chatInput.ts: -------------------------------------------------------------------------------- 1 | import { waitForModule } from "@metro"; 2 | 3 | export default async function patchChatInput() { 4 | let hideGiftButton: boolean, moduleExports: any; 5 | 6 | const unwait = waitForModule( 7 | m => typeof m?.defaultProps?.hideGiftButton === "boolean", 8 | exports => { 9 | moduleExports = exports; 10 | ({ hideGiftButton } = exports.defaultProps); 11 | 12 | exports.defaultProps.hideGiftButton = true; 13 | } 14 | ); 15 | 16 | return () => hideGiftButton !== undefined 17 | ? moduleExports.defaultProps.hideGiftButton = hideGiftButton 18 | : unwait(); 19 | } 20 | 21 | -------------------------------------------------------------------------------- /src/patches/experiments.ts: -------------------------------------------------------------------------------- 1 | import { findByStoreNameLazy, onceReady } from "@metro"; 2 | 3 | const UserStore = findByStoreNameLazy("UserStore"); 4 | const ExperimentStore = findByStoreNameLazy("ExperimentStore"); 5 | 6 | export default async function patchExperiments() { 7 | try { 8 | await onceReady; 9 | 10 | UserStore.getCurrentUser().flags |= 1; 11 | UserStore._dispatcher._actionHandlers 12 | ._computeOrderedActionHandlers("OVERLAY_INITIALIZE") 13 | .forEach(({ name, actionHandler }: any) => { 14 | name.includes?.("Experiment") && actionHandler?.({ 15 | serializedExperimentStore: ExperimentStore.getSerializedState(), 16 | user: { flags: 1 }, 17 | }); 18 | }); 19 | } catch (err) { 20 | console.error("An error occurred while patching experiments", err); 21 | } 22 | } 23 | 24 | -------------------------------------------------------------------------------- /src/patches/idle.ts: -------------------------------------------------------------------------------- 1 | import Patcher from "@api/Patcher"; 2 | import { onceReady } from "@metro"; 3 | import { FluxDispatcher } from "@metro/common"; 4 | 5 | const patcher = new Patcher("idle-patcher"); 6 | 7 | export default async function patchIdle() { 8 | await onceReady; 9 | 10 | patcher.before(FluxDispatcher, "dispatch", args => { 11 | if (args[0].type === "IDLE") { 12 | return [{ type: "THIS_TYPE_DOES_NOT_EXIST" }]; 13 | } 14 | }); 15 | 16 | return patcher.unpatchAllAndStop; 17 | } 18 | -------------------------------------------------------------------------------- /src/patches/index.ts: -------------------------------------------------------------------------------- 1 | export { default as patchChatInput } from "./chatInput"; 2 | export { default as patchExperiments } from "./experiments"; 3 | export { default as patchIdle } from "./idle"; 4 | export { default as patchSettings } from "./settings"; 5 | export { default as patchTheme } from "./theme"; 6 | -------------------------------------------------------------------------------- /src/patches/settings.tsx: -------------------------------------------------------------------------------- 1 | // Good luck reading this! 2 | import Patcher from "@api/Patcher"; 3 | import { filters, waitForModule } from "@metro"; 4 | import { Forms, I18n, NavigationNative, TabsNavigationRef } from "@metro/common"; 5 | import { assets, findInReactTree, lazyNavigate } from "@utils"; 6 | import { resolveAssets } from "@utils/assets"; 7 | 8 | const patcher = new Patcher("settings-patcher"); 9 | 10 | const icons = resolveAssets({ 11 | Discord: { 12 | path: "/assets/images/native/main_tabs", 13 | name: "Discord" 14 | }, 15 | Wrench: { 16 | path: "/assets/images/native/icons/settings", 17 | name: "ic_progress_wrench_24px" 18 | } 19 | }); 20 | 21 | // @ts-expect-error 22 | export const sections = window.__pyoncord_sections_patch = { 23 | [`Pyoncord (${__PYONCORD_COMMIT_HASH__}) ${__PYONCORD_DEV__ ? "(DEV)" : ""}`.trimEnd()]: [ 24 | ["PYONCORD", "Pyoncord", () => import("@ui/screens/General"), icons.Discord], 25 | ["PYONCORD_PLUGINS", "Plugins", () => import("@ui/screens/Plugins"), icons.Wrench] 26 | ] 27 | } as { 28 | [key: string]: [key: string, title: string, getRender: () => Promise, icon: number][]; 29 | }; 30 | 31 | const CustomPageRenderer = React.memo(() => { 32 | const navigation = NavigationNative.useNavigation(); 33 | const route = NavigationNative.useRoute(); 34 | 35 | const { render: PageComponent, ...args } = route.params; 36 | 37 | React.useEffect(() => void navigation.setOptions({ ...args }), []); 38 | 39 | return ; 40 | }); 41 | 42 | function SettingsSection() { 43 | // This has to be destructured here, otherwise it will throw 44 | const { FormSection, FormRow, FormIcon } = Forms; 45 | 46 | const navigation = NavigationNative.useNavigation(); 47 | 48 | return <> 49 | {Object.keys(sections).map(sect => ( 50 | 51 | {sections[sect].map(row => ( 52 | } 55 | trailing={FormRow.Arrow} 56 | onPress={() => lazyNavigate(navigation, row[2](), row[1])} 57 | /> 58 | ))} 59 | 60 | ))} 61 | ; 62 | } 63 | 64 | function patchPanelUI() { 65 | patcher.patch(filters.byName("getScreens", false)).after("default", (_args, screens) => { 66 | return Object.assign(screens, { 67 | PyoncordCustomPage: { 68 | title: "Pyoncord", 69 | render: () => 70 | } 71 | }); 72 | }); 73 | 74 | const unpatch = patcher.patch(filters.byName("UserSettingsOverviewWrapper", false)).after("default", (_args, ret) => { 75 | const UserSettingsOverview = findInReactTree(ret.props.children, n => n.type?.name === "UserSettingsOverview"); 76 | 77 | patcher.after(UserSettingsOverview.type.prototype, "renderSupportAndAcknowledgements", (_args, { props: { children } }) => { 78 | const index = children.findIndex((c: any) => c?.type?.name === "UploadLogsButton"); 79 | if (index !== -1) children.splice(index, 1); 80 | }); 81 | 82 | patcher.after(UserSettingsOverview.type.prototype, "render", (_args, res) => { 83 | const titles = [I18n.Messages.BILLING_SETTINGS, I18n.Messages.PREMIUM_SETTINGS]; 84 | 85 | const sections = findInReactTree( 86 | res.props.children, 87 | n => n?.children?.[1]?.type === Forms.FormSection 88 | ).children; 89 | 90 | const index = sections.findIndex((c: any) => titles.includes(c?.props.label)); 91 | sections.splice(-~index || 4, 0, ); 92 | }); 93 | 94 | unpatch(); 95 | }); 96 | } 97 | 98 | function patchTabsUI() { 99 | waitForModule("SETTING_RENDERER_CONFIGS", module => { 100 | module.SETTING_RENDERER_CONFIGS.PYONCORD_CUSTOM_PAGE = { 101 | type: "route", 102 | screen: { 103 | route: "PyoncordCustomPage", 104 | getComponent: () => CustomPageRenderer 105 | } 106 | }; 107 | 108 | for (const sect of Object.values(sections)) { 109 | sect.forEach(([key, title, getRender, icon]) => { 110 | module.SETTING_RELATIONSHIPS[key] = null; 111 | module.PRESSABLE_SETTINGS_WITH_TRAILING_ARROW?.add(key); 112 | 113 | module.SETTING_RENDERER_CONFIGS[key] = { 114 | type: "pressable", 115 | get icon() { 116 | return icon; 117 | }, 118 | onPress: () => { 119 | const ref = TabsNavigationRef.getRootNavigationRef(); 120 | lazyNavigate(ref, getRender(), title); 121 | } 122 | }; 123 | }); 124 | } 125 | 126 | patcher.after(module, "getSettingTitleConfig", (args, res) => { 127 | // This will eventually get overriden with navigation.setOptions 128 | res.PYONCORD_CUSTOM_PAGE = "Pyon!"; 129 | 130 | Object.values(sections).forEach(sect => { 131 | sect.forEach(([key, title]) => res[key] = title); 132 | }); 133 | }); 134 | }); 135 | 136 | waitForModule("useOverviewSettings", module => { 137 | patcher.after(module, "useOverviewSettings", (args, res) => { 138 | if (!res || !Array.isArray(res)) return; 139 | 140 | let index = -~res.findIndex((i: any) => i.title === I18n.Messages.ACCOUNT_SETTINGS) || 1; 141 | 142 | Object.keys(sections).forEach(sect => { 143 | res.splice(index++, 0, { 144 | title: sect, 145 | settings: sections[sect].map(a => a[0]) 146 | }); 147 | }); 148 | }); 149 | }); 150 | } 151 | 152 | export default function patchSettings() { 153 | patchPanelUI(); 154 | patchTabsUI(); 155 | 156 | return () => patcher.unpatchAllAndStop(); 157 | } 158 | -------------------------------------------------------------------------------- /src/patches/theme.ts: -------------------------------------------------------------------------------- 1 | import Patcher from "@api/Patcher"; 2 | import { waitForModule } from "@metro"; 3 | import { getCurrentTheme } from "@themes"; 4 | 5 | const patcher = new Patcher("theme-patcher"); 6 | 7 | // TODO: Implement theming 8 | export default async function patchTheme() { 9 | return; 10 | 11 | const currentTheme = getCurrentTheme() as any; 12 | 13 | waitForModule( 14 | m => m?.unsafe_rawColors && m.meta, 15 | ColorModule => { 16 | let semanticColorsSymbol; 17 | const orig_rawColors = ColorModule.unsafe_rawColors; 18 | 19 | ColorModule.unsafe_rawColors = { 20 | ...ColorModule.unsafe_rawColors, 21 | ...currentTheme.data.rawColors 22 | }; 23 | 24 | patcher.addUnpatcher(() => { 25 | ColorModule.unsafe_rawColors = orig_rawColors; 26 | }); 27 | 28 | patcher.instead(ColorModule.meta, "resolveSemanticColor", ([theme, key], orig) => { 29 | const realKey = key[semanticColorsSymbol ??= Object.getOwnPropertySymbols(key)[0]]; 30 | const themeIndex = theme === "dark" ? 0 : theme === "light" ? 1 : 2; 31 | 32 | if (currentTheme.data.semanticColors[realKey]?.[themeIndex]) { 33 | return currentTheme.data.semanticColors[realKey][themeIndex]; 34 | } 35 | 36 | return orig(theme, key); 37 | }); 38 | } 39 | ); 40 | 41 | return () => patcher.unpatchAllAndStop(); 42 | } 43 | -------------------------------------------------------------------------------- /src/themes.ts: -------------------------------------------------------------------------------- 1 | export function getCurrentTheme() { 2 | throw new Error("Not implemented"); 3 | } 4 | -------------------------------------------------------------------------------- /src/ui/screens/General.tsx: -------------------------------------------------------------------------------- 1 | import { settings as settingsDef } from "@index"; 2 | import { Tables } from "@metro/common"; 3 | import { resolveAssets } from "@utils/assets"; 4 | 5 | const { ScrollView } = ReactNative; 6 | const { Stack, TableRow, TableSwitchRow, TableRowGroup } = Tables; 7 | 8 | const icons = resolveAssets({ 9 | StaffBadge: { 10 | path: "/assets/images/native/badge", 11 | name: "ic_badge_staff" 12 | }, 13 | Gift: { 14 | path: "/assets/images/native/icons/settings", 15 | name: "ic_gift_24px" 16 | }, 17 | Idle: { 18 | path: "/assets/images/native/status", 19 | name: "StatusIdle" 20 | } 21 | }); 22 | 23 | 24 | export default function General() { 25 | const settings = settingsDef.useStorage(); 26 | 27 | return ( 28 | 29 | 30 | 31 | } 35 | value={settings.experiments} 36 | onValueChange={(v: boolean) => settings.experiments = v} 37 | /> 38 | } 42 | value={settings.hideGiftButton} 43 | onValueChange={(v: boolean) => settings.hideGiftButton = v} 44 | /> 45 | } 49 | value={settings.hideIdling} 50 | onValueChange={(v: boolean) => settings.hideIdling = v} 51 | /> 52 | 53 | 54 | 55 | ); 56 | } 57 | -------------------------------------------------------------------------------- /src/ui/screens/Plugins.tsx: -------------------------------------------------------------------------------- 1 | import { commonStyles } from "./common"; 2 | 3 | const { View, Text, ScrollView } = ReactNative; 4 | 5 | export default function UpdaterPage() { 6 | return ( 7 | 8 | 9 | {"Plugin system coming soon (never)."} 10 | 11 | 12 | ); 13 | } 14 | -------------------------------------------------------------------------------- /src/ui/screens/common.ts: -------------------------------------------------------------------------------- 1 | import { Colors, Constants, Styles } from "@metro/common"; 2 | 3 | // Derived from AliucordRN 4 | export const commonStyles = Styles.createThemedStyleSheet({ 5 | container: { 6 | flex: 1 7 | }, 8 | list: { 9 | paddingVertical: 14, 10 | paddingHorizontal: 8 11 | }, 12 | card: { 13 | borderRadius: 10, 14 | margin: 5, 15 | backgroundColor: Colors.colors.BACKGROUND_TERTIARY, 16 | }, 17 | header: { 18 | flexDirection: "row", 19 | flexWrap: "wrap" 20 | }, 21 | bodyCard: { 22 | backgroundColor: Colors.colors.BACKGROUND_SECONDARY, 23 | borderBottomLeftRadius: 10, 24 | borderBottomRightRadius: 10 25 | }, 26 | bodyText: { 27 | color: Colors.colors.TEXT_NORMAL, 28 | paddingHorizontal: 16, 29 | paddingTop: 10, 30 | paddingBottom: 18, 31 | textAlignVertical: "top" 32 | }, 33 | actions: { 34 | justifyContent: "flex-start", 35 | flexDirection: "row", 36 | alignItems: "center", 37 | paddingLeft: 16, 38 | paddingRight: 12, 39 | paddingBottom: 10 40 | }, 41 | iconsContainer: { 42 | flexDirection: "row", 43 | justifyContent: "flex-start" 44 | }, 45 | icons: { 46 | width: 24, 47 | height: 24, 48 | marginHorizontal: 4, 49 | tintColor: Colors.colors.INTERACTIVE_NORMAL 50 | }, 51 | headerText: { 52 | fontFamily: Constants.Fonts.PRIMARY_SEMIBOLD, 53 | color: Colors.colors.TEXT_NORMAL, 54 | fontSize: 16 55 | }, 56 | link: { 57 | color: Colors.colors.TEXT_LINK 58 | }, 59 | emptyPageImage: { 60 | display: "flex", 61 | justifyContent: "center", 62 | alignItems: "center", 63 | alignSelf: "center", 64 | marginTop: "10%" 65 | }, 66 | emptyPageText: { 67 | marginTop: 10, 68 | color: Colors.colors.TEXT_NORMAL, 69 | fontFamily: Constants.Fonts.PRIMARY_SEMIBOLD, 70 | textAlign: "center" 71 | }, 72 | search: { 73 | margin: 0, 74 | marginBottom: 0, 75 | paddingBottom: 5, 76 | paddingRight: 15, 77 | paddingLeft: 15, 78 | backgroundColor: "none", 79 | borderBottomWidth: 0, 80 | background: "none" 81 | }, 82 | button: { 83 | height: 34, 84 | paddingHorizontal: 16, 85 | marginLeft: 6 86 | }, 87 | buttonIcon: { 88 | width: 14, 89 | height: 14, 90 | marginRight: 6, 91 | color: Colors.colors.TEXT_NORMAL 92 | }, 93 | invalidHeader: { 94 | flexDirection: "column", 95 | flexWrap: "wrap" 96 | }, 97 | invalidInfoText: { 98 | color: Colors.colors.TEXT_MUTED, 99 | fontSize: 12, 100 | fontWeight: "400" 101 | }, 102 | warningText: { 103 | color: Colors.colors.TEXT_WARNING, 104 | fontFamily: Constants.Fonts.PRIMARY_NORMAL, 105 | fontSize: 12, 106 | paddingTop: 5 107 | }, 108 | }); 109 | -------------------------------------------------------------------------------- /src/utils/assets.ts: -------------------------------------------------------------------------------- 1 | // https://github.com/vendetta-mod/Vendetta/blob/rewrite/src/ui/assets.ts 2 | import Patcher from "@api/Patcher"; 3 | import { AssetManager } from "@metro/common"; 4 | 5 | const patcher = new Patcher("assets-patcher"); 6 | 7 | type Asset = Record & { id: number; }; 8 | 9 | export const registeredAssets: Record = {}; 10 | 11 | export function patchAssets() { 12 | patcher.instead(AssetManager, "registerAsset", (args, orig) => { 13 | const [asset] = args; 14 | 15 | if (registeredAssets[asset.name]) { 16 | Object.assign(registeredAssets[asset.name], asset); 17 | return registeredAssets[asset.name].id; 18 | } 19 | 20 | registeredAssets[asset.name] = { ...asset, id: orig(...args) }; 21 | return registeredAssets[asset.name].id; 22 | }); 23 | 24 | let asset: Asset, id = 1; 25 | // eslint-disable-next-line no-cond-assign 26 | while (asset = AssetManager.getAssetByID(id)) { 27 | registeredAssets[asset.name] ??= { ...asset, id: id++ }; 28 | } 29 | 30 | return () => patcher.unpatchAllAndStop(); 31 | } 32 | 33 | export const getAssetByName = (name: string): Asset => registeredAssets[name]; 34 | export const getAssetByID = (id: number): Asset => AssetManager.getAssetByID(id); 35 | export const getAssetIDByName = (name: string) => registeredAssets[name]?.id; 36 | 37 | export function resolveAsset(asset): number { 38 | const { path } = asset; 39 | delete asset.path; 40 | 41 | return AssetManager.registerAsset({ 42 | __packager_asset: true, 43 | httpServerLocation: path, 44 | hash: Math.random().toString(), 45 | type: "png", 46 | height: 64, 47 | width: 64, 48 | scales: [1], 49 | ...asset 50 | }); 51 | } 52 | 53 | export function resolveAssets(assets: T) { 54 | const assetMap = {} as { [Property in keyof T]: number }; 55 | 56 | for (const key in assets) { 57 | assetMap[key] = resolveAsset(assets[key]); 58 | } 59 | 60 | return assetMap; 61 | } 62 | -------------------------------------------------------------------------------- /src/utils/awaitUntil.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Awaits until a condition is met 3 | * @param {() => boolean} condition - A function that returns a boolean 4 | * @param {Number} timeout - The timeout in ms 5 | */ 6 | export default function awaitUntil(condition: () => boolean, timeout: number = 100) { 7 | return new Promise(resolve => { 8 | const interval = setInterval(() => { 9 | if (condition()) { 10 | clearInterval(interval); 11 | resolve(); 12 | } 13 | }, timeout); 14 | }); 15 | } 16 | -------------------------------------------------------------------------------- /src/utils/findInReactTree.ts: -------------------------------------------------------------------------------- 1 | import { findInTree } from "@utils"; 2 | 3 | import { SearchFilter, SearchTree } from "./findInTree"; 4 | 5 | export default function findInReactTree(tree: SearchTree, filter: SearchFilter): any { 6 | return findInTree(tree, filter, { 7 | walkable: ["props", "children", "child", "sibling"], 8 | }); 9 | } 10 | -------------------------------------------------------------------------------- /src/utils/findInTree.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * BSD 3-Clause License 3 | * Copyright (c) 2023 Team Vendetta 4 | * ------------------------------------------- 5 | * Original code: https://github.com/vendetta-mod/Vendetta/blob/rewrite/src/lib/utils/findInReactTree.ts 6 | */ 7 | 8 | export type SearchTree = Record; 9 | export type SearchFilter = (tree: SearchTree) => boolean; 10 | export interface FindInTreeOptions { 11 | walkable?: string[]; 12 | ignore?: string[]; 13 | maxDepth?: number; 14 | } 15 | 16 | function treeSearch(tree: SearchTree, filter: SearchFilter, opts: Required, depth: number): any { 17 | if (depth > opts.maxDepth) return; 18 | if (!tree) return; 19 | 20 | try { 21 | if (filter(tree)) return tree; 22 | } catch { } 23 | 24 | if (Array.isArray(tree)) { 25 | for (const item of tree) { 26 | if (typeof item !== "object" || item === null) continue; 27 | 28 | try { 29 | const found = treeSearch(item, filter, opts, depth + 1); 30 | if (found) return found; 31 | } catch { } 32 | } 33 | } else if (typeof tree === "object") { 34 | for (const key of Object.keys(tree)) { 35 | if (typeof tree[key] !== "object" || tree[key] === null) continue; 36 | if (opts.walkable.length && !opts.walkable.includes(key)) continue; 37 | if (opts.ignore.includes(key)) continue; 38 | 39 | try { 40 | const found = treeSearch(tree[key], filter, opts, depth + 1); 41 | if (found) return found; 42 | } catch { } 43 | } 44 | } 45 | } 46 | 47 | export default function findInTree(tree: SearchTree, filter: SearchFilter, opts: FindInTreeOptions = {}): any | undefined { 48 | return treeSearch(tree, filter, { walkable: [], ignore: [], maxDepth: 100, ...opts }, 0); 49 | } 50 | -------------------------------------------------------------------------------- /src/utils/index.ts: -------------------------------------------------------------------------------- 1 | export * as assets from "./assets"; 2 | export { default as awaitUntil } from "./awaitUntil"; 3 | export { default as findInReactTree } from "./findInReactTree"; 4 | export { default as findInTree } from "./findInTree"; 5 | export { default as lazyNavigate } from "./lazyNavigate"; 6 | export { default as observeObject } from "./observeObject"; 7 | export { default as proxyLazy } from "./proxyLazy"; 8 | -------------------------------------------------------------------------------- /src/utils/lazyNavigate.tsx: -------------------------------------------------------------------------------- 1 | /** 2 | * Lazily navigate to a custom screen 3 | * @param navigation The navigation object from useNavigation 4 | * @param renderPromise Promise that resolves to the component to render (e.g. import("@ui/screens/General")) 5 | * @param screenOptions Screen options to pass to the navigation object 6 | * @param props Props to pass to the component 7 | * 8 | * @example 9 | * const navigation = NavigationNative.useNavigation(); 10 | * ... 11 | * lazyNavigate(navigation, import("@ui/screens/General"), "General") 12 | */ 13 | export default async function lazyNavigate( 14 | navigation: any, 15 | renderPromise: Promise, 16 | screenOptions: string | Record, 17 | props?: any, 18 | ) { 19 | const Component = await renderPromise.then(m => m.default); 20 | 21 | if (typeof screenOptions === "string") { 22 | screenOptions = { title: screenOptions }; 23 | } 24 | 25 | navigation.navigate("PyoncordCustomPage", { 26 | ...screenOptions, 27 | render: () => 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /src/utils/observeObject.ts: -------------------------------------------------------------------------------- 1 | export default function observeObject(obj: any, callback: (obj: any) => void) { 2 | const handler = { 3 | get(target: any, key: string): any { 4 | const value = target[key]; 5 | 6 | if (typeof value === "object") { 7 | return observeObject(value, callback); 8 | } 9 | 10 | return value; 11 | }, 12 | set(target: any, key: string, value: any) { 13 | target[key] = value; 14 | 15 | callback(target); 16 | return true; 17 | }, 18 | deleteProperty(target: any, key: string) { 19 | delete target[key]; 20 | callback(target); 21 | return true; 22 | } 23 | }; 24 | 25 | return new Proxy(obj, handler); 26 | } 27 | -------------------------------------------------------------------------------- /src/utils/proxyLazy.ts: -------------------------------------------------------------------------------- 1 | const factorySymbol = Symbol("lazyFactory"); 2 | const cacheSymbol = Symbol("lazyCache"); 3 | 4 | const unconfigurable = ["arguments", "caller", "prototype"]; 5 | const isUnconfigurable = (key: PropertyKey) => typeof key === "string" && unconfigurable.includes(key); 6 | 7 | const lazyHandler: ProxyHandler = { 8 | ...Object.fromEntries(Object.getOwnPropertyNames(Reflect).map(fnName => { 9 | return [fnName, (target: any, ...args: any[]) => { 10 | return Reflect[fnName](target[factorySymbol](), ...args); 11 | }]; 12 | })), 13 | ownKeys: target => { 14 | const cacheKeys = Reflect.ownKeys(target[factorySymbol]()); 15 | unconfigurable.forEach(key => isUnconfigurable(key) && cacheKeys.push(key)); 16 | return cacheKeys; 17 | }, 18 | getOwnPropertyDescriptor: (target, p) => { 19 | if (isUnconfigurable(p)) return Reflect.getOwnPropertyDescriptor(target, p); 20 | 21 | const descriptor = Reflect.getOwnPropertyDescriptor(target[factorySymbol](), p); 22 | if (descriptor) Object.defineProperty(target, p, descriptor); 23 | return descriptor; 24 | }, 25 | }; 26 | 27 | /** 28 | * Lazy proxy that will only call the factory function when needed (when a property is accessed) 29 | * @param factory Factory function to create the object 30 | * @returns A proxy that will call the factory function only when needed 31 | */ 32 | export default function proxyLazy(factory: () => T): T { 33 | const dummy = (() => void 0) as any; 34 | dummy[factorySymbol] = () => dummy[cacheSymbol] ??= factory(); 35 | 36 | return new Proxy(dummy, lazyHandler) as any; 37 | } 38 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": [ "src/**/*" ], 3 | "exclude": [ "node_modules" ], 4 | "compilerOptions": { 5 | "baseUrl": ".", 6 | "module": "ESNext", 7 | "target": "ESNext", 8 | "moduleResolution": "node", 9 | "esModuleInterop": true, 10 | "jsx": "react-native", 11 | "strict": true, 12 | "forceConsistentCasingInFileNames": true, 13 | "resolveJsonModule": true, 14 | "declaration": true, 15 | "emitDeclarationOnly": true, 16 | "outDir": "lib", 17 | "skipLibCheck": true, 18 | "noImplicitAny": false, 19 | "paths": { 20 | "@*": [ "src/*" ] 21 | } 22 | } 23 | } --------------------------------------------------------------------------------