├── .editorconfig ├── .github ├── dependabot.yml └── workflows │ └── build.yml ├── .gitignore ├── .npmrc ├── .vscode └── settings.json ├── LICENSE.md ├── README.md ├── blacklist.json ├── build.js ├── esbuild.config.js ├── eslint.config.js ├── meta └── preview.gif ├── package.json ├── pnpm-lock.yaml ├── src ├── DOM.ts ├── bump.cjs ├── configs.ts ├── fetch.ts ├── main.ts ├── meta.txt └── types │ └── GM_config.ts ├── tg-ad-filter.user.js ├── tsconfig.json └── watch.js /.editorconfig: -------------------------------------------------------------------------------- 1 | # https://github.com/editorconfig/editorconfig/wiki/EditorConfig-Properties 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | trim_trailing_whitespace = true 8 | end_of_line = crlf 9 | charset = utf-8 10 | insert_final_newline = true 11 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: github-actions 4 | directory: / # Location of package manifests 5 | schedule: 6 | interval: monthly 7 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: build 2 | 3 | on: 4 | push: 5 | paths: 6 | - "src/*" 7 | pull_request: 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - name: Checkout 14 | uses: actions/checkout@v4 15 | 16 | - name: Install pnpm 17 | uses: pnpm/action-setup@v4 18 | with: 19 | version: 9 20 | run_install: true 21 | 22 | - name: Install Node.js 23 | uses: actions/setup-node@v4 24 | with: 25 | node-version: "22" 26 | cache: pnpm 27 | 28 | - name: Run linter 29 | run: pnpm run lint:all 30 | 31 | - name: Run build 32 | run: pnpm run build 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | 3 | .vscode/* 4 | !.vscode/settings.json 5 | !.vscode/extensions.json 6 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | tag-version-prefix="" 2 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | // https://github.com/antfu/eslint-config?tab=readme-ov-file#ide-support-auto-fix-on-save 2 | { 3 | // Disable the default formatter, use eslint instead 4 | "prettier.enable": false, 5 | "editor.formatOnSave": false, 6 | 7 | // Auto fix 8 | "editor.codeActionsOnSave": { 9 | "source.fixAll.eslint": "explicit", 10 | "source.organizeImports": "never" 11 | }, 12 | 13 | // Silent the stylistic rules in you IDE, but still auto fix them 14 | "eslint.rules.customizations": [ 15 | { "rule": "style/*", "severity": "off", "fixable": true }, 16 | { "rule": "format/*", "severity": "off", "fixable": true }, 17 | { "rule": "*-indent", "severity": "off", "fixable": true }, 18 | { "rule": "*-spacing", "severity": "off", "fixable": true }, 19 | { "rule": "*-spaces", "severity": "off", "fixable": true }, 20 | { "rule": "*-order", "severity": "off", "fixable": true }, 21 | { "rule": "*-dangle", "severity": "off", "fixable": true }, 22 | { "rule": "*-newline", "severity": "off", "fixable": true }, 23 | { "rule": "*quotes", "severity": "off", "fixable": true }, 24 | { "rule": "*semi", "severity": "off", "fixable": true } 25 | ], 26 | 27 | // Enable eslint for all supported languages 28 | "eslint.validate": [ 29 | "javascript", 30 | "javascriptreact", 31 | "typescript", 32 | "typescriptreact", 33 | "vue", 34 | "html", 35 | "markdown", 36 | "json", 37 | "jsonc", 38 | "yaml", 39 | "toml", 40 | "xml", 41 | "gql", 42 | "graphql", 43 | "astro", 44 | "svelte", 45 | "css", 46 | "less", 47 | "scss", 48 | "pcss", 49 | "postcss" 50 | ], 51 | "search.exclude": { 52 | "**/*.user.js": true, 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | ===================== 3 | 4 | Copyright © `2019` `VChet` 5 | 6 | Permission is hereby granted, free of charge, to any person 7 | obtaining a copy of this software and associated documentation 8 | files (the “Software”), to deal in the Software without 9 | restriction, including without limitation the rights to use, 10 | copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | copies of the Software, and to permit persons to whom the 12 | Software is furnished to do so, subject to the following 13 | conditions: 14 | 15 | The above copyright notice and this permission notice shall be 16 | included in all copies or substantial portions of the Software. 17 | 18 | THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, 19 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 20 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 21 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 22 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 23 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 24 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 25 | OTHER DEALINGS IN THE SOFTWARE. 26 | 27 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Telegram Ad Filter 2 | 3 | [![version](https://img.shields.io/github/tag/VChet/telegram-ad-filter.svg?label=version)](https://github.com/VChet/telegram-ad-filter/tags) 4 | [![neostandard javascript style](https://img.shields.io/badge/code_style-neostandard-7fffff?style=flat)](https://github.com/neostandard/neostandard) 5 | [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](http://makeapullrequest.com) 6 | 7 | UserScript for [Telegram WebK](https://web.telegram.org/k/) that minimizes messages containing words from the [ad-word list](https://github.com/VChet/telegram-ad-filter/blob/master/blacklist.json). 8 | 9 | ## Preview 10 | 11 | ![Preview](./meta/preview.gif) 12 | 13 | ## Installation 14 | 15 | 1. Install [Violentmonkey](https://violentmonkey.github.io/get-it/) 16 | 1. Install the script 17 | 18 | - [from GitHub](https://github.com/VChet/telegram-ad-filter/raw/master/tg-ad-filter.user.js) 19 | - [from OpenUserJS](https://openuserjs.org/scripts/VChet/Telegram_Ad_Filter) 20 | - [from Greasy Fork](https://greasyfork.org/en/scripts/379355) 21 | 22 | ## Contribute 23 | 24 | If you have any ideas, bug reports, or feature requests, feel free to [contribute](https://github.com/VChet/telegram-ad-filter/pulls) or report [issues](https://github.com/VChet/telegram-ad-filter/issues). 25 | 26 | ## Development 27 | 28 | 1. [Fork](https://github.com/VChet/telegram-ad-filter/fork) and download this repository. 29 | 1. Make your changes in `tg-ad-filter.user.js`. 30 | 1. Commit your changes. 31 | 1. Make a pull request. 32 | -------------------------------------------------------------------------------- /blacklist.json: -------------------------------------------------------------------------------- 1 | [ 2 | "#advertisement", "#promo", "#paid", "#sponsor", "#collab", 3 | "#акция", "#взаимопиар", "#партнерский", "#промо", "#продвижение", "#реклам", "#спонсор" 4 | ] 5 | -------------------------------------------------------------------------------- /build.js: -------------------------------------------------------------------------------- 1 | import { build } from "esbuild"; 2 | import config from "./esbuild.config.js"; 3 | 4 | build(config).catch(() => process.exit(1)); 5 | -------------------------------------------------------------------------------- /esbuild.config.js: -------------------------------------------------------------------------------- 1 | import { readFileSync } from "node:fs"; 2 | 3 | const banner = { js: readFileSync("src/meta.txt", "utf-8") }; 4 | 5 | const config = { 6 | entryPoints: ["./src/main.ts"], 7 | outfile: "tg-ad-filter.user.js", 8 | banner, 9 | bundle: true, 10 | platform: "node", 11 | format: "esm", 12 | logLevel: "info" 13 | }; 14 | 15 | export default config; 16 | -------------------------------------------------------------------------------- /eslint.config.js: -------------------------------------------------------------------------------- 1 | import neostandard from "neostandard"; 2 | import userscripts from "eslint-plugin-userscripts"; 3 | import { defineConfig, globalIgnores } from "eslint/config"; 4 | import globals from "globals"; 5 | 6 | export default defineConfig([ 7 | globalIgnores(["tg-ad-filter.user.js"]), 8 | ...neostandard(), 9 | { 10 | files: ["*.user.js"], 11 | plugins: { userscripts: { rules: userscripts.rules } }, 12 | rules: { ...userscripts.configs.recommended.rules }, 13 | settings: { userscriptVersions: { violentmonkey: "*" } } 14 | }, 15 | { 16 | languageOptions: { 17 | parserOptions: { ecmaVersion: "latest" }, 18 | globals: { GM_configStruct: "readonly", ...globals.browser, ...globals.greasemonkey } 19 | }, 20 | rules: { 21 | "arrow-parens": ["error", "always"], 22 | curly: ["error", "all"], 23 | "@stylistic/comma-dangle": ["error", "never"], 24 | "@stylistic/quotes": ["error", "double"], 25 | "@stylistic/semi": ["error", "always"], 26 | "@stylistic/space-before-function-paren": ["error", "never"] 27 | } 28 | } 29 | ]); 30 | -------------------------------------------------------------------------------- /meta/preview.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VChet/telegram-ad-filter/72bce0b2a0ad0709c49e4fdfd200a046a69296e1/meta/preview.gif -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "telegram-ad-filter", 3 | "version": "1.4.0", 4 | "description": "Userscript that minimizes messages containing words from the list", 5 | "author": "VChet", 6 | "license": "MIT", 7 | "type": "module", 8 | "homepage": "https://github.com/VChet/telegram-ad-filter#readme", 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/VChet/telegram-ad-filter.git" 12 | }, 13 | "bugs": { 14 | "url": "https://github.com/VChet/telegram-ad-filter/issues" 15 | }, 16 | "scripts": { 17 | "preinstall": "npx only-allow pnpm", 18 | "dev": "node watch.js", 19 | "build": "node build.js", 20 | "lint:ts": "npx tsc --noEmit", 21 | "lint:js": "eslint .", 22 | "lint:js:fix": "npm run lint:js -- --fix", 23 | "lint:all": "npm run lint:ts && npm run lint:js", 24 | "preversion": "npm run build", 25 | "version": "node src/bump.cjs" 26 | }, 27 | "devDependencies": { 28 | "@types/tampermonkey": "^5.0.4", 29 | "esbuild": "^0.25.4", 30 | "eslint": "^9.26.0", 31 | "eslint-plugin-userscripts": "^0.5.6", 32 | "globals": "^16.1.0", 33 | "neostandard": "^0.12.1", 34 | "typescript": "^5.8.3" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | '@types/tampermonkey': 12 | specifier: ^5.0.4 13 | version: 5.0.4 14 | esbuild: 15 | specifier: ^0.25.4 16 | version: 0.25.4 17 | eslint: 18 | specifier: ^9.26.0 19 | version: 9.26.0 20 | eslint-plugin-userscripts: 21 | specifier: ^0.5.6 22 | version: 0.5.6(eslint@9.26.0) 23 | globals: 24 | specifier: ^16.1.0 25 | version: 16.1.0 26 | neostandard: 27 | specifier: ^0.12.1 28 | version: 0.12.1(eslint@9.26.0)(typescript@5.8.3) 29 | typescript: 30 | specifier: ^5.8.3 31 | version: 5.8.3 32 | 33 | packages: 34 | 35 | '@esbuild/aix-ppc64@0.25.4': 36 | resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} 37 | engines: {node: '>=18'} 38 | cpu: [ppc64] 39 | os: [aix] 40 | 41 | '@esbuild/android-arm64@0.25.4': 42 | resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} 43 | engines: {node: '>=18'} 44 | cpu: [arm64] 45 | os: [android] 46 | 47 | '@esbuild/android-arm@0.25.4': 48 | resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} 49 | engines: {node: '>=18'} 50 | cpu: [arm] 51 | os: [android] 52 | 53 | '@esbuild/android-x64@0.25.4': 54 | resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} 55 | engines: {node: '>=18'} 56 | cpu: [x64] 57 | os: [android] 58 | 59 | '@esbuild/darwin-arm64@0.25.4': 60 | resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} 61 | engines: {node: '>=18'} 62 | cpu: [arm64] 63 | os: [darwin] 64 | 65 | '@esbuild/darwin-x64@0.25.4': 66 | resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} 67 | engines: {node: '>=18'} 68 | cpu: [x64] 69 | os: [darwin] 70 | 71 | '@esbuild/freebsd-arm64@0.25.4': 72 | resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} 73 | engines: {node: '>=18'} 74 | cpu: [arm64] 75 | os: [freebsd] 76 | 77 | '@esbuild/freebsd-x64@0.25.4': 78 | resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} 79 | engines: {node: '>=18'} 80 | cpu: [x64] 81 | os: [freebsd] 82 | 83 | '@esbuild/linux-arm64@0.25.4': 84 | resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} 85 | engines: {node: '>=18'} 86 | cpu: [arm64] 87 | os: [linux] 88 | 89 | '@esbuild/linux-arm@0.25.4': 90 | resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} 91 | engines: {node: '>=18'} 92 | cpu: [arm] 93 | os: [linux] 94 | 95 | '@esbuild/linux-ia32@0.25.4': 96 | resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} 97 | engines: {node: '>=18'} 98 | cpu: [ia32] 99 | os: [linux] 100 | 101 | '@esbuild/linux-loong64@0.25.4': 102 | resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} 103 | engines: {node: '>=18'} 104 | cpu: [loong64] 105 | os: [linux] 106 | 107 | '@esbuild/linux-mips64el@0.25.4': 108 | resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} 109 | engines: {node: '>=18'} 110 | cpu: [mips64el] 111 | os: [linux] 112 | 113 | '@esbuild/linux-ppc64@0.25.4': 114 | resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} 115 | engines: {node: '>=18'} 116 | cpu: [ppc64] 117 | os: [linux] 118 | 119 | '@esbuild/linux-riscv64@0.25.4': 120 | resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} 121 | engines: {node: '>=18'} 122 | cpu: [riscv64] 123 | os: [linux] 124 | 125 | '@esbuild/linux-s390x@0.25.4': 126 | resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} 127 | engines: {node: '>=18'} 128 | cpu: [s390x] 129 | os: [linux] 130 | 131 | '@esbuild/linux-x64@0.25.4': 132 | resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} 133 | engines: {node: '>=18'} 134 | cpu: [x64] 135 | os: [linux] 136 | 137 | '@esbuild/netbsd-arm64@0.25.4': 138 | resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} 139 | engines: {node: '>=18'} 140 | cpu: [arm64] 141 | os: [netbsd] 142 | 143 | '@esbuild/netbsd-x64@0.25.4': 144 | resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} 145 | engines: {node: '>=18'} 146 | cpu: [x64] 147 | os: [netbsd] 148 | 149 | '@esbuild/openbsd-arm64@0.25.4': 150 | resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} 151 | engines: {node: '>=18'} 152 | cpu: [arm64] 153 | os: [openbsd] 154 | 155 | '@esbuild/openbsd-x64@0.25.4': 156 | resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} 157 | engines: {node: '>=18'} 158 | cpu: [x64] 159 | os: [openbsd] 160 | 161 | '@esbuild/sunos-x64@0.25.4': 162 | resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} 163 | engines: {node: '>=18'} 164 | cpu: [x64] 165 | os: [sunos] 166 | 167 | '@esbuild/win32-arm64@0.25.4': 168 | resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} 169 | engines: {node: '>=18'} 170 | cpu: [arm64] 171 | os: [win32] 172 | 173 | '@esbuild/win32-ia32@0.25.4': 174 | resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} 175 | engines: {node: '>=18'} 176 | cpu: [ia32] 177 | os: [win32] 178 | 179 | '@esbuild/win32-x64@0.25.4': 180 | resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} 181 | engines: {node: '>=18'} 182 | cpu: [x64] 183 | os: [win32] 184 | 185 | '@eslint-community/eslint-utils@4.4.1': 186 | resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} 187 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 188 | peerDependencies: 189 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 190 | 191 | '@eslint-community/regexpp@4.12.1': 192 | resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} 193 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 194 | 195 | '@eslint/config-array@0.20.0': 196 | resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} 197 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 198 | 199 | '@eslint/config-helpers@0.2.1': 200 | resolution: {integrity: sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==} 201 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 202 | 203 | '@eslint/core@0.13.0': 204 | resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} 205 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 206 | 207 | '@eslint/eslintrc@3.3.1': 208 | resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} 209 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 210 | 211 | '@eslint/js@9.26.0': 212 | resolution: {integrity: sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ==} 213 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 214 | 215 | '@eslint/object-schema@2.1.6': 216 | resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} 217 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 218 | 219 | '@eslint/plugin-kit@0.2.8': 220 | resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} 221 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 222 | 223 | '@humanfs/core@0.19.1': 224 | resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 225 | engines: {node: '>=18.18.0'} 226 | 227 | '@humanfs/node@0.16.6': 228 | resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} 229 | engines: {node: '>=18.18.0'} 230 | 231 | '@humanwhocodes/gitignore-to-minimatch@1.0.2': 232 | resolution: {integrity: sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==} 233 | 234 | '@humanwhocodes/module-importer@1.0.1': 235 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 236 | engines: {node: '>=12.22'} 237 | 238 | '@humanwhocodes/retry@0.3.1': 239 | resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} 240 | engines: {node: '>=18.18'} 241 | 242 | '@humanwhocodes/retry@0.4.2': 243 | resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} 244 | engines: {node: '>=18.18'} 245 | 246 | '@modelcontextprotocol/sdk@1.11.1': 247 | resolution: {integrity: sha512-9LfmxKTb1v+vUS1/emSk1f5ePmTLkb9Le9AxOB5T0XM59EUumwcS45z05h7aiZx3GI0Bl7mjb3FMEglYj+acuQ==} 248 | engines: {node: '>=18'} 249 | 250 | '@nodelib/fs.scandir@2.1.5': 251 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 252 | engines: {node: '>= 8'} 253 | 254 | '@nodelib/fs.stat@2.0.5': 255 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 256 | engines: {node: '>= 8'} 257 | 258 | '@nodelib/fs.walk@1.2.8': 259 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 260 | engines: {node: '>= 8'} 261 | 262 | '@nolyfill/is-core-module@1.0.39': 263 | resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} 264 | engines: {node: '>=12.4.0'} 265 | 266 | '@stylistic/eslint-plugin@2.11.0': 267 | resolution: {integrity: sha512-PNRHbydNG5EH8NK4c+izdJlxajIR6GxcUhzsYNRsn6Myep4dsZt0qFCz3rCPnkvgO5FYibDcMqgNHUT+zvjYZw==} 268 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 269 | peerDependencies: 270 | eslint: '>=8.40.0' 271 | 272 | '@types/doctrine@0.0.9': 273 | resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} 274 | 275 | '@types/estree@1.0.6': 276 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 277 | 278 | '@types/json-schema@7.0.15': 279 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 280 | 281 | '@types/tampermonkey@5.0.4': 282 | resolution: {integrity: sha512-HEJ0O5CkDZSwIgd9Zip4xM8o7gZC8zBmJuH1YEXNINIC+aCWEXD10pnpo3NQG5IWHx+Xr4fMSGq1jqeKXH2lpA==} 283 | 284 | '@typescript-eslint/eslint-plugin@8.24.1': 285 | resolution: {integrity: sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA==} 286 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 287 | peerDependencies: 288 | '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 289 | eslint: ^8.57.0 || ^9.0.0 290 | typescript: '>=4.8.4 <5.8.0' 291 | 292 | '@typescript-eslint/parser@8.24.1': 293 | resolution: {integrity: sha512-Tqoa05bu+t5s8CTZFaGpCH2ub3QeT9YDkXbPd3uQ4SfsLoh1/vv2GEYAioPoxCWJJNsenXlC88tRjwoHNts1oQ==} 294 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 295 | peerDependencies: 296 | eslint: ^8.57.0 || ^9.0.0 297 | typescript: '>=4.8.4 <5.8.0' 298 | 299 | '@typescript-eslint/scope-manager@8.24.1': 300 | resolution: {integrity: sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q==} 301 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 302 | 303 | '@typescript-eslint/type-utils@8.24.1': 304 | resolution: {integrity: sha512-/Do9fmNgCsQ+K4rCz0STI7lYB4phTtEXqqCAs3gZW0pnK7lWNkvWd5iW545GSmApm4AzmQXmSqXPO565B4WVrw==} 305 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 306 | peerDependencies: 307 | eslint: ^8.57.0 || ^9.0.0 308 | typescript: '>=4.8.4 <5.8.0' 309 | 310 | '@typescript-eslint/types@8.24.1': 311 | resolution: {integrity: sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==} 312 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 313 | 314 | '@typescript-eslint/typescript-estree@8.24.1': 315 | resolution: {integrity: sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg==} 316 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 317 | peerDependencies: 318 | typescript: '>=4.8.4 <5.8.0' 319 | 320 | '@typescript-eslint/utils@8.24.1': 321 | resolution: {integrity: sha512-OOcg3PMMQx9EXspId5iktsI3eMaXVwlhC8BvNnX6B5w9a4dVgpkQZuU8Hy67TolKcl+iFWq0XX+jbDGN4xWxjQ==} 322 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 323 | peerDependencies: 324 | eslint: ^8.57.0 || ^9.0.0 325 | typescript: '>=4.8.4 <5.8.0' 326 | 327 | '@typescript-eslint/visitor-keys@8.24.1': 328 | resolution: {integrity: sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg==} 329 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 330 | 331 | accepts@2.0.0: 332 | resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} 333 | engines: {node: '>= 0.6'} 334 | 335 | acorn-jsx@5.3.2: 336 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 337 | peerDependencies: 338 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 339 | 340 | acorn@8.14.0: 341 | resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} 342 | engines: {node: '>=0.4.0'} 343 | hasBin: true 344 | 345 | ajv@6.12.6: 346 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 347 | 348 | ansi-styles@4.3.0: 349 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 350 | engines: {node: '>=8'} 351 | 352 | argparse@2.0.1: 353 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 354 | 355 | array-buffer-byte-length@1.0.2: 356 | resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} 357 | engines: {node: '>= 0.4'} 358 | 359 | array-includes@3.1.8: 360 | resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} 361 | engines: {node: '>= 0.4'} 362 | 363 | array.prototype.findlast@1.2.5: 364 | resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} 365 | engines: {node: '>= 0.4'} 366 | 367 | array.prototype.flat@1.3.3: 368 | resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} 369 | engines: {node: '>= 0.4'} 370 | 371 | array.prototype.flatmap@1.3.3: 372 | resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} 373 | engines: {node: '>= 0.4'} 374 | 375 | array.prototype.tosorted@1.1.4: 376 | resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} 377 | engines: {node: '>= 0.4'} 378 | 379 | arraybuffer.prototype.slice@1.0.4: 380 | resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} 381 | engines: {node: '>= 0.4'} 382 | 383 | async-function@1.0.0: 384 | resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} 385 | engines: {node: '>= 0.4'} 386 | 387 | available-typed-arrays@1.0.7: 388 | resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} 389 | engines: {node: '>= 0.4'} 390 | 391 | balanced-match@1.0.2: 392 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 393 | 394 | body-parser@2.2.0: 395 | resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} 396 | engines: {node: '>=18'} 397 | 398 | brace-expansion@1.1.11: 399 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 400 | 401 | brace-expansion@2.0.1: 402 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 403 | 404 | braces@3.0.3: 405 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 406 | engines: {node: '>=8'} 407 | 408 | bytes@3.1.2: 409 | resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} 410 | engines: {node: '>= 0.8'} 411 | 412 | call-bind-apply-helpers@1.0.2: 413 | resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} 414 | engines: {node: '>= 0.4'} 415 | 416 | call-bind@1.0.8: 417 | resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} 418 | engines: {node: '>= 0.4'} 419 | 420 | call-bound@1.0.3: 421 | resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} 422 | engines: {node: '>= 0.4'} 423 | 424 | callsites@3.1.0: 425 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 426 | engines: {node: '>=6'} 427 | 428 | chalk@4.1.2: 429 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 430 | engines: {node: '>=10'} 431 | 432 | color-convert@2.0.1: 433 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 434 | engines: {node: '>=7.0.0'} 435 | 436 | color-name@1.1.4: 437 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 438 | 439 | concat-map@0.0.1: 440 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 441 | 442 | content-disposition@1.0.0: 443 | resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} 444 | engines: {node: '>= 0.6'} 445 | 446 | content-type@1.0.5: 447 | resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} 448 | engines: {node: '>= 0.6'} 449 | 450 | cookie-signature@1.2.2: 451 | resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} 452 | engines: {node: '>=6.6.0'} 453 | 454 | cookie@0.7.2: 455 | resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} 456 | engines: {node: '>= 0.6'} 457 | 458 | cors@2.8.5: 459 | resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} 460 | engines: {node: '>= 0.10'} 461 | 462 | cross-spawn@7.0.6: 463 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 464 | engines: {node: '>= 8'} 465 | 466 | data-view-buffer@1.0.2: 467 | resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} 468 | engines: {node: '>= 0.4'} 469 | 470 | data-view-byte-length@1.0.2: 471 | resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} 472 | engines: {node: '>= 0.4'} 473 | 474 | data-view-byte-offset@1.0.1: 475 | resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} 476 | engines: {node: '>= 0.4'} 477 | 478 | debug@3.2.7: 479 | resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} 480 | peerDependencies: 481 | supports-color: '*' 482 | peerDependenciesMeta: 483 | supports-color: 484 | optional: true 485 | 486 | debug@4.4.0: 487 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 488 | engines: {node: '>=6.0'} 489 | peerDependencies: 490 | supports-color: '*' 491 | peerDependenciesMeta: 492 | supports-color: 493 | optional: true 494 | 495 | deep-is@0.1.4: 496 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 497 | 498 | define-data-property@1.1.4: 499 | resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} 500 | engines: {node: '>= 0.4'} 501 | 502 | define-properties@1.2.1: 503 | resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} 504 | engines: {node: '>= 0.4'} 505 | 506 | depd@2.0.0: 507 | resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} 508 | engines: {node: '>= 0.8'} 509 | 510 | doctrine@2.1.0: 511 | resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} 512 | engines: {node: '>=0.10.0'} 513 | 514 | doctrine@3.0.0: 515 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 516 | engines: {node: '>=6.0.0'} 517 | 518 | dunder-proto@1.0.1: 519 | resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} 520 | engines: {node: '>= 0.4'} 521 | 522 | ee-first@1.1.1: 523 | resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} 524 | 525 | encodeurl@2.0.0: 526 | resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} 527 | engines: {node: '>= 0.8'} 528 | 529 | enhanced-resolve@5.18.1: 530 | resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} 531 | engines: {node: '>=10.13.0'} 532 | 533 | es-abstract@1.23.9: 534 | resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} 535 | engines: {node: '>= 0.4'} 536 | 537 | es-define-property@1.0.1: 538 | resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} 539 | engines: {node: '>= 0.4'} 540 | 541 | es-errors@1.3.0: 542 | resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 543 | engines: {node: '>= 0.4'} 544 | 545 | es-iterator-helpers@1.2.1: 546 | resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} 547 | engines: {node: '>= 0.4'} 548 | 549 | es-object-atoms@1.1.1: 550 | resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} 551 | engines: {node: '>= 0.4'} 552 | 553 | es-set-tostringtag@2.1.0: 554 | resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} 555 | engines: {node: '>= 0.4'} 556 | 557 | es-shim-unscopables@1.1.0: 558 | resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} 559 | engines: {node: '>= 0.4'} 560 | 561 | es-to-primitive@1.3.0: 562 | resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} 563 | engines: {node: '>= 0.4'} 564 | 565 | esbuild@0.25.4: 566 | resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} 567 | engines: {node: '>=18'} 568 | hasBin: true 569 | 570 | escape-html@1.0.3: 571 | resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} 572 | 573 | escape-string-regexp@4.0.0: 574 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 575 | engines: {node: '>=10'} 576 | 577 | eslint-compat-utils@0.5.1: 578 | resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} 579 | engines: {node: '>=12'} 580 | peerDependencies: 581 | eslint: '>=6.0.0' 582 | 583 | eslint-import-resolver-node@0.3.9: 584 | resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} 585 | 586 | eslint-import-resolver-typescript@3.8.3: 587 | resolution: {integrity: sha512-A0bu4Ks2QqDWNpeEgTQMPTngaMhuDu4yv6xpftBMAf+1ziXnpx+eSR1WRfoPTe2BAiAjHFZ7kSNx1fvr5g5pmQ==} 588 | engines: {node: ^14.18.0 || >=16.0.0} 589 | peerDependencies: 590 | eslint: '*' 591 | eslint-plugin-import: '*' 592 | eslint-plugin-import-x: '*' 593 | peerDependenciesMeta: 594 | eslint-plugin-import: 595 | optional: true 596 | eslint-plugin-import-x: 597 | optional: true 598 | 599 | eslint-plugin-es-x@7.8.0: 600 | resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} 601 | engines: {node: ^14.18.0 || >=16.0.0} 602 | peerDependencies: 603 | eslint: '>=8' 604 | 605 | eslint-plugin-import-x@4.6.1: 606 | resolution: {integrity: sha512-wluSUifMIb7UfwWXqx7Yx0lE/SGCcGXECLx/9bCmbY2nneLwvAZ4vkd1IXDjPKFvdcdUgr1BaRnaRpx3k2+Pfw==} 607 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 608 | peerDependencies: 609 | eslint: ^8.57.0 || ^9.0.0 610 | 611 | eslint-plugin-n@17.15.1: 612 | resolution: {integrity: sha512-KFw7x02hZZkBdbZEFQduRGH4VkIH4MW97ClsbAM4Y4E6KguBJWGfWG1P4HEIpZk2bkoWf0bojpnjNAhYQP8beA==} 613 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 614 | peerDependencies: 615 | eslint: '>=8.23.0' 616 | 617 | eslint-plugin-promise@7.2.1: 618 | resolution: {integrity: sha512-SWKjd+EuvWkYaS+uN2csvj0KoP43YTu7+phKQ5v+xw6+A0gutVX2yqCeCkC3uLCJFiPfR2dD8Es5L7yUsmvEaA==} 619 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 620 | peerDependencies: 621 | eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 622 | 623 | eslint-plugin-react@7.37.4: 624 | resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==} 625 | engines: {node: '>=4'} 626 | peerDependencies: 627 | eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 628 | 629 | eslint-plugin-userscripts@0.5.6: 630 | resolution: {integrity: sha512-/DXb8UKyEkNCzXOA6j4E4rCWn2mLCUw2TMxrzSoz3spi4cyANlE0JNmtRleAmzc1HTUmZXr5fIMCQxyLS73DZQ==} 631 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 632 | peerDependencies: 633 | eslint: '>=8.40.0 <11' 634 | 635 | eslint-scope@8.3.0: 636 | resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} 637 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 638 | 639 | eslint-visitor-keys@3.4.3: 640 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 641 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 642 | 643 | eslint-visitor-keys@4.2.0: 644 | resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} 645 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 646 | 647 | eslint@9.26.0: 648 | resolution: {integrity: sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ==} 649 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 650 | hasBin: true 651 | peerDependencies: 652 | jiti: '*' 653 | peerDependenciesMeta: 654 | jiti: 655 | optional: true 656 | 657 | espree@10.3.0: 658 | resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} 659 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 660 | 661 | esquery@1.6.0: 662 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 663 | engines: {node: '>=0.10'} 664 | 665 | esrecurse@4.3.0: 666 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 667 | engines: {node: '>=4.0'} 668 | 669 | estraverse@5.3.0: 670 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 671 | engines: {node: '>=4.0'} 672 | 673 | esutils@2.0.3: 674 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 675 | engines: {node: '>=0.10.0'} 676 | 677 | etag@1.8.1: 678 | resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} 679 | engines: {node: '>= 0.6'} 680 | 681 | eventsource-parser@3.0.1: 682 | resolution: {integrity: sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==} 683 | engines: {node: '>=18.0.0'} 684 | 685 | eventsource@3.0.6: 686 | resolution: {integrity: sha512-l19WpE2m9hSuyP06+FbuUUf1G+R0SFLrtQfbRb9PRr+oimOfxQhgGCbVaXg5IvZyyTThJsxh6L/srkMiCeBPDA==} 687 | engines: {node: '>=18.0.0'} 688 | 689 | express-rate-limit@7.5.0: 690 | resolution: {integrity: sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==} 691 | engines: {node: '>= 16'} 692 | peerDependencies: 693 | express: ^4.11 || 5 || ^5.0.0-beta.1 694 | 695 | express@5.1.0: 696 | resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} 697 | engines: {node: '>= 18'} 698 | 699 | fast-deep-equal@3.1.3: 700 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 701 | 702 | fast-glob@3.3.3: 703 | resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} 704 | engines: {node: '>=8.6.0'} 705 | 706 | fast-json-stable-stringify@2.1.0: 707 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 708 | 709 | fast-levenshtein@2.0.6: 710 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 711 | 712 | fastq@1.19.0: 713 | resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} 714 | 715 | fdir@6.4.3: 716 | resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} 717 | peerDependencies: 718 | picomatch: ^3 || ^4 719 | peerDependenciesMeta: 720 | picomatch: 721 | optional: true 722 | 723 | file-entry-cache@8.0.0: 724 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 725 | engines: {node: '>=16.0.0'} 726 | 727 | fill-range@7.1.1: 728 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 729 | engines: {node: '>=8'} 730 | 731 | finalhandler@2.1.0: 732 | resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} 733 | engines: {node: '>= 0.8'} 734 | 735 | find-up@5.0.0: 736 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 737 | engines: {node: '>=10'} 738 | 739 | flat-cache@4.0.1: 740 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 741 | engines: {node: '>=16'} 742 | 743 | flatted@3.3.3: 744 | resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} 745 | 746 | for-each@0.3.5: 747 | resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} 748 | engines: {node: '>= 0.4'} 749 | 750 | forwarded@0.2.0: 751 | resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} 752 | engines: {node: '>= 0.6'} 753 | 754 | fresh@2.0.0: 755 | resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} 756 | engines: {node: '>= 0.8'} 757 | 758 | function-bind@1.1.2: 759 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 760 | 761 | function.prototype.name@1.1.8: 762 | resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} 763 | engines: {node: '>= 0.4'} 764 | 765 | functions-have-names@1.2.3: 766 | resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} 767 | 768 | get-intrinsic@1.2.7: 769 | resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} 770 | engines: {node: '>= 0.4'} 771 | 772 | get-proto@1.0.1: 773 | resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} 774 | engines: {node: '>= 0.4'} 775 | 776 | get-symbol-description@1.1.0: 777 | resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} 778 | engines: {node: '>= 0.4'} 779 | 780 | get-tsconfig@4.10.0: 781 | resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} 782 | 783 | glob-parent@5.1.2: 784 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 785 | engines: {node: '>= 6'} 786 | 787 | glob-parent@6.0.2: 788 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 789 | engines: {node: '>=10.13.0'} 790 | 791 | globals@14.0.0: 792 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 793 | engines: {node: '>=18'} 794 | 795 | globals@15.15.0: 796 | resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} 797 | engines: {node: '>=18'} 798 | 799 | globals@16.1.0: 800 | resolution: {integrity: sha512-aibexHNbb/jiUSObBgpHLj+sIuUmJnYcgXBlrfsiDZ9rt4aF2TFRbyLgZ2iFQuVZ1K5Mx3FVkbKRSgKrbK3K2g==} 801 | engines: {node: '>=18'} 802 | 803 | globalthis@1.0.4: 804 | resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} 805 | engines: {node: '>= 0.4'} 806 | 807 | gopd@1.2.0: 808 | resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} 809 | engines: {node: '>= 0.4'} 810 | 811 | graceful-fs@4.2.11: 812 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 813 | 814 | graphemer@1.4.0: 815 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 816 | 817 | has-bigints@1.1.0: 818 | resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} 819 | engines: {node: '>= 0.4'} 820 | 821 | has-flag@4.0.0: 822 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 823 | engines: {node: '>=8'} 824 | 825 | has-property-descriptors@1.0.2: 826 | resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} 827 | 828 | has-proto@1.2.0: 829 | resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} 830 | engines: {node: '>= 0.4'} 831 | 832 | has-symbols@1.1.0: 833 | resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} 834 | engines: {node: '>= 0.4'} 835 | 836 | has-tostringtag@1.0.2: 837 | resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} 838 | engines: {node: '>= 0.4'} 839 | 840 | hasown@2.0.2: 841 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 842 | engines: {node: '>= 0.4'} 843 | 844 | http-errors@2.0.0: 845 | resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} 846 | engines: {node: '>= 0.8'} 847 | 848 | iconv-lite@0.6.3: 849 | resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} 850 | engines: {node: '>=0.10.0'} 851 | 852 | ignore@5.3.2: 853 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 854 | engines: {node: '>= 4'} 855 | 856 | import-fresh@3.3.1: 857 | resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} 858 | engines: {node: '>=6'} 859 | 860 | imurmurhash@0.1.4: 861 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 862 | engines: {node: '>=0.8.19'} 863 | 864 | inherits@2.0.4: 865 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 866 | 867 | internal-slot@1.1.0: 868 | resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} 869 | engines: {node: '>= 0.4'} 870 | 871 | ipaddr.js@1.9.1: 872 | resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} 873 | engines: {node: '>= 0.10'} 874 | 875 | is-array-buffer@3.0.5: 876 | resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} 877 | engines: {node: '>= 0.4'} 878 | 879 | is-async-function@2.1.1: 880 | resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} 881 | engines: {node: '>= 0.4'} 882 | 883 | is-bigint@1.1.0: 884 | resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} 885 | engines: {node: '>= 0.4'} 886 | 887 | is-boolean-object@1.2.2: 888 | resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} 889 | engines: {node: '>= 0.4'} 890 | 891 | is-bun-module@1.3.0: 892 | resolution: {integrity: sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==} 893 | 894 | is-callable@1.2.7: 895 | resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} 896 | engines: {node: '>= 0.4'} 897 | 898 | is-core-module@2.16.1: 899 | resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} 900 | engines: {node: '>= 0.4'} 901 | 902 | is-data-view@1.0.2: 903 | resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} 904 | engines: {node: '>= 0.4'} 905 | 906 | is-date-object@1.1.0: 907 | resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} 908 | engines: {node: '>= 0.4'} 909 | 910 | is-extglob@2.1.1: 911 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 912 | engines: {node: '>=0.10.0'} 913 | 914 | is-finalizationregistry@1.1.1: 915 | resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} 916 | engines: {node: '>= 0.4'} 917 | 918 | is-generator-function@1.1.0: 919 | resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} 920 | engines: {node: '>= 0.4'} 921 | 922 | is-glob@4.0.3: 923 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 924 | engines: {node: '>=0.10.0'} 925 | 926 | is-map@2.0.3: 927 | resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} 928 | engines: {node: '>= 0.4'} 929 | 930 | is-number-object@1.1.1: 931 | resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} 932 | engines: {node: '>= 0.4'} 933 | 934 | is-number@7.0.0: 935 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 936 | engines: {node: '>=0.12.0'} 937 | 938 | is-promise@4.0.0: 939 | resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} 940 | 941 | is-regex@1.2.1: 942 | resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} 943 | engines: {node: '>= 0.4'} 944 | 945 | is-set@2.0.3: 946 | resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} 947 | engines: {node: '>= 0.4'} 948 | 949 | is-shared-array-buffer@1.0.4: 950 | resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} 951 | engines: {node: '>= 0.4'} 952 | 953 | is-string@1.1.1: 954 | resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} 955 | engines: {node: '>= 0.4'} 956 | 957 | is-symbol@1.1.1: 958 | resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} 959 | engines: {node: '>= 0.4'} 960 | 961 | is-typed-array@1.1.15: 962 | resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} 963 | engines: {node: '>= 0.4'} 964 | 965 | is-weakmap@2.0.2: 966 | resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} 967 | engines: {node: '>= 0.4'} 968 | 969 | is-weakref@1.1.1: 970 | resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} 971 | engines: {node: '>= 0.4'} 972 | 973 | is-weakset@2.0.4: 974 | resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} 975 | engines: {node: '>= 0.4'} 976 | 977 | isarray@2.0.5: 978 | resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} 979 | 980 | isexe@2.0.0: 981 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 982 | 983 | iterator.prototype@1.1.5: 984 | resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} 985 | engines: {node: '>= 0.4'} 986 | 987 | js-tokens@4.0.0: 988 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 989 | 990 | js-yaml@4.1.0: 991 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 992 | hasBin: true 993 | 994 | json-buffer@3.0.1: 995 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 996 | 997 | json-schema-traverse@0.4.1: 998 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 999 | 1000 | json-stable-stringify-without-jsonify@1.0.1: 1001 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1002 | 1003 | jsx-ast-utils@3.3.5: 1004 | resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} 1005 | engines: {node: '>=4.0'} 1006 | 1007 | keyv@4.5.4: 1008 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1009 | 1010 | levn@0.4.1: 1011 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1012 | engines: {node: '>= 0.8.0'} 1013 | 1014 | locate-path@6.0.0: 1015 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1016 | engines: {node: '>=10'} 1017 | 1018 | lodash.merge@4.6.2: 1019 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1020 | 1021 | loose-envify@1.4.0: 1022 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 1023 | hasBin: true 1024 | 1025 | math-intrinsics@1.1.0: 1026 | resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} 1027 | engines: {node: '>= 0.4'} 1028 | 1029 | media-typer@1.1.0: 1030 | resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} 1031 | engines: {node: '>= 0.8'} 1032 | 1033 | merge-descriptors@2.0.0: 1034 | resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} 1035 | engines: {node: '>=18'} 1036 | 1037 | merge2@1.4.1: 1038 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1039 | engines: {node: '>= 8'} 1040 | 1041 | micromatch@4.0.8: 1042 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 1043 | engines: {node: '>=8.6'} 1044 | 1045 | mime-db@1.54.0: 1046 | resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} 1047 | engines: {node: '>= 0.6'} 1048 | 1049 | mime-types@3.0.1: 1050 | resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} 1051 | engines: {node: '>= 0.6'} 1052 | 1053 | minimatch@3.1.2: 1054 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1055 | 1056 | minimatch@9.0.5: 1057 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 1058 | engines: {node: '>=16 || 14 >=14.17'} 1059 | 1060 | ms@2.1.3: 1061 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1062 | 1063 | natural-compare@1.4.0: 1064 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1065 | 1066 | negotiator@1.0.0: 1067 | resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} 1068 | engines: {node: '>= 0.6'} 1069 | 1070 | neostandard@0.12.1: 1071 | resolution: {integrity: sha512-As/LDK+xx591BLb1rPRaPs+JfXFgyNx5BoBui1KBeF/J4s0mW8+NBohrYnMfgm1w1t7E/Y/tU34MjMiP6lns6A==} 1072 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1073 | hasBin: true 1074 | peerDependencies: 1075 | eslint: ^9.0.0 1076 | 1077 | object-assign@4.1.1: 1078 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1079 | engines: {node: '>=0.10.0'} 1080 | 1081 | object-inspect@1.13.4: 1082 | resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} 1083 | engines: {node: '>= 0.4'} 1084 | 1085 | object-keys@1.1.1: 1086 | resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 1087 | engines: {node: '>= 0.4'} 1088 | 1089 | object.assign@4.1.7: 1090 | resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} 1091 | engines: {node: '>= 0.4'} 1092 | 1093 | object.entries@1.1.8: 1094 | resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} 1095 | engines: {node: '>= 0.4'} 1096 | 1097 | object.fromentries@2.0.8: 1098 | resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} 1099 | engines: {node: '>= 0.4'} 1100 | 1101 | object.values@1.2.1: 1102 | resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} 1103 | engines: {node: '>= 0.4'} 1104 | 1105 | on-finished@2.4.1: 1106 | resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} 1107 | engines: {node: '>= 0.8'} 1108 | 1109 | once@1.4.0: 1110 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1111 | 1112 | optionator@0.9.4: 1113 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 1114 | engines: {node: '>= 0.8.0'} 1115 | 1116 | own-keys@1.0.1: 1117 | resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} 1118 | engines: {node: '>= 0.4'} 1119 | 1120 | p-limit@3.1.0: 1121 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1122 | engines: {node: '>=10'} 1123 | 1124 | p-locate@5.0.0: 1125 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1126 | engines: {node: '>=10'} 1127 | 1128 | parent-module@1.0.1: 1129 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1130 | engines: {node: '>=6'} 1131 | 1132 | parseurl@1.3.3: 1133 | resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} 1134 | engines: {node: '>= 0.8'} 1135 | 1136 | path-exists@4.0.0: 1137 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1138 | engines: {node: '>=8'} 1139 | 1140 | path-key@3.1.1: 1141 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1142 | engines: {node: '>=8'} 1143 | 1144 | path-parse@1.0.7: 1145 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1146 | 1147 | path-to-regexp@8.2.0: 1148 | resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} 1149 | engines: {node: '>=16'} 1150 | 1151 | peowly@1.3.2: 1152 | resolution: {integrity: sha512-BYIrwr8JCXY49jUZscgw311w9oGEKo7ux/s+BxrhKTQbiQ0iYNdZNJ5LgagaeercQdFHwnR7Z5IxxFWVQ+BasQ==} 1153 | engines: {node: '>=18.6.0'} 1154 | 1155 | picomatch@2.3.1: 1156 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1157 | engines: {node: '>=8.6'} 1158 | 1159 | picomatch@4.0.2: 1160 | resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} 1161 | engines: {node: '>=12'} 1162 | 1163 | pkce-challenge@5.0.0: 1164 | resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} 1165 | engines: {node: '>=16.20.0'} 1166 | 1167 | possible-typed-array-names@1.1.0: 1168 | resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} 1169 | engines: {node: '>= 0.4'} 1170 | 1171 | prelude-ls@1.2.1: 1172 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1173 | engines: {node: '>= 0.8.0'} 1174 | 1175 | prop-types@15.8.1: 1176 | resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} 1177 | 1178 | proxy-addr@2.0.7: 1179 | resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} 1180 | engines: {node: '>= 0.10'} 1181 | 1182 | punycode@2.3.1: 1183 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1184 | engines: {node: '>=6'} 1185 | 1186 | qs@6.14.0: 1187 | resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} 1188 | engines: {node: '>=0.6'} 1189 | 1190 | queue-microtask@1.2.3: 1191 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1192 | 1193 | range-parser@1.2.1: 1194 | resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} 1195 | engines: {node: '>= 0.6'} 1196 | 1197 | raw-body@3.0.0: 1198 | resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} 1199 | engines: {node: '>= 0.8'} 1200 | 1201 | react-is@16.13.1: 1202 | resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} 1203 | 1204 | reflect.getprototypeof@1.0.10: 1205 | resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} 1206 | engines: {node: '>= 0.4'} 1207 | 1208 | regexp.prototype.flags@1.5.4: 1209 | resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} 1210 | engines: {node: '>= 0.4'} 1211 | 1212 | resolve-from@4.0.0: 1213 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1214 | engines: {node: '>=4'} 1215 | 1216 | resolve-pkg-maps@1.0.0: 1217 | resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 1218 | 1219 | resolve@1.22.10: 1220 | resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} 1221 | engines: {node: '>= 0.4'} 1222 | hasBin: true 1223 | 1224 | resolve@2.0.0-next.5: 1225 | resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} 1226 | hasBin: true 1227 | 1228 | reusify@1.0.4: 1229 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1230 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1231 | 1232 | router@2.2.0: 1233 | resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} 1234 | engines: {node: '>= 18'} 1235 | 1236 | run-parallel@1.2.0: 1237 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1238 | 1239 | safe-array-concat@1.1.3: 1240 | resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} 1241 | engines: {node: '>=0.4'} 1242 | 1243 | safe-buffer@5.2.1: 1244 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1245 | 1246 | safe-push-apply@1.0.0: 1247 | resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} 1248 | engines: {node: '>= 0.4'} 1249 | 1250 | safe-regex-test@1.1.0: 1251 | resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} 1252 | engines: {node: '>= 0.4'} 1253 | 1254 | safer-buffer@2.1.2: 1255 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 1256 | 1257 | semver@6.3.1: 1258 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1259 | hasBin: true 1260 | 1261 | semver@7.7.1: 1262 | resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} 1263 | engines: {node: '>=10'} 1264 | hasBin: true 1265 | 1266 | send@1.2.0: 1267 | resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} 1268 | engines: {node: '>= 18'} 1269 | 1270 | serve-static@2.2.0: 1271 | resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} 1272 | engines: {node: '>= 18'} 1273 | 1274 | set-function-length@1.2.2: 1275 | resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} 1276 | engines: {node: '>= 0.4'} 1277 | 1278 | set-function-name@2.0.2: 1279 | resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} 1280 | engines: {node: '>= 0.4'} 1281 | 1282 | set-proto@1.0.0: 1283 | resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} 1284 | engines: {node: '>= 0.4'} 1285 | 1286 | setprototypeof@1.2.0: 1287 | resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} 1288 | 1289 | shebang-command@2.0.0: 1290 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1291 | engines: {node: '>=8'} 1292 | 1293 | shebang-regex@3.0.0: 1294 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1295 | engines: {node: '>=8'} 1296 | 1297 | side-channel-list@1.0.0: 1298 | resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} 1299 | engines: {node: '>= 0.4'} 1300 | 1301 | side-channel-map@1.0.1: 1302 | resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} 1303 | engines: {node: '>= 0.4'} 1304 | 1305 | side-channel-weakmap@1.0.2: 1306 | resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} 1307 | engines: {node: '>= 0.4'} 1308 | 1309 | side-channel@1.1.0: 1310 | resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} 1311 | engines: {node: '>= 0.4'} 1312 | 1313 | stable-hash@0.0.4: 1314 | resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==} 1315 | 1316 | statuses@2.0.1: 1317 | resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} 1318 | engines: {node: '>= 0.8'} 1319 | 1320 | string.prototype.matchall@4.0.12: 1321 | resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} 1322 | engines: {node: '>= 0.4'} 1323 | 1324 | string.prototype.repeat@1.0.0: 1325 | resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} 1326 | 1327 | string.prototype.trim@1.2.10: 1328 | resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} 1329 | engines: {node: '>= 0.4'} 1330 | 1331 | string.prototype.trimend@1.0.9: 1332 | resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} 1333 | engines: {node: '>= 0.4'} 1334 | 1335 | string.prototype.trimstart@1.0.8: 1336 | resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} 1337 | engines: {node: '>= 0.4'} 1338 | 1339 | strip-json-comments@3.1.1: 1340 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1341 | engines: {node: '>=8'} 1342 | 1343 | supports-color@7.2.0: 1344 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1345 | engines: {node: '>=8'} 1346 | 1347 | supports-preserve-symlinks-flag@1.0.0: 1348 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1349 | engines: {node: '>= 0.4'} 1350 | 1351 | tapable@2.2.1: 1352 | resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} 1353 | engines: {node: '>=6'} 1354 | 1355 | tinyglobby@0.2.12: 1356 | resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} 1357 | engines: {node: '>=12.0.0'} 1358 | 1359 | to-regex-range@5.0.1: 1360 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1361 | engines: {node: '>=8.0'} 1362 | 1363 | toidentifier@1.0.1: 1364 | resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} 1365 | engines: {node: '>=0.6'} 1366 | 1367 | ts-api-utils@2.0.1: 1368 | resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} 1369 | engines: {node: '>=18.12'} 1370 | peerDependencies: 1371 | typescript: '>=4.8.4' 1372 | 1373 | tslib@2.8.1: 1374 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 1375 | 1376 | type-check@0.4.0: 1377 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1378 | engines: {node: '>= 0.8.0'} 1379 | 1380 | type-is@2.0.1: 1381 | resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} 1382 | engines: {node: '>= 0.6'} 1383 | 1384 | typed-array-buffer@1.0.3: 1385 | resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} 1386 | engines: {node: '>= 0.4'} 1387 | 1388 | typed-array-byte-length@1.0.3: 1389 | resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} 1390 | engines: {node: '>= 0.4'} 1391 | 1392 | typed-array-byte-offset@1.0.4: 1393 | resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} 1394 | engines: {node: '>= 0.4'} 1395 | 1396 | typed-array-length@1.0.7: 1397 | resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} 1398 | engines: {node: '>= 0.4'} 1399 | 1400 | typescript-eslint@8.24.1: 1401 | resolution: {integrity: sha512-cw3rEdzDqBs70TIcb0Gdzbt6h11BSs2pS0yaq7hDWDBtCCSei1pPSUXE9qUdQ/Wm9NgFg8mKtMt1b8fTHIl1jA==} 1402 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1403 | peerDependencies: 1404 | eslint: ^8.57.0 || ^9.0.0 1405 | typescript: '>=4.8.4 <5.8.0' 1406 | 1407 | typescript@5.8.3: 1408 | resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} 1409 | engines: {node: '>=14.17'} 1410 | hasBin: true 1411 | 1412 | unbox-primitive@1.1.0: 1413 | resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} 1414 | engines: {node: '>= 0.4'} 1415 | 1416 | unpipe@1.0.0: 1417 | resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} 1418 | engines: {node: '>= 0.8'} 1419 | 1420 | uri-js@4.4.1: 1421 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1422 | 1423 | vary@1.1.2: 1424 | resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} 1425 | engines: {node: '>= 0.8'} 1426 | 1427 | which-boxed-primitive@1.1.1: 1428 | resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} 1429 | engines: {node: '>= 0.4'} 1430 | 1431 | which-builtin-type@1.2.1: 1432 | resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} 1433 | engines: {node: '>= 0.4'} 1434 | 1435 | which-collection@1.0.2: 1436 | resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} 1437 | engines: {node: '>= 0.4'} 1438 | 1439 | which-typed-array@1.1.18: 1440 | resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} 1441 | engines: {node: '>= 0.4'} 1442 | 1443 | which@2.0.2: 1444 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1445 | engines: {node: '>= 8'} 1446 | hasBin: true 1447 | 1448 | word-wrap@1.2.5: 1449 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1450 | engines: {node: '>=0.10.0'} 1451 | 1452 | wrappy@1.0.2: 1453 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1454 | 1455 | yocto-queue@0.1.0: 1456 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1457 | engines: {node: '>=10'} 1458 | 1459 | zod-to-json-schema@3.24.5: 1460 | resolution: {integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==} 1461 | peerDependencies: 1462 | zod: ^3.24.1 1463 | 1464 | zod@3.24.4: 1465 | resolution: {integrity: sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==} 1466 | 1467 | snapshots: 1468 | 1469 | '@esbuild/aix-ppc64@0.25.4': 1470 | optional: true 1471 | 1472 | '@esbuild/android-arm64@0.25.4': 1473 | optional: true 1474 | 1475 | '@esbuild/android-arm@0.25.4': 1476 | optional: true 1477 | 1478 | '@esbuild/android-x64@0.25.4': 1479 | optional: true 1480 | 1481 | '@esbuild/darwin-arm64@0.25.4': 1482 | optional: true 1483 | 1484 | '@esbuild/darwin-x64@0.25.4': 1485 | optional: true 1486 | 1487 | '@esbuild/freebsd-arm64@0.25.4': 1488 | optional: true 1489 | 1490 | '@esbuild/freebsd-x64@0.25.4': 1491 | optional: true 1492 | 1493 | '@esbuild/linux-arm64@0.25.4': 1494 | optional: true 1495 | 1496 | '@esbuild/linux-arm@0.25.4': 1497 | optional: true 1498 | 1499 | '@esbuild/linux-ia32@0.25.4': 1500 | optional: true 1501 | 1502 | '@esbuild/linux-loong64@0.25.4': 1503 | optional: true 1504 | 1505 | '@esbuild/linux-mips64el@0.25.4': 1506 | optional: true 1507 | 1508 | '@esbuild/linux-ppc64@0.25.4': 1509 | optional: true 1510 | 1511 | '@esbuild/linux-riscv64@0.25.4': 1512 | optional: true 1513 | 1514 | '@esbuild/linux-s390x@0.25.4': 1515 | optional: true 1516 | 1517 | '@esbuild/linux-x64@0.25.4': 1518 | optional: true 1519 | 1520 | '@esbuild/netbsd-arm64@0.25.4': 1521 | optional: true 1522 | 1523 | '@esbuild/netbsd-x64@0.25.4': 1524 | optional: true 1525 | 1526 | '@esbuild/openbsd-arm64@0.25.4': 1527 | optional: true 1528 | 1529 | '@esbuild/openbsd-x64@0.25.4': 1530 | optional: true 1531 | 1532 | '@esbuild/sunos-x64@0.25.4': 1533 | optional: true 1534 | 1535 | '@esbuild/win32-arm64@0.25.4': 1536 | optional: true 1537 | 1538 | '@esbuild/win32-ia32@0.25.4': 1539 | optional: true 1540 | 1541 | '@esbuild/win32-x64@0.25.4': 1542 | optional: true 1543 | 1544 | '@eslint-community/eslint-utils@4.4.1(eslint@9.26.0)': 1545 | dependencies: 1546 | eslint: 9.26.0 1547 | eslint-visitor-keys: 3.4.3 1548 | 1549 | '@eslint-community/regexpp@4.12.1': {} 1550 | 1551 | '@eslint/config-array@0.20.0': 1552 | dependencies: 1553 | '@eslint/object-schema': 2.1.6 1554 | debug: 4.4.0 1555 | minimatch: 3.1.2 1556 | transitivePeerDependencies: 1557 | - supports-color 1558 | 1559 | '@eslint/config-helpers@0.2.1': {} 1560 | 1561 | '@eslint/core@0.13.0': 1562 | dependencies: 1563 | '@types/json-schema': 7.0.15 1564 | 1565 | '@eslint/eslintrc@3.3.1': 1566 | dependencies: 1567 | ajv: 6.12.6 1568 | debug: 4.4.0 1569 | espree: 10.3.0 1570 | globals: 14.0.0 1571 | ignore: 5.3.2 1572 | import-fresh: 3.3.1 1573 | js-yaml: 4.1.0 1574 | minimatch: 3.1.2 1575 | strip-json-comments: 3.1.1 1576 | transitivePeerDependencies: 1577 | - supports-color 1578 | 1579 | '@eslint/js@9.26.0': {} 1580 | 1581 | '@eslint/object-schema@2.1.6': {} 1582 | 1583 | '@eslint/plugin-kit@0.2.8': 1584 | dependencies: 1585 | '@eslint/core': 0.13.0 1586 | levn: 0.4.1 1587 | 1588 | '@humanfs/core@0.19.1': {} 1589 | 1590 | '@humanfs/node@0.16.6': 1591 | dependencies: 1592 | '@humanfs/core': 0.19.1 1593 | '@humanwhocodes/retry': 0.3.1 1594 | 1595 | '@humanwhocodes/gitignore-to-minimatch@1.0.2': {} 1596 | 1597 | '@humanwhocodes/module-importer@1.0.1': {} 1598 | 1599 | '@humanwhocodes/retry@0.3.1': {} 1600 | 1601 | '@humanwhocodes/retry@0.4.2': {} 1602 | 1603 | '@modelcontextprotocol/sdk@1.11.1': 1604 | dependencies: 1605 | content-type: 1.0.5 1606 | cors: 2.8.5 1607 | cross-spawn: 7.0.6 1608 | eventsource: 3.0.6 1609 | express: 5.1.0 1610 | express-rate-limit: 7.5.0(express@5.1.0) 1611 | pkce-challenge: 5.0.0 1612 | raw-body: 3.0.0 1613 | zod: 3.24.4 1614 | zod-to-json-schema: 3.24.5(zod@3.24.4) 1615 | transitivePeerDependencies: 1616 | - supports-color 1617 | 1618 | '@nodelib/fs.scandir@2.1.5': 1619 | dependencies: 1620 | '@nodelib/fs.stat': 2.0.5 1621 | run-parallel: 1.2.0 1622 | 1623 | '@nodelib/fs.stat@2.0.5': {} 1624 | 1625 | '@nodelib/fs.walk@1.2.8': 1626 | dependencies: 1627 | '@nodelib/fs.scandir': 2.1.5 1628 | fastq: 1.19.0 1629 | 1630 | '@nolyfill/is-core-module@1.0.39': {} 1631 | 1632 | '@stylistic/eslint-plugin@2.11.0(eslint@9.26.0)(typescript@5.8.3)': 1633 | dependencies: 1634 | '@typescript-eslint/utils': 8.24.1(eslint@9.26.0)(typescript@5.8.3) 1635 | eslint: 9.26.0 1636 | eslint-visitor-keys: 4.2.0 1637 | espree: 10.3.0 1638 | estraverse: 5.3.0 1639 | picomatch: 4.0.2 1640 | transitivePeerDependencies: 1641 | - supports-color 1642 | - typescript 1643 | 1644 | '@types/doctrine@0.0.9': {} 1645 | 1646 | '@types/estree@1.0.6': {} 1647 | 1648 | '@types/json-schema@7.0.15': {} 1649 | 1650 | '@types/tampermonkey@5.0.4': {} 1651 | 1652 | '@typescript-eslint/eslint-plugin@8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.26.0)(typescript@5.8.3))(eslint@9.26.0)(typescript@5.8.3)': 1653 | dependencies: 1654 | '@eslint-community/regexpp': 4.12.1 1655 | '@typescript-eslint/parser': 8.24.1(eslint@9.26.0)(typescript@5.8.3) 1656 | '@typescript-eslint/scope-manager': 8.24.1 1657 | '@typescript-eslint/type-utils': 8.24.1(eslint@9.26.0)(typescript@5.8.3) 1658 | '@typescript-eslint/utils': 8.24.1(eslint@9.26.0)(typescript@5.8.3) 1659 | '@typescript-eslint/visitor-keys': 8.24.1 1660 | eslint: 9.26.0 1661 | graphemer: 1.4.0 1662 | ignore: 5.3.2 1663 | natural-compare: 1.4.0 1664 | ts-api-utils: 2.0.1(typescript@5.8.3) 1665 | typescript: 5.8.3 1666 | transitivePeerDependencies: 1667 | - supports-color 1668 | 1669 | '@typescript-eslint/parser@8.24.1(eslint@9.26.0)(typescript@5.8.3)': 1670 | dependencies: 1671 | '@typescript-eslint/scope-manager': 8.24.1 1672 | '@typescript-eslint/types': 8.24.1 1673 | '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.8.3) 1674 | '@typescript-eslint/visitor-keys': 8.24.1 1675 | debug: 4.4.0 1676 | eslint: 9.26.0 1677 | typescript: 5.8.3 1678 | transitivePeerDependencies: 1679 | - supports-color 1680 | 1681 | '@typescript-eslint/scope-manager@8.24.1': 1682 | dependencies: 1683 | '@typescript-eslint/types': 8.24.1 1684 | '@typescript-eslint/visitor-keys': 8.24.1 1685 | 1686 | '@typescript-eslint/type-utils@8.24.1(eslint@9.26.0)(typescript@5.8.3)': 1687 | dependencies: 1688 | '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.8.3) 1689 | '@typescript-eslint/utils': 8.24.1(eslint@9.26.0)(typescript@5.8.3) 1690 | debug: 4.4.0 1691 | eslint: 9.26.0 1692 | ts-api-utils: 2.0.1(typescript@5.8.3) 1693 | typescript: 5.8.3 1694 | transitivePeerDependencies: 1695 | - supports-color 1696 | 1697 | '@typescript-eslint/types@8.24.1': {} 1698 | 1699 | '@typescript-eslint/typescript-estree@8.24.1(typescript@5.8.3)': 1700 | dependencies: 1701 | '@typescript-eslint/types': 8.24.1 1702 | '@typescript-eslint/visitor-keys': 8.24.1 1703 | debug: 4.4.0 1704 | fast-glob: 3.3.3 1705 | is-glob: 4.0.3 1706 | minimatch: 9.0.5 1707 | semver: 7.7.1 1708 | ts-api-utils: 2.0.1(typescript@5.8.3) 1709 | typescript: 5.8.3 1710 | transitivePeerDependencies: 1711 | - supports-color 1712 | 1713 | '@typescript-eslint/utils@8.24.1(eslint@9.26.0)(typescript@5.8.3)': 1714 | dependencies: 1715 | '@eslint-community/eslint-utils': 4.4.1(eslint@9.26.0) 1716 | '@typescript-eslint/scope-manager': 8.24.1 1717 | '@typescript-eslint/types': 8.24.1 1718 | '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.8.3) 1719 | eslint: 9.26.0 1720 | typescript: 5.8.3 1721 | transitivePeerDependencies: 1722 | - supports-color 1723 | 1724 | '@typescript-eslint/visitor-keys@8.24.1': 1725 | dependencies: 1726 | '@typescript-eslint/types': 8.24.1 1727 | eslint-visitor-keys: 4.2.0 1728 | 1729 | accepts@2.0.0: 1730 | dependencies: 1731 | mime-types: 3.0.1 1732 | negotiator: 1.0.0 1733 | 1734 | acorn-jsx@5.3.2(acorn@8.14.0): 1735 | dependencies: 1736 | acorn: 8.14.0 1737 | 1738 | acorn@8.14.0: {} 1739 | 1740 | ajv@6.12.6: 1741 | dependencies: 1742 | fast-deep-equal: 3.1.3 1743 | fast-json-stable-stringify: 2.1.0 1744 | json-schema-traverse: 0.4.1 1745 | uri-js: 4.4.1 1746 | 1747 | ansi-styles@4.3.0: 1748 | dependencies: 1749 | color-convert: 2.0.1 1750 | 1751 | argparse@2.0.1: {} 1752 | 1753 | array-buffer-byte-length@1.0.2: 1754 | dependencies: 1755 | call-bound: 1.0.3 1756 | is-array-buffer: 3.0.5 1757 | 1758 | array-includes@3.1.8: 1759 | dependencies: 1760 | call-bind: 1.0.8 1761 | define-properties: 1.2.1 1762 | es-abstract: 1.23.9 1763 | es-object-atoms: 1.1.1 1764 | get-intrinsic: 1.2.7 1765 | is-string: 1.1.1 1766 | 1767 | array.prototype.findlast@1.2.5: 1768 | dependencies: 1769 | call-bind: 1.0.8 1770 | define-properties: 1.2.1 1771 | es-abstract: 1.23.9 1772 | es-errors: 1.3.0 1773 | es-object-atoms: 1.1.1 1774 | es-shim-unscopables: 1.1.0 1775 | 1776 | array.prototype.flat@1.3.3: 1777 | dependencies: 1778 | call-bind: 1.0.8 1779 | define-properties: 1.2.1 1780 | es-abstract: 1.23.9 1781 | es-shim-unscopables: 1.1.0 1782 | 1783 | array.prototype.flatmap@1.3.3: 1784 | dependencies: 1785 | call-bind: 1.0.8 1786 | define-properties: 1.2.1 1787 | es-abstract: 1.23.9 1788 | es-shim-unscopables: 1.1.0 1789 | 1790 | array.prototype.tosorted@1.1.4: 1791 | dependencies: 1792 | call-bind: 1.0.8 1793 | define-properties: 1.2.1 1794 | es-abstract: 1.23.9 1795 | es-errors: 1.3.0 1796 | es-shim-unscopables: 1.1.0 1797 | 1798 | arraybuffer.prototype.slice@1.0.4: 1799 | dependencies: 1800 | array-buffer-byte-length: 1.0.2 1801 | call-bind: 1.0.8 1802 | define-properties: 1.2.1 1803 | es-abstract: 1.23.9 1804 | es-errors: 1.3.0 1805 | get-intrinsic: 1.2.7 1806 | is-array-buffer: 3.0.5 1807 | 1808 | async-function@1.0.0: {} 1809 | 1810 | available-typed-arrays@1.0.7: 1811 | dependencies: 1812 | possible-typed-array-names: 1.1.0 1813 | 1814 | balanced-match@1.0.2: {} 1815 | 1816 | body-parser@2.2.0: 1817 | dependencies: 1818 | bytes: 3.1.2 1819 | content-type: 1.0.5 1820 | debug: 4.4.0 1821 | http-errors: 2.0.0 1822 | iconv-lite: 0.6.3 1823 | on-finished: 2.4.1 1824 | qs: 6.14.0 1825 | raw-body: 3.0.0 1826 | type-is: 2.0.1 1827 | transitivePeerDependencies: 1828 | - supports-color 1829 | 1830 | brace-expansion@1.1.11: 1831 | dependencies: 1832 | balanced-match: 1.0.2 1833 | concat-map: 0.0.1 1834 | 1835 | brace-expansion@2.0.1: 1836 | dependencies: 1837 | balanced-match: 1.0.2 1838 | 1839 | braces@3.0.3: 1840 | dependencies: 1841 | fill-range: 7.1.1 1842 | 1843 | bytes@3.1.2: {} 1844 | 1845 | call-bind-apply-helpers@1.0.2: 1846 | dependencies: 1847 | es-errors: 1.3.0 1848 | function-bind: 1.1.2 1849 | 1850 | call-bind@1.0.8: 1851 | dependencies: 1852 | call-bind-apply-helpers: 1.0.2 1853 | es-define-property: 1.0.1 1854 | get-intrinsic: 1.2.7 1855 | set-function-length: 1.2.2 1856 | 1857 | call-bound@1.0.3: 1858 | dependencies: 1859 | call-bind-apply-helpers: 1.0.2 1860 | get-intrinsic: 1.2.7 1861 | 1862 | callsites@3.1.0: {} 1863 | 1864 | chalk@4.1.2: 1865 | dependencies: 1866 | ansi-styles: 4.3.0 1867 | supports-color: 7.2.0 1868 | 1869 | color-convert@2.0.1: 1870 | dependencies: 1871 | color-name: 1.1.4 1872 | 1873 | color-name@1.1.4: {} 1874 | 1875 | concat-map@0.0.1: {} 1876 | 1877 | content-disposition@1.0.0: 1878 | dependencies: 1879 | safe-buffer: 5.2.1 1880 | 1881 | content-type@1.0.5: {} 1882 | 1883 | cookie-signature@1.2.2: {} 1884 | 1885 | cookie@0.7.2: {} 1886 | 1887 | cors@2.8.5: 1888 | dependencies: 1889 | object-assign: 4.1.1 1890 | vary: 1.1.2 1891 | 1892 | cross-spawn@7.0.6: 1893 | dependencies: 1894 | path-key: 3.1.1 1895 | shebang-command: 2.0.0 1896 | which: 2.0.2 1897 | 1898 | data-view-buffer@1.0.2: 1899 | dependencies: 1900 | call-bound: 1.0.3 1901 | es-errors: 1.3.0 1902 | is-data-view: 1.0.2 1903 | 1904 | data-view-byte-length@1.0.2: 1905 | dependencies: 1906 | call-bound: 1.0.3 1907 | es-errors: 1.3.0 1908 | is-data-view: 1.0.2 1909 | 1910 | data-view-byte-offset@1.0.1: 1911 | dependencies: 1912 | call-bound: 1.0.3 1913 | es-errors: 1.3.0 1914 | is-data-view: 1.0.2 1915 | 1916 | debug@3.2.7: 1917 | dependencies: 1918 | ms: 2.1.3 1919 | 1920 | debug@4.4.0: 1921 | dependencies: 1922 | ms: 2.1.3 1923 | 1924 | deep-is@0.1.4: {} 1925 | 1926 | define-data-property@1.1.4: 1927 | dependencies: 1928 | es-define-property: 1.0.1 1929 | es-errors: 1.3.0 1930 | gopd: 1.2.0 1931 | 1932 | define-properties@1.2.1: 1933 | dependencies: 1934 | define-data-property: 1.1.4 1935 | has-property-descriptors: 1.0.2 1936 | object-keys: 1.1.1 1937 | 1938 | depd@2.0.0: {} 1939 | 1940 | doctrine@2.1.0: 1941 | dependencies: 1942 | esutils: 2.0.3 1943 | 1944 | doctrine@3.0.0: 1945 | dependencies: 1946 | esutils: 2.0.3 1947 | 1948 | dunder-proto@1.0.1: 1949 | dependencies: 1950 | call-bind-apply-helpers: 1.0.2 1951 | es-errors: 1.3.0 1952 | gopd: 1.2.0 1953 | 1954 | ee-first@1.1.1: {} 1955 | 1956 | encodeurl@2.0.0: {} 1957 | 1958 | enhanced-resolve@5.18.1: 1959 | dependencies: 1960 | graceful-fs: 4.2.11 1961 | tapable: 2.2.1 1962 | 1963 | es-abstract@1.23.9: 1964 | dependencies: 1965 | array-buffer-byte-length: 1.0.2 1966 | arraybuffer.prototype.slice: 1.0.4 1967 | available-typed-arrays: 1.0.7 1968 | call-bind: 1.0.8 1969 | call-bound: 1.0.3 1970 | data-view-buffer: 1.0.2 1971 | data-view-byte-length: 1.0.2 1972 | data-view-byte-offset: 1.0.1 1973 | es-define-property: 1.0.1 1974 | es-errors: 1.3.0 1975 | es-object-atoms: 1.1.1 1976 | es-set-tostringtag: 2.1.0 1977 | es-to-primitive: 1.3.0 1978 | function.prototype.name: 1.1.8 1979 | get-intrinsic: 1.2.7 1980 | get-proto: 1.0.1 1981 | get-symbol-description: 1.1.0 1982 | globalthis: 1.0.4 1983 | gopd: 1.2.0 1984 | has-property-descriptors: 1.0.2 1985 | has-proto: 1.2.0 1986 | has-symbols: 1.1.0 1987 | hasown: 2.0.2 1988 | internal-slot: 1.1.0 1989 | is-array-buffer: 3.0.5 1990 | is-callable: 1.2.7 1991 | is-data-view: 1.0.2 1992 | is-regex: 1.2.1 1993 | is-shared-array-buffer: 1.0.4 1994 | is-string: 1.1.1 1995 | is-typed-array: 1.1.15 1996 | is-weakref: 1.1.1 1997 | math-intrinsics: 1.1.0 1998 | object-inspect: 1.13.4 1999 | object-keys: 1.1.1 2000 | object.assign: 4.1.7 2001 | own-keys: 1.0.1 2002 | regexp.prototype.flags: 1.5.4 2003 | safe-array-concat: 1.1.3 2004 | safe-push-apply: 1.0.0 2005 | safe-regex-test: 1.1.0 2006 | set-proto: 1.0.0 2007 | string.prototype.trim: 1.2.10 2008 | string.prototype.trimend: 1.0.9 2009 | string.prototype.trimstart: 1.0.8 2010 | typed-array-buffer: 1.0.3 2011 | typed-array-byte-length: 1.0.3 2012 | typed-array-byte-offset: 1.0.4 2013 | typed-array-length: 1.0.7 2014 | unbox-primitive: 1.1.0 2015 | which-typed-array: 1.1.18 2016 | 2017 | es-define-property@1.0.1: {} 2018 | 2019 | es-errors@1.3.0: {} 2020 | 2021 | es-iterator-helpers@1.2.1: 2022 | dependencies: 2023 | call-bind: 1.0.8 2024 | call-bound: 1.0.3 2025 | define-properties: 1.2.1 2026 | es-abstract: 1.23.9 2027 | es-errors: 1.3.0 2028 | es-set-tostringtag: 2.1.0 2029 | function-bind: 1.1.2 2030 | get-intrinsic: 1.2.7 2031 | globalthis: 1.0.4 2032 | gopd: 1.2.0 2033 | has-property-descriptors: 1.0.2 2034 | has-proto: 1.2.0 2035 | has-symbols: 1.1.0 2036 | internal-slot: 1.1.0 2037 | iterator.prototype: 1.1.5 2038 | safe-array-concat: 1.1.3 2039 | 2040 | es-object-atoms@1.1.1: 2041 | dependencies: 2042 | es-errors: 1.3.0 2043 | 2044 | es-set-tostringtag@2.1.0: 2045 | dependencies: 2046 | es-errors: 1.3.0 2047 | get-intrinsic: 1.2.7 2048 | has-tostringtag: 1.0.2 2049 | hasown: 2.0.2 2050 | 2051 | es-shim-unscopables@1.1.0: 2052 | dependencies: 2053 | hasown: 2.0.2 2054 | 2055 | es-to-primitive@1.3.0: 2056 | dependencies: 2057 | is-callable: 1.2.7 2058 | is-date-object: 1.1.0 2059 | is-symbol: 1.1.1 2060 | 2061 | esbuild@0.25.4: 2062 | optionalDependencies: 2063 | '@esbuild/aix-ppc64': 0.25.4 2064 | '@esbuild/android-arm': 0.25.4 2065 | '@esbuild/android-arm64': 0.25.4 2066 | '@esbuild/android-x64': 0.25.4 2067 | '@esbuild/darwin-arm64': 0.25.4 2068 | '@esbuild/darwin-x64': 0.25.4 2069 | '@esbuild/freebsd-arm64': 0.25.4 2070 | '@esbuild/freebsd-x64': 0.25.4 2071 | '@esbuild/linux-arm': 0.25.4 2072 | '@esbuild/linux-arm64': 0.25.4 2073 | '@esbuild/linux-ia32': 0.25.4 2074 | '@esbuild/linux-loong64': 0.25.4 2075 | '@esbuild/linux-mips64el': 0.25.4 2076 | '@esbuild/linux-ppc64': 0.25.4 2077 | '@esbuild/linux-riscv64': 0.25.4 2078 | '@esbuild/linux-s390x': 0.25.4 2079 | '@esbuild/linux-x64': 0.25.4 2080 | '@esbuild/netbsd-arm64': 0.25.4 2081 | '@esbuild/netbsd-x64': 0.25.4 2082 | '@esbuild/openbsd-arm64': 0.25.4 2083 | '@esbuild/openbsd-x64': 0.25.4 2084 | '@esbuild/sunos-x64': 0.25.4 2085 | '@esbuild/win32-arm64': 0.25.4 2086 | '@esbuild/win32-ia32': 0.25.4 2087 | '@esbuild/win32-x64': 0.25.4 2088 | 2089 | escape-html@1.0.3: {} 2090 | 2091 | escape-string-regexp@4.0.0: {} 2092 | 2093 | eslint-compat-utils@0.5.1(eslint@9.26.0): 2094 | dependencies: 2095 | eslint: 9.26.0 2096 | semver: 7.7.1 2097 | 2098 | eslint-import-resolver-node@0.3.9: 2099 | dependencies: 2100 | debug: 3.2.7 2101 | is-core-module: 2.16.1 2102 | resolve: 1.22.10 2103 | transitivePeerDependencies: 2104 | - supports-color 2105 | 2106 | eslint-import-resolver-typescript@3.8.3(eslint-plugin-import-x@4.6.1(eslint@9.26.0)(typescript@5.8.3))(eslint@9.26.0): 2107 | dependencies: 2108 | '@nolyfill/is-core-module': 1.0.39 2109 | debug: 4.4.0 2110 | enhanced-resolve: 5.18.1 2111 | eslint: 9.26.0 2112 | get-tsconfig: 4.10.0 2113 | is-bun-module: 1.3.0 2114 | stable-hash: 0.0.4 2115 | tinyglobby: 0.2.12 2116 | optionalDependencies: 2117 | eslint-plugin-import-x: 4.6.1(eslint@9.26.0)(typescript@5.8.3) 2118 | transitivePeerDependencies: 2119 | - supports-color 2120 | 2121 | eslint-plugin-es-x@7.8.0(eslint@9.26.0): 2122 | dependencies: 2123 | '@eslint-community/eslint-utils': 4.4.1(eslint@9.26.0) 2124 | '@eslint-community/regexpp': 4.12.1 2125 | eslint: 9.26.0 2126 | eslint-compat-utils: 0.5.1(eslint@9.26.0) 2127 | 2128 | eslint-plugin-import-x@4.6.1(eslint@9.26.0)(typescript@5.8.3): 2129 | dependencies: 2130 | '@types/doctrine': 0.0.9 2131 | '@typescript-eslint/scope-manager': 8.24.1 2132 | '@typescript-eslint/utils': 8.24.1(eslint@9.26.0)(typescript@5.8.3) 2133 | debug: 4.4.0 2134 | doctrine: 3.0.0 2135 | enhanced-resolve: 5.18.1 2136 | eslint: 9.26.0 2137 | eslint-import-resolver-node: 0.3.9 2138 | get-tsconfig: 4.10.0 2139 | is-glob: 4.0.3 2140 | minimatch: 9.0.5 2141 | semver: 7.7.1 2142 | stable-hash: 0.0.4 2143 | tslib: 2.8.1 2144 | transitivePeerDependencies: 2145 | - supports-color 2146 | - typescript 2147 | 2148 | eslint-plugin-n@17.15.1(eslint@9.26.0): 2149 | dependencies: 2150 | '@eslint-community/eslint-utils': 4.4.1(eslint@9.26.0) 2151 | enhanced-resolve: 5.18.1 2152 | eslint: 9.26.0 2153 | eslint-plugin-es-x: 7.8.0(eslint@9.26.0) 2154 | get-tsconfig: 4.10.0 2155 | globals: 15.15.0 2156 | ignore: 5.3.2 2157 | minimatch: 9.0.5 2158 | semver: 7.7.1 2159 | 2160 | eslint-plugin-promise@7.2.1(eslint@9.26.0): 2161 | dependencies: 2162 | '@eslint-community/eslint-utils': 4.4.1(eslint@9.26.0) 2163 | eslint: 9.26.0 2164 | 2165 | eslint-plugin-react@7.37.4(eslint@9.26.0): 2166 | dependencies: 2167 | array-includes: 3.1.8 2168 | array.prototype.findlast: 1.2.5 2169 | array.prototype.flatmap: 1.3.3 2170 | array.prototype.tosorted: 1.1.4 2171 | doctrine: 2.1.0 2172 | es-iterator-helpers: 1.2.1 2173 | eslint: 9.26.0 2174 | estraverse: 5.3.0 2175 | hasown: 2.0.2 2176 | jsx-ast-utils: 3.3.5 2177 | minimatch: 3.1.2 2178 | object.entries: 1.1.8 2179 | object.fromentries: 2.0.8 2180 | object.values: 1.2.1 2181 | prop-types: 15.8.1 2182 | resolve: 2.0.0-next.5 2183 | semver: 6.3.1 2184 | string.prototype.matchall: 4.0.12 2185 | string.prototype.repeat: 1.0.0 2186 | 2187 | eslint-plugin-userscripts@0.5.6(eslint@9.26.0): 2188 | dependencies: 2189 | eslint: 9.26.0 2190 | semver: 7.7.1 2191 | 2192 | eslint-scope@8.3.0: 2193 | dependencies: 2194 | esrecurse: 4.3.0 2195 | estraverse: 5.3.0 2196 | 2197 | eslint-visitor-keys@3.4.3: {} 2198 | 2199 | eslint-visitor-keys@4.2.0: {} 2200 | 2201 | eslint@9.26.0: 2202 | dependencies: 2203 | '@eslint-community/eslint-utils': 4.4.1(eslint@9.26.0) 2204 | '@eslint-community/regexpp': 4.12.1 2205 | '@eslint/config-array': 0.20.0 2206 | '@eslint/config-helpers': 0.2.1 2207 | '@eslint/core': 0.13.0 2208 | '@eslint/eslintrc': 3.3.1 2209 | '@eslint/js': 9.26.0 2210 | '@eslint/plugin-kit': 0.2.8 2211 | '@humanfs/node': 0.16.6 2212 | '@humanwhocodes/module-importer': 1.0.1 2213 | '@humanwhocodes/retry': 0.4.2 2214 | '@modelcontextprotocol/sdk': 1.11.1 2215 | '@types/estree': 1.0.6 2216 | '@types/json-schema': 7.0.15 2217 | ajv: 6.12.6 2218 | chalk: 4.1.2 2219 | cross-spawn: 7.0.6 2220 | debug: 4.4.0 2221 | escape-string-regexp: 4.0.0 2222 | eslint-scope: 8.3.0 2223 | eslint-visitor-keys: 4.2.0 2224 | espree: 10.3.0 2225 | esquery: 1.6.0 2226 | esutils: 2.0.3 2227 | fast-deep-equal: 3.1.3 2228 | file-entry-cache: 8.0.0 2229 | find-up: 5.0.0 2230 | glob-parent: 6.0.2 2231 | ignore: 5.3.2 2232 | imurmurhash: 0.1.4 2233 | is-glob: 4.0.3 2234 | json-stable-stringify-without-jsonify: 1.0.1 2235 | lodash.merge: 4.6.2 2236 | minimatch: 3.1.2 2237 | natural-compare: 1.4.0 2238 | optionator: 0.9.4 2239 | zod: 3.24.4 2240 | transitivePeerDependencies: 2241 | - supports-color 2242 | 2243 | espree@10.3.0: 2244 | dependencies: 2245 | acorn: 8.14.0 2246 | acorn-jsx: 5.3.2(acorn@8.14.0) 2247 | eslint-visitor-keys: 4.2.0 2248 | 2249 | esquery@1.6.0: 2250 | dependencies: 2251 | estraverse: 5.3.0 2252 | 2253 | esrecurse@4.3.0: 2254 | dependencies: 2255 | estraverse: 5.3.0 2256 | 2257 | estraverse@5.3.0: {} 2258 | 2259 | esutils@2.0.3: {} 2260 | 2261 | etag@1.8.1: {} 2262 | 2263 | eventsource-parser@3.0.1: {} 2264 | 2265 | eventsource@3.0.6: 2266 | dependencies: 2267 | eventsource-parser: 3.0.1 2268 | 2269 | express-rate-limit@7.5.0(express@5.1.0): 2270 | dependencies: 2271 | express: 5.1.0 2272 | 2273 | express@5.1.0: 2274 | dependencies: 2275 | accepts: 2.0.0 2276 | body-parser: 2.2.0 2277 | content-disposition: 1.0.0 2278 | content-type: 1.0.5 2279 | cookie: 0.7.2 2280 | cookie-signature: 1.2.2 2281 | debug: 4.4.0 2282 | encodeurl: 2.0.0 2283 | escape-html: 1.0.3 2284 | etag: 1.8.1 2285 | finalhandler: 2.1.0 2286 | fresh: 2.0.0 2287 | http-errors: 2.0.0 2288 | merge-descriptors: 2.0.0 2289 | mime-types: 3.0.1 2290 | on-finished: 2.4.1 2291 | once: 1.4.0 2292 | parseurl: 1.3.3 2293 | proxy-addr: 2.0.7 2294 | qs: 6.14.0 2295 | range-parser: 1.2.1 2296 | router: 2.2.0 2297 | send: 1.2.0 2298 | serve-static: 2.2.0 2299 | statuses: 2.0.1 2300 | type-is: 2.0.1 2301 | vary: 1.1.2 2302 | transitivePeerDependencies: 2303 | - supports-color 2304 | 2305 | fast-deep-equal@3.1.3: {} 2306 | 2307 | fast-glob@3.3.3: 2308 | dependencies: 2309 | '@nodelib/fs.stat': 2.0.5 2310 | '@nodelib/fs.walk': 1.2.8 2311 | glob-parent: 5.1.2 2312 | merge2: 1.4.1 2313 | micromatch: 4.0.8 2314 | 2315 | fast-json-stable-stringify@2.1.0: {} 2316 | 2317 | fast-levenshtein@2.0.6: {} 2318 | 2319 | fastq@1.19.0: 2320 | dependencies: 2321 | reusify: 1.0.4 2322 | 2323 | fdir@6.4.3(picomatch@4.0.2): 2324 | optionalDependencies: 2325 | picomatch: 4.0.2 2326 | 2327 | file-entry-cache@8.0.0: 2328 | dependencies: 2329 | flat-cache: 4.0.1 2330 | 2331 | fill-range@7.1.1: 2332 | dependencies: 2333 | to-regex-range: 5.0.1 2334 | 2335 | finalhandler@2.1.0: 2336 | dependencies: 2337 | debug: 4.4.0 2338 | encodeurl: 2.0.0 2339 | escape-html: 1.0.3 2340 | on-finished: 2.4.1 2341 | parseurl: 1.3.3 2342 | statuses: 2.0.1 2343 | transitivePeerDependencies: 2344 | - supports-color 2345 | 2346 | find-up@5.0.0: 2347 | dependencies: 2348 | locate-path: 6.0.0 2349 | path-exists: 4.0.0 2350 | 2351 | flat-cache@4.0.1: 2352 | dependencies: 2353 | flatted: 3.3.3 2354 | keyv: 4.5.4 2355 | 2356 | flatted@3.3.3: {} 2357 | 2358 | for-each@0.3.5: 2359 | dependencies: 2360 | is-callable: 1.2.7 2361 | 2362 | forwarded@0.2.0: {} 2363 | 2364 | fresh@2.0.0: {} 2365 | 2366 | function-bind@1.1.2: {} 2367 | 2368 | function.prototype.name@1.1.8: 2369 | dependencies: 2370 | call-bind: 1.0.8 2371 | call-bound: 1.0.3 2372 | define-properties: 1.2.1 2373 | functions-have-names: 1.2.3 2374 | hasown: 2.0.2 2375 | is-callable: 1.2.7 2376 | 2377 | functions-have-names@1.2.3: {} 2378 | 2379 | get-intrinsic@1.2.7: 2380 | dependencies: 2381 | call-bind-apply-helpers: 1.0.2 2382 | es-define-property: 1.0.1 2383 | es-errors: 1.3.0 2384 | es-object-atoms: 1.1.1 2385 | function-bind: 1.1.2 2386 | get-proto: 1.0.1 2387 | gopd: 1.2.0 2388 | has-symbols: 1.1.0 2389 | hasown: 2.0.2 2390 | math-intrinsics: 1.1.0 2391 | 2392 | get-proto@1.0.1: 2393 | dependencies: 2394 | dunder-proto: 1.0.1 2395 | es-object-atoms: 1.1.1 2396 | 2397 | get-symbol-description@1.1.0: 2398 | dependencies: 2399 | call-bound: 1.0.3 2400 | es-errors: 1.3.0 2401 | get-intrinsic: 1.2.7 2402 | 2403 | get-tsconfig@4.10.0: 2404 | dependencies: 2405 | resolve-pkg-maps: 1.0.0 2406 | 2407 | glob-parent@5.1.2: 2408 | dependencies: 2409 | is-glob: 4.0.3 2410 | 2411 | glob-parent@6.0.2: 2412 | dependencies: 2413 | is-glob: 4.0.3 2414 | 2415 | globals@14.0.0: {} 2416 | 2417 | globals@15.15.0: {} 2418 | 2419 | globals@16.1.0: {} 2420 | 2421 | globalthis@1.0.4: 2422 | dependencies: 2423 | define-properties: 1.2.1 2424 | gopd: 1.2.0 2425 | 2426 | gopd@1.2.0: {} 2427 | 2428 | graceful-fs@4.2.11: {} 2429 | 2430 | graphemer@1.4.0: {} 2431 | 2432 | has-bigints@1.1.0: {} 2433 | 2434 | has-flag@4.0.0: {} 2435 | 2436 | has-property-descriptors@1.0.2: 2437 | dependencies: 2438 | es-define-property: 1.0.1 2439 | 2440 | has-proto@1.2.0: 2441 | dependencies: 2442 | dunder-proto: 1.0.1 2443 | 2444 | has-symbols@1.1.0: {} 2445 | 2446 | has-tostringtag@1.0.2: 2447 | dependencies: 2448 | has-symbols: 1.1.0 2449 | 2450 | hasown@2.0.2: 2451 | dependencies: 2452 | function-bind: 1.1.2 2453 | 2454 | http-errors@2.0.0: 2455 | dependencies: 2456 | depd: 2.0.0 2457 | inherits: 2.0.4 2458 | setprototypeof: 1.2.0 2459 | statuses: 2.0.1 2460 | toidentifier: 1.0.1 2461 | 2462 | iconv-lite@0.6.3: 2463 | dependencies: 2464 | safer-buffer: 2.1.2 2465 | 2466 | ignore@5.3.2: {} 2467 | 2468 | import-fresh@3.3.1: 2469 | dependencies: 2470 | parent-module: 1.0.1 2471 | resolve-from: 4.0.0 2472 | 2473 | imurmurhash@0.1.4: {} 2474 | 2475 | inherits@2.0.4: {} 2476 | 2477 | internal-slot@1.1.0: 2478 | dependencies: 2479 | es-errors: 1.3.0 2480 | hasown: 2.0.2 2481 | side-channel: 1.1.0 2482 | 2483 | ipaddr.js@1.9.1: {} 2484 | 2485 | is-array-buffer@3.0.5: 2486 | dependencies: 2487 | call-bind: 1.0.8 2488 | call-bound: 1.0.3 2489 | get-intrinsic: 1.2.7 2490 | 2491 | is-async-function@2.1.1: 2492 | dependencies: 2493 | async-function: 1.0.0 2494 | call-bound: 1.0.3 2495 | get-proto: 1.0.1 2496 | has-tostringtag: 1.0.2 2497 | safe-regex-test: 1.1.0 2498 | 2499 | is-bigint@1.1.0: 2500 | dependencies: 2501 | has-bigints: 1.1.0 2502 | 2503 | is-boolean-object@1.2.2: 2504 | dependencies: 2505 | call-bound: 1.0.3 2506 | has-tostringtag: 1.0.2 2507 | 2508 | is-bun-module@1.3.0: 2509 | dependencies: 2510 | semver: 7.7.1 2511 | 2512 | is-callable@1.2.7: {} 2513 | 2514 | is-core-module@2.16.1: 2515 | dependencies: 2516 | hasown: 2.0.2 2517 | 2518 | is-data-view@1.0.2: 2519 | dependencies: 2520 | call-bound: 1.0.3 2521 | get-intrinsic: 1.2.7 2522 | is-typed-array: 1.1.15 2523 | 2524 | is-date-object@1.1.0: 2525 | dependencies: 2526 | call-bound: 1.0.3 2527 | has-tostringtag: 1.0.2 2528 | 2529 | is-extglob@2.1.1: {} 2530 | 2531 | is-finalizationregistry@1.1.1: 2532 | dependencies: 2533 | call-bound: 1.0.3 2534 | 2535 | is-generator-function@1.1.0: 2536 | dependencies: 2537 | call-bound: 1.0.3 2538 | get-proto: 1.0.1 2539 | has-tostringtag: 1.0.2 2540 | safe-regex-test: 1.1.0 2541 | 2542 | is-glob@4.0.3: 2543 | dependencies: 2544 | is-extglob: 2.1.1 2545 | 2546 | is-map@2.0.3: {} 2547 | 2548 | is-number-object@1.1.1: 2549 | dependencies: 2550 | call-bound: 1.0.3 2551 | has-tostringtag: 1.0.2 2552 | 2553 | is-number@7.0.0: {} 2554 | 2555 | is-promise@4.0.0: {} 2556 | 2557 | is-regex@1.2.1: 2558 | dependencies: 2559 | call-bound: 1.0.3 2560 | gopd: 1.2.0 2561 | has-tostringtag: 1.0.2 2562 | hasown: 2.0.2 2563 | 2564 | is-set@2.0.3: {} 2565 | 2566 | is-shared-array-buffer@1.0.4: 2567 | dependencies: 2568 | call-bound: 1.0.3 2569 | 2570 | is-string@1.1.1: 2571 | dependencies: 2572 | call-bound: 1.0.3 2573 | has-tostringtag: 1.0.2 2574 | 2575 | is-symbol@1.1.1: 2576 | dependencies: 2577 | call-bound: 1.0.3 2578 | has-symbols: 1.1.0 2579 | safe-regex-test: 1.1.0 2580 | 2581 | is-typed-array@1.1.15: 2582 | dependencies: 2583 | which-typed-array: 1.1.18 2584 | 2585 | is-weakmap@2.0.2: {} 2586 | 2587 | is-weakref@1.1.1: 2588 | dependencies: 2589 | call-bound: 1.0.3 2590 | 2591 | is-weakset@2.0.4: 2592 | dependencies: 2593 | call-bound: 1.0.3 2594 | get-intrinsic: 1.2.7 2595 | 2596 | isarray@2.0.5: {} 2597 | 2598 | isexe@2.0.0: {} 2599 | 2600 | iterator.prototype@1.1.5: 2601 | dependencies: 2602 | define-data-property: 1.1.4 2603 | es-object-atoms: 1.1.1 2604 | get-intrinsic: 1.2.7 2605 | get-proto: 1.0.1 2606 | has-symbols: 1.1.0 2607 | set-function-name: 2.0.2 2608 | 2609 | js-tokens@4.0.0: {} 2610 | 2611 | js-yaml@4.1.0: 2612 | dependencies: 2613 | argparse: 2.0.1 2614 | 2615 | json-buffer@3.0.1: {} 2616 | 2617 | json-schema-traverse@0.4.1: {} 2618 | 2619 | json-stable-stringify-without-jsonify@1.0.1: {} 2620 | 2621 | jsx-ast-utils@3.3.5: 2622 | dependencies: 2623 | array-includes: 3.1.8 2624 | array.prototype.flat: 1.3.3 2625 | object.assign: 4.1.7 2626 | object.values: 1.2.1 2627 | 2628 | keyv@4.5.4: 2629 | dependencies: 2630 | json-buffer: 3.0.1 2631 | 2632 | levn@0.4.1: 2633 | dependencies: 2634 | prelude-ls: 1.2.1 2635 | type-check: 0.4.0 2636 | 2637 | locate-path@6.0.0: 2638 | dependencies: 2639 | p-locate: 5.0.0 2640 | 2641 | lodash.merge@4.6.2: {} 2642 | 2643 | loose-envify@1.4.0: 2644 | dependencies: 2645 | js-tokens: 4.0.0 2646 | 2647 | math-intrinsics@1.1.0: {} 2648 | 2649 | media-typer@1.1.0: {} 2650 | 2651 | merge-descriptors@2.0.0: {} 2652 | 2653 | merge2@1.4.1: {} 2654 | 2655 | micromatch@4.0.8: 2656 | dependencies: 2657 | braces: 3.0.3 2658 | picomatch: 2.3.1 2659 | 2660 | mime-db@1.54.0: {} 2661 | 2662 | mime-types@3.0.1: 2663 | dependencies: 2664 | mime-db: 1.54.0 2665 | 2666 | minimatch@3.1.2: 2667 | dependencies: 2668 | brace-expansion: 1.1.11 2669 | 2670 | minimatch@9.0.5: 2671 | dependencies: 2672 | brace-expansion: 2.0.1 2673 | 2674 | ms@2.1.3: {} 2675 | 2676 | natural-compare@1.4.0: {} 2677 | 2678 | negotiator@1.0.0: {} 2679 | 2680 | neostandard@0.12.1(eslint@9.26.0)(typescript@5.8.3): 2681 | dependencies: 2682 | '@humanwhocodes/gitignore-to-minimatch': 1.0.2 2683 | '@stylistic/eslint-plugin': 2.11.0(eslint@9.26.0)(typescript@5.8.3) 2684 | eslint: 9.26.0 2685 | eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import-x@4.6.1(eslint@9.26.0)(typescript@5.8.3))(eslint@9.26.0) 2686 | eslint-plugin-import-x: 4.6.1(eslint@9.26.0)(typescript@5.8.3) 2687 | eslint-plugin-n: 17.15.1(eslint@9.26.0) 2688 | eslint-plugin-promise: 7.2.1(eslint@9.26.0) 2689 | eslint-plugin-react: 7.37.4(eslint@9.26.0) 2690 | find-up: 5.0.0 2691 | globals: 15.15.0 2692 | peowly: 1.3.2 2693 | typescript-eslint: 8.24.1(eslint@9.26.0)(typescript@5.8.3) 2694 | transitivePeerDependencies: 2695 | - eslint-plugin-import 2696 | - supports-color 2697 | - typescript 2698 | 2699 | object-assign@4.1.1: {} 2700 | 2701 | object-inspect@1.13.4: {} 2702 | 2703 | object-keys@1.1.1: {} 2704 | 2705 | object.assign@4.1.7: 2706 | dependencies: 2707 | call-bind: 1.0.8 2708 | call-bound: 1.0.3 2709 | define-properties: 1.2.1 2710 | es-object-atoms: 1.1.1 2711 | has-symbols: 1.1.0 2712 | object-keys: 1.1.1 2713 | 2714 | object.entries@1.1.8: 2715 | dependencies: 2716 | call-bind: 1.0.8 2717 | define-properties: 1.2.1 2718 | es-object-atoms: 1.1.1 2719 | 2720 | object.fromentries@2.0.8: 2721 | dependencies: 2722 | call-bind: 1.0.8 2723 | define-properties: 1.2.1 2724 | es-abstract: 1.23.9 2725 | es-object-atoms: 1.1.1 2726 | 2727 | object.values@1.2.1: 2728 | dependencies: 2729 | call-bind: 1.0.8 2730 | call-bound: 1.0.3 2731 | define-properties: 1.2.1 2732 | es-object-atoms: 1.1.1 2733 | 2734 | on-finished@2.4.1: 2735 | dependencies: 2736 | ee-first: 1.1.1 2737 | 2738 | once@1.4.0: 2739 | dependencies: 2740 | wrappy: 1.0.2 2741 | 2742 | optionator@0.9.4: 2743 | dependencies: 2744 | deep-is: 0.1.4 2745 | fast-levenshtein: 2.0.6 2746 | levn: 0.4.1 2747 | prelude-ls: 1.2.1 2748 | type-check: 0.4.0 2749 | word-wrap: 1.2.5 2750 | 2751 | own-keys@1.0.1: 2752 | dependencies: 2753 | get-intrinsic: 1.2.7 2754 | object-keys: 1.1.1 2755 | safe-push-apply: 1.0.0 2756 | 2757 | p-limit@3.1.0: 2758 | dependencies: 2759 | yocto-queue: 0.1.0 2760 | 2761 | p-locate@5.0.0: 2762 | dependencies: 2763 | p-limit: 3.1.0 2764 | 2765 | parent-module@1.0.1: 2766 | dependencies: 2767 | callsites: 3.1.0 2768 | 2769 | parseurl@1.3.3: {} 2770 | 2771 | path-exists@4.0.0: {} 2772 | 2773 | path-key@3.1.1: {} 2774 | 2775 | path-parse@1.0.7: {} 2776 | 2777 | path-to-regexp@8.2.0: {} 2778 | 2779 | peowly@1.3.2: {} 2780 | 2781 | picomatch@2.3.1: {} 2782 | 2783 | picomatch@4.0.2: {} 2784 | 2785 | pkce-challenge@5.0.0: {} 2786 | 2787 | possible-typed-array-names@1.1.0: {} 2788 | 2789 | prelude-ls@1.2.1: {} 2790 | 2791 | prop-types@15.8.1: 2792 | dependencies: 2793 | loose-envify: 1.4.0 2794 | object-assign: 4.1.1 2795 | react-is: 16.13.1 2796 | 2797 | proxy-addr@2.0.7: 2798 | dependencies: 2799 | forwarded: 0.2.0 2800 | ipaddr.js: 1.9.1 2801 | 2802 | punycode@2.3.1: {} 2803 | 2804 | qs@6.14.0: 2805 | dependencies: 2806 | side-channel: 1.1.0 2807 | 2808 | queue-microtask@1.2.3: {} 2809 | 2810 | range-parser@1.2.1: {} 2811 | 2812 | raw-body@3.0.0: 2813 | dependencies: 2814 | bytes: 3.1.2 2815 | http-errors: 2.0.0 2816 | iconv-lite: 0.6.3 2817 | unpipe: 1.0.0 2818 | 2819 | react-is@16.13.1: {} 2820 | 2821 | reflect.getprototypeof@1.0.10: 2822 | dependencies: 2823 | call-bind: 1.0.8 2824 | define-properties: 1.2.1 2825 | es-abstract: 1.23.9 2826 | es-errors: 1.3.0 2827 | es-object-atoms: 1.1.1 2828 | get-intrinsic: 1.2.7 2829 | get-proto: 1.0.1 2830 | which-builtin-type: 1.2.1 2831 | 2832 | regexp.prototype.flags@1.5.4: 2833 | dependencies: 2834 | call-bind: 1.0.8 2835 | define-properties: 1.2.1 2836 | es-errors: 1.3.0 2837 | get-proto: 1.0.1 2838 | gopd: 1.2.0 2839 | set-function-name: 2.0.2 2840 | 2841 | resolve-from@4.0.0: {} 2842 | 2843 | resolve-pkg-maps@1.0.0: {} 2844 | 2845 | resolve@1.22.10: 2846 | dependencies: 2847 | is-core-module: 2.16.1 2848 | path-parse: 1.0.7 2849 | supports-preserve-symlinks-flag: 1.0.0 2850 | 2851 | resolve@2.0.0-next.5: 2852 | dependencies: 2853 | is-core-module: 2.16.1 2854 | path-parse: 1.0.7 2855 | supports-preserve-symlinks-flag: 1.0.0 2856 | 2857 | reusify@1.0.4: {} 2858 | 2859 | router@2.2.0: 2860 | dependencies: 2861 | debug: 4.4.0 2862 | depd: 2.0.0 2863 | is-promise: 4.0.0 2864 | parseurl: 1.3.3 2865 | path-to-regexp: 8.2.0 2866 | transitivePeerDependencies: 2867 | - supports-color 2868 | 2869 | run-parallel@1.2.0: 2870 | dependencies: 2871 | queue-microtask: 1.2.3 2872 | 2873 | safe-array-concat@1.1.3: 2874 | dependencies: 2875 | call-bind: 1.0.8 2876 | call-bound: 1.0.3 2877 | get-intrinsic: 1.2.7 2878 | has-symbols: 1.1.0 2879 | isarray: 2.0.5 2880 | 2881 | safe-buffer@5.2.1: {} 2882 | 2883 | safe-push-apply@1.0.0: 2884 | dependencies: 2885 | es-errors: 1.3.0 2886 | isarray: 2.0.5 2887 | 2888 | safe-regex-test@1.1.0: 2889 | dependencies: 2890 | call-bound: 1.0.3 2891 | es-errors: 1.3.0 2892 | is-regex: 1.2.1 2893 | 2894 | safer-buffer@2.1.2: {} 2895 | 2896 | semver@6.3.1: {} 2897 | 2898 | semver@7.7.1: {} 2899 | 2900 | send@1.2.0: 2901 | dependencies: 2902 | debug: 4.4.0 2903 | encodeurl: 2.0.0 2904 | escape-html: 1.0.3 2905 | etag: 1.8.1 2906 | fresh: 2.0.0 2907 | http-errors: 2.0.0 2908 | mime-types: 3.0.1 2909 | ms: 2.1.3 2910 | on-finished: 2.4.1 2911 | range-parser: 1.2.1 2912 | statuses: 2.0.1 2913 | transitivePeerDependencies: 2914 | - supports-color 2915 | 2916 | serve-static@2.2.0: 2917 | dependencies: 2918 | encodeurl: 2.0.0 2919 | escape-html: 1.0.3 2920 | parseurl: 1.3.3 2921 | send: 1.2.0 2922 | transitivePeerDependencies: 2923 | - supports-color 2924 | 2925 | set-function-length@1.2.2: 2926 | dependencies: 2927 | define-data-property: 1.1.4 2928 | es-errors: 1.3.0 2929 | function-bind: 1.1.2 2930 | get-intrinsic: 1.2.7 2931 | gopd: 1.2.0 2932 | has-property-descriptors: 1.0.2 2933 | 2934 | set-function-name@2.0.2: 2935 | dependencies: 2936 | define-data-property: 1.1.4 2937 | es-errors: 1.3.0 2938 | functions-have-names: 1.2.3 2939 | has-property-descriptors: 1.0.2 2940 | 2941 | set-proto@1.0.0: 2942 | dependencies: 2943 | dunder-proto: 1.0.1 2944 | es-errors: 1.3.0 2945 | es-object-atoms: 1.1.1 2946 | 2947 | setprototypeof@1.2.0: {} 2948 | 2949 | shebang-command@2.0.0: 2950 | dependencies: 2951 | shebang-regex: 3.0.0 2952 | 2953 | shebang-regex@3.0.0: {} 2954 | 2955 | side-channel-list@1.0.0: 2956 | dependencies: 2957 | es-errors: 1.3.0 2958 | object-inspect: 1.13.4 2959 | 2960 | side-channel-map@1.0.1: 2961 | dependencies: 2962 | call-bound: 1.0.3 2963 | es-errors: 1.3.0 2964 | get-intrinsic: 1.2.7 2965 | object-inspect: 1.13.4 2966 | 2967 | side-channel-weakmap@1.0.2: 2968 | dependencies: 2969 | call-bound: 1.0.3 2970 | es-errors: 1.3.0 2971 | get-intrinsic: 1.2.7 2972 | object-inspect: 1.13.4 2973 | side-channel-map: 1.0.1 2974 | 2975 | side-channel@1.1.0: 2976 | dependencies: 2977 | es-errors: 1.3.0 2978 | object-inspect: 1.13.4 2979 | side-channel-list: 1.0.0 2980 | side-channel-map: 1.0.1 2981 | side-channel-weakmap: 1.0.2 2982 | 2983 | stable-hash@0.0.4: {} 2984 | 2985 | statuses@2.0.1: {} 2986 | 2987 | string.prototype.matchall@4.0.12: 2988 | dependencies: 2989 | call-bind: 1.0.8 2990 | call-bound: 1.0.3 2991 | define-properties: 1.2.1 2992 | es-abstract: 1.23.9 2993 | es-errors: 1.3.0 2994 | es-object-atoms: 1.1.1 2995 | get-intrinsic: 1.2.7 2996 | gopd: 1.2.0 2997 | has-symbols: 1.1.0 2998 | internal-slot: 1.1.0 2999 | regexp.prototype.flags: 1.5.4 3000 | set-function-name: 2.0.2 3001 | side-channel: 1.1.0 3002 | 3003 | string.prototype.repeat@1.0.0: 3004 | dependencies: 3005 | define-properties: 1.2.1 3006 | es-abstract: 1.23.9 3007 | 3008 | string.prototype.trim@1.2.10: 3009 | dependencies: 3010 | call-bind: 1.0.8 3011 | call-bound: 1.0.3 3012 | define-data-property: 1.1.4 3013 | define-properties: 1.2.1 3014 | es-abstract: 1.23.9 3015 | es-object-atoms: 1.1.1 3016 | has-property-descriptors: 1.0.2 3017 | 3018 | string.prototype.trimend@1.0.9: 3019 | dependencies: 3020 | call-bind: 1.0.8 3021 | call-bound: 1.0.3 3022 | define-properties: 1.2.1 3023 | es-object-atoms: 1.1.1 3024 | 3025 | string.prototype.trimstart@1.0.8: 3026 | dependencies: 3027 | call-bind: 1.0.8 3028 | define-properties: 1.2.1 3029 | es-object-atoms: 1.1.1 3030 | 3031 | strip-json-comments@3.1.1: {} 3032 | 3033 | supports-color@7.2.0: 3034 | dependencies: 3035 | has-flag: 4.0.0 3036 | 3037 | supports-preserve-symlinks-flag@1.0.0: {} 3038 | 3039 | tapable@2.2.1: {} 3040 | 3041 | tinyglobby@0.2.12: 3042 | dependencies: 3043 | fdir: 6.4.3(picomatch@4.0.2) 3044 | picomatch: 4.0.2 3045 | 3046 | to-regex-range@5.0.1: 3047 | dependencies: 3048 | is-number: 7.0.0 3049 | 3050 | toidentifier@1.0.1: {} 3051 | 3052 | ts-api-utils@2.0.1(typescript@5.8.3): 3053 | dependencies: 3054 | typescript: 5.8.3 3055 | 3056 | tslib@2.8.1: {} 3057 | 3058 | type-check@0.4.0: 3059 | dependencies: 3060 | prelude-ls: 1.2.1 3061 | 3062 | type-is@2.0.1: 3063 | dependencies: 3064 | content-type: 1.0.5 3065 | media-typer: 1.1.0 3066 | mime-types: 3.0.1 3067 | 3068 | typed-array-buffer@1.0.3: 3069 | dependencies: 3070 | call-bound: 1.0.3 3071 | es-errors: 1.3.0 3072 | is-typed-array: 1.1.15 3073 | 3074 | typed-array-byte-length@1.0.3: 3075 | dependencies: 3076 | call-bind: 1.0.8 3077 | for-each: 0.3.5 3078 | gopd: 1.2.0 3079 | has-proto: 1.2.0 3080 | is-typed-array: 1.1.15 3081 | 3082 | typed-array-byte-offset@1.0.4: 3083 | dependencies: 3084 | available-typed-arrays: 1.0.7 3085 | call-bind: 1.0.8 3086 | for-each: 0.3.5 3087 | gopd: 1.2.0 3088 | has-proto: 1.2.0 3089 | is-typed-array: 1.1.15 3090 | reflect.getprototypeof: 1.0.10 3091 | 3092 | typed-array-length@1.0.7: 3093 | dependencies: 3094 | call-bind: 1.0.8 3095 | for-each: 0.3.5 3096 | gopd: 1.2.0 3097 | is-typed-array: 1.1.15 3098 | possible-typed-array-names: 1.1.0 3099 | reflect.getprototypeof: 1.0.10 3100 | 3101 | typescript-eslint@8.24.1(eslint@9.26.0)(typescript@5.8.3): 3102 | dependencies: 3103 | '@typescript-eslint/eslint-plugin': 8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.26.0)(typescript@5.8.3))(eslint@9.26.0)(typescript@5.8.3) 3104 | '@typescript-eslint/parser': 8.24.1(eslint@9.26.0)(typescript@5.8.3) 3105 | '@typescript-eslint/utils': 8.24.1(eslint@9.26.0)(typescript@5.8.3) 3106 | eslint: 9.26.0 3107 | typescript: 5.8.3 3108 | transitivePeerDependencies: 3109 | - supports-color 3110 | 3111 | typescript@5.8.3: {} 3112 | 3113 | unbox-primitive@1.1.0: 3114 | dependencies: 3115 | call-bound: 1.0.3 3116 | has-bigints: 1.1.0 3117 | has-symbols: 1.1.0 3118 | which-boxed-primitive: 1.1.1 3119 | 3120 | unpipe@1.0.0: {} 3121 | 3122 | uri-js@4.4.1: 3123 | dependencies: 3124 | punycode: 2.3.1 3125 | 3126 | vary@1.1.2: {} 3127 | 3128 | which-boxed-primitive@1.1.1: 3129 | dependencies: 3130 | is-bigint: 1.1.0 3131 | is-boolean-object: 1.2.2 3132 | is-number-object: 1.1.1 3133 | is-string: 1.1.1 3134 | is-symbol: 1.1.1 3135 | 3136 | which-builtin-type@1.2.1: 3137 | dependencies: 3138 | call-bound: 1.0.3 3139 | function.prototype.name: 1.1.8 3140 | has-tostringtag: 1.0.2 3141 | is-async-function: 2.1.1 3142 | is-date-object: 1.1.0 3143 | is-finalizationregistry: 1.1.1 3144 | is-generator-function: 1.1.0 3145 | is-regex: 1.2.1 3146 | is-weakref: 1.1.1 3147 | isarray: 2.0.5 3148 | which-boxed-primitive: 1.1.1 3149 | which-collection: 1.0.2 3150 | which-typed-array: 1.1.18 3151 | 3152 | which-collection@1.0.2: 3153 | dependencies: 3154 | is-map: 2.0.3 3155 | is-set: 2.0.3 3156 | is-weakmap: 2.0.2 3157 | is-weakset: 2.0.4 3158 | 3159 | which-typed-array@1.1.18: 3160 | dependencies: 3161 | available-typed-arrays: 1.0.7 3162 | call-bind: 1.0.8 3163 | call-bound: 1.0.3 3164 | for-each: 0.3.5 3165 | gopd: 1.2.0 3166 | has-tostringtag: 1.0.2 3167 | 3168 | which@2.0.2: 3169 | dependencies: 3170 | isexe: 2.0.0 3171 | 3172 | word-wrap@1.2.5: {} 3173 | 3174 | wrappy@1.0.2: {} 3175 | 3176 | yocto-queue@0.1.0: {} 3177 | 3178 | zod-to-json-schema@3.24.5(zod@3.24.4): 3179 | dependencies: 3180 | zod: 3.24.4 3181 | 3182 | zod@3.24.4: {} 3183 | -------------------------------------------------------------------------------- /src/DOM.ts: -------------------------------------------------------------------------------- 1 | export const globalStyles = ` 2 | .bubble:not(.has-advertisement) .advertisement, 3 | .bubble.has-advertisement .bubble-content *:not(.advertisement), 4 | .bubble.has-advertisement .reply-markup { 5 | display: none; 6 | } 7 | .advertisement { 8 | padding: 0.5rem 1rem; 9 | cursor: pointer; 10 | white-space: nowrap; 11 | font-style: italic; 12 | font-size: var(--messages-text-size); 13 | font-weight: var(--font-weight-bold); 14 | color: var(--link-color); 15 | } 16 | #telegram-ad-filter-settings { 17 | display: inline-flex; 18 | justify-content: center; 19 | width: 24px; 20 | font-size: 24px; 21 | color: transparent; 22 | text-shadow: 0 0 var(--secondary-text-color); 23 | } 24 | `; 25 | 26 | export const frameStyle = ` 27 | inset: 115px auto auto 130px; 28 | border: 1px solid rgb(0, 0, 0); 29 | height: 300px; 30 | margin: 0px; 31 | max-height: 95%; 32 | max-width: 95%; 33 | opacity: 1; 34 | overflow: auto; 35 | padding: 0px; 36 | position: fixed; 37 | width: 75%; 38 | z-index: 9999; 39 | display: block; 40 | `; 41 | 42 | export const popupStyle = ` 43 | #telegram-ad-filter { 44 | background: #181818; 45 | color: #ffffff; 46 | } 47 | #telegram-ad-filter textarea { 48 | resize: vertical; 49 | width: 100%; 50 | min-height: 150px; 51 | } 52 | #telegram-ad-filter .reset, #telegram-ad-filter .reset a, #telegram-ad-filter_buttons_holder { 53 | color: inherit; 54 | } 55 | `; 56 | 57 | export function addSettingsButton(element: HTMLElement, callback: Function): void { 58 | const settingsButton = document.createElement("button"); 59 | settingsButton.classList.add("btn-icon", "rp"); 60 | settingsButton.setAttribute("title", "Telegram Ad Filter Settings"); 61 | 62 | const ripple = document.createElement("div"); 63 | ripple.classList.add("c-ripple"); 64 | const icon = document.createElement("span"); 65 | icon.id = "telegram-ad-filter-settings"; 66 | icon.textContent = "⚙️"; 67 | settingsButton.append(ripple); 68 | settingsButton.append(icon); 69 | 70 | settingsButton.addEventListener("click", (event) => { 71 | event.stopPropagation(); 72 | callback(); 73 | }); 74 | 75 | element.append(settingsButton); 76 | } 77 | 78 | export function handleMessageNode(node: HTMLElement, adWords: string[]): void { 79 | const message = node.querySelector(".message"); 80 | if (!message || node.querySelector(".advertisement")) { return; } 81 | 82 | const textContent = message.textContent?.toLowerCase(); 83 | const links = [...message.querySelectorAll("a")].reduce((acc: string[], { href }) => { 84 | if (href) { acc.push(href.toLowerCase()); } 85 | return acc; 86 | }, []); 87 | if (!textContent && !links.length) { return; } 88 | 89 | const filters = adWords.map((filter) => filter.toLowerCase()); 90 | const hasMatch = filters.some((filter) => 91 | textContent?.includes(filter) || links.some((href) => href.includes(filter)) 92 | ); 93 | if (!hasMatch) { return; } 94 | 95 | const trigger = document.createElement("div"); 96 | trigger.classList.add("advertisement"); 97 | trigger.textContent = "Hidden by filter"; 98 | node.querySelector(".bubble-content")?.prepend(trigger); 99 | 100 | node.classList.add("has-advertisement"); 101 | trigger.addEventListener("click", () => { node.classList.remove("has-advertisement"); }); 102 | message.addEventListener("click", () => { node.classList.add("has-advertisement"); }); 103 | } 104 | -------------------------------------------------------------------------------- /src/bump.cjs: -------------------------------------------------------------------------------- 1 | const { join } = require("node:path"); 2 | const { readFile, writeFile } = require("node:fs/promises"); 3 | const { execSync } = require("node:child_process"); 4 | 5 | const root = join(__dirname, ".."); 6 | const files = [join(root, "tg-ad-filter.user.js"), join(root, "src/meta.txt")]; 7 | 8 | async function updateFiles() { 9 | try { 10 | for (const filepath of files) { 11 | const contents = await readFile(filepath, "utf8"); 12 | const updatedContents = contents.replace(/\b\d+\.\d+\.\d+\b/g, process.env.npm_package_version); 13 | await writeFile(filepath, updatedContents, "utf8"); 14 | } 15 | 16 | execSync(`git add ${files.join(" ")}`).toString(); 17 | } catch (error) { 18 | console.error("Error:", error); 19 | } 20 | } 21 | 22 | updateFiles(); 23 | -------------------------------------------------------------------------------- /src/configs.ts: -------------------------------------------------------------------------------- 1 | import { frameStyle, popupStyle } from "./DOM"; 2 | 3 | export const settingsConfig: InitOptions<"textarea"> = { 4 | id: "telegram-ad-filter", 5 | frameStyle, 6 | css: popupStyle, 7 | title: "Telegram Ad Filter Settings", 8 | fields: { 9 | listUrls: { 10 | label: "Blacklist URLs (one per line) – each URL must be a publicly accessible JSON file containing an array of blocked words or phrases", 11 | type: "textarea", 12 | default: "https://raw.githubusercontent.com/VChet/telegram-ad-filter/master/blacklist.json" 13 | } 14 | } 15 | }; 16 | -------------------------------------------------------------------------------- /src/fetch.ts: -------------------------------------------------------------------------------- 1 | function isValidURL(payload: unknown): payload is URL { 2 | try { 3 | if (typeof payload !== "string") { return false; } 4 | const parsedUrl = new URL(payload); 5 | return parsedUrl.protocol === "http:" || parsedUrl.protocol === "https:"; 6 | } catch { 7 | return false; 8 | } 9 | } 10 | 11 | function isValidJSON(payload: string): boolean { 12 | try { 13 | JSON.parse(payload); 14 | return true; 15 | } catch { 16 | return false; 17 | } 18 | } 19 | 20 | async function fetchAndParseJSON(url: URL): Promise { 21 | const content = await fetch(url).then((response) => response.text()); 22 | if (!isValidJSON(content)) { throw new SyntaxError(`Invalid JSON: data from ${url}`); } 23 | return JSON.parse(content); 24 | } 25 | 26 | export async function fetchLists(urlsString: string): Promise { 27 | const urls = urlsString.split("\n").map((url: string) => url.trim()).filter(Boolean); 28 | const resultSet: Set = new Set(); 29 | 30 | for (const url of urls) { 31 | if (!isValidURL(url)) { 32 | throw new URIError(`Invalid URL: ${url}. Please ensure it leads to an online source like GitHub, Gist, Pastebin, etc.`); 33 | } 34 | 35 | try { 36 | let parsedData = await fetchAndParseJSON(url); 37 | if (!Array.isArray(parsedData)) { throw new TypeError(`Invalid array: data from ${url}`); } 38 | 39 | const strings: string[] = parsedData 40 | .filter((entry): entry is string => typeof entry === "string") 41 | .map((entry) => entry.trim()) 42 | .filter(Boolean); 43 | 44 | for (const string of strings) { resultSet.add(string); } 45 | } catch (error) { 46 | if (error instanceof SyntaxError) { throw error; } 47 | throw new Error(`Fetch error: ${url}. Please check the URL or your network connection.`); 48 | } 49 | } 50 | 51 | return [...resultSet]; 52 | } 53 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { addSettingsButton, globalStyles, handleMessageNode } from "./DOM"; 2 | import { settingsConfig } from "./configs"; 3 | import { fetchLists } from "./fetch"; 4 | 5 | (async() => { 6 | GM_addStyle(globalStyles); 7 | 8 | let adWords: string[] = []; 9 | const gmc = new GM_configStruct({ 10 | ...settingsConfig, 11 | events: { 12 | init: async function() { adWords = await fetchLists(this.get("listUrls").toString()); }, 13 | save: async function() { 14 | try { 15 | adWords = await fetchLists(this.get("listUrls").toString()); 16 | this.close(); 17 | } catch (error) { 18 | alert(error instanceof Error ? error.message : String(error)); 19 | } 20 | } 21 | } 22 | }); 23 | 24 | function walk(node: Node): void { 25 | if (!(node instanceof HTMLElement) || !node.nodeType) { return; } 26 | let child = null; 27 | let next = null; 28 | switch (node.nodeType) { 29 | case node.ELEMENT_NODE: 30 | case node.DOCUMENT_NODE: 31 | case node.DOCUMENT_FRAGMENT_NODE: 32 | if (node.matches(".chat-utils")) { addSettingsButton(node, () => { gmc.open(); }); } 33 | if (node.matches(".bubble")) { handleMessageNode(node, adWords); } 34 | child = node.firstChild; 35 | while (child) { 36 | next = child.nextSibling; 37 | walk(child); 38 | child = next; 39 | } 40 | break; 41 | case node.TEXT_NODE: 42 | default: 43 | break; 44 | } 45 | } 46 | 47 | function mutationHandler(mutationRecords: MutationRecord[]): void { 48 | for (const { type, addedNodes } of mutationRecords) { 49 | if (type === "childList" && typeof addedNodes === "object" && addedNodes.length) { 50 | for (const node of addedNodes) { walk(node); } 51 | } 52 | } 53 | } 54 | 55 | const observer = new MutationObserver(mutationHandler); 56 | observer.observe(document, { childList: true, subtree: true, attributeFilter: ["class"] }); 57 | })(); 58 | -------------------------------------------------------------------------------- /src/meta.txt: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name Telegram Ad Filter 3 | // @version 1.4.0 4 | // @description Collapses messages that contain words from the ad-word list 5 | // @license MIT 6 | // @author VChet 7 | // @icon https://web.telegram.org/favicon.ico 8 | // @namespace telegram-ad-filter 9 | // @match https://web.telegram.org/k/* 10 | // @require https://openuserjs.org/src/libs/sizzle/GM_config.js 11 | // @grant GM_addStyle 12 | // @grant GM_getValue 13 | // @grant GM_setValue 14 | // @homepage https://github.com/VChet/telegram-ad-filter 15 | // @homepageURL https://github.com/VChet/telegram-ad-filter 16 | // @supportURL https://github.com/VChet/telegram-ad-filter 17 | // @updateURL https://github.com/VChet/telegram-ad-filter/raw/master/tg-ad-filter.user.js 18 | // @downloadURL https://github.com/VChet/telegram-ad-filter/raw/master/tg-ad-filter.user.js 19 | // ==/UserScript== 20 | 21 | /* jshint esversion: 11 */ 22 | -------------------------------------------------------------------------------- /src/types/GM_config.ts: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2009+, GM_config Contributors (https://github.com/sizzlemctwizzle/GM_config) 3 | 4 | GM_config Collaborators/Contributors: 5 | Mike Medley 6 | Joe Simmons 7 | Izzy Soft 8 | Marti Martz 9 | Adam Thompson-Sharpe 10 | 11 | GM_config is distributed under the terms of the GNU Lesser General Public License. 12 | 13 | GM_config is free software: you can redistribute it and/or modify 14 | it under the terms of the GNU Lesser General Public License as published by 15 | the Free Software Foundation, either version 3 of the License, or 16 | (at your option) any later version. 17 | 18 | This program is distributed in the hope that it will be useful, 19 | but WITHOUT ANY WARRANTY; without even the implied warranty of 20 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 21 | GNU Lesser General Public License for more details. 22 | 23 | You should have received a copy of the GNU Lesser General Public License 24 | along with this program. If not, see . 25 | */ 26 | 27 | // Minimum TypeScript Version: 2.8 28 | 29 | type FieldValue = string | number | boolean; 30 | /** Valid types for Field `type` property */ 31 | type FieldTypes = 32 | | 'text' 33 | | 'textarea' 34 | | 'button' 35 | | 'radio' 36 | | 'select' 37 | | 'checkbox' 38 | | 'unsigned int' 39 | | 'unsigned integer' 40 | | 'int' 41 | | 'integer' 42 | | 'float' 43 | | 'number' 44 | | 'hidden'; 45 | 46 | /** Init options where no custom types are defined */ 47 | interface InitOptionsNoCustom { 48 | /** Used for this instance of GM_config */ 49 | id: string; 50 | /** Label the opened config window */ 51 | title?: string | HTMLElement; 52 | fields: Record; 53 | /** Optional styling to apply to the menu */ 54 | css?: string; 55 | /** Element to use for the config panel */ 56 | frame?: HTMLElement; 57 | /** Optional styling to apply to the frame */ 58 | frameStyle?: string; 59 | 60 | /** Handlers for different events */ 61 | events?: { 62 | init?: GM_configStruct['onInit']; 63 | open?: GM_configStruct['onOpen']; 64 | save?: GM_configStruct['onSave']; 65 | close?: GM_configStruct['onClose']; 66 | reset?: GM_configStruct['onReset']; 67 | }; 68 | } 69 | 70 | /** Init options where custom types are defined */ 71 | interface InitOptionsCustom extends Omit { 72 | fields: Record>; 73 | /** Custom fields */ 74 | types: { [type in CustomTypes]: CustomType }; 75 | } 76 | 77 | /** Init options where the types key is only required if custom types are used */ 78 | type InitOptions = InitOptionsNoCustom | InitOptionsCustom; 79 | 80 | interface Field { 81 | [key: string]: any; 82 | /** Display label for the field */ 83 | label?: string | HTMLElement; 84 | /** Type of input */ 85 | type: FieldTypes | CustomTypes; 86 | /** Text to show on hover */ 87 | title?: string; 88 | /** Default value for field */ 89 | default?: FieldValue; 90 | save?: boolean; 91 | } 92 | 93 | interface CustomType { 94 | default?: FieldValue | null; 95 | toNode?: GM_configField['toNode']; 96 | toValue?: GM_configField['toValue']; 97 | reset?: GM_configField['reset']; 98 | } 99 | 100 | /* GM_configStruct and related */ 101 | 102 | /** Initialize a GM_configStruct */ 103 | declare function GM_configInit( 104 | config: GM_configStruct, 105 | // tslint:disable-next-line:no-unnecessary-generics 106 | options: InitOptions, 107 | ): void; 108 | 109 | declare function GM_configDefaultValue(type: FieldTypes): FieldValue; 110 | 111 | /** Create multiple GM_config instances */ 112 | declare class GM_configStruct { 113 | constructor(options: InitOptions) 114 | 115 | /** Initialize GM_config */ 116 | // tslint:disable-next-line:no-unnecessary-generics 117 | init(options: InitOptions): void; 118 | 119 | /** Display the config panel */ 120 | open(): void; 121 | /** Close the config panel */ 122 | close(): void; 123 | 124 | /** Directly set the value of a field */ 125 | set(fieldId: string, value: FieldValue): void; 126 | /** 127 | * Get a config value 128 | * @param getLive If true, runs `field.toValue()` instead of just getting `field.value` 129 | */ 130 | get(fieldId: string, getLive?: boolean): FieldValue; 131 | /** Save the current values */ 132 | save(): void; 133 | 134 | read(store?: string): any; 135 | 136 | write(store?: string, obj?: any): any; 137 | 138 | /** 139 | * 140 | * @param args If only one arg is passed, argument is passed to `document.createTextNode`. 141 | * With any other amount, args[0] is passed to `document.createElement` and the second arg 142 | * has something to do with event listeners? 143 | * 144 | * @todo Improve types based on 145 | * 146 | */ 147 | create(...args: [string] | [string, any] | []): HTMLElement; 148 | 149 | center(): void; 150 | 151 | remove(el: HTMLElement): void; 152 | 153 | /* Computed */ 154 | 155 | /** Whether GreaseMonkey functions are present */ 156 | isGM: boolean; 157 | /** 158 | * Either calls `localStorage.setItem` or `GM_setValue`. 159 | * Shouldn't be directly called 160 | */ 161 | setValue(name: string, value: FieldValue): Promise | void; 162 | /** 163 | * Get a value. Shouldn't be directly called 164 | * 165 | * @param name The name of the value 166 | * @param def The default to return if the value is not defined. 167 | * Only for localStorage fallback 168 | */ 169 | getValue(name: string, def: FieldValue): FieldValue; 170 | 171 | /** Converts a JSON object to a string */ 172 | stringify(obj: any): string; 173 | /** 174 | * Converts a string to a JSON object 175 | * @returns `undefined` if the string was an invalid object, 176 | * otherwise returns the parsed object 177 | */ 178 | parser(jsonString: string): any; 179 | 180 | /** Log a string with multiple fallbacks */ 181 | log(data: string): void; 182 | 183 | /* Created from GM_configInit */ 184 | id: string; 185 | title: string; 186 | css: { 187 | basic: string[]; 188 | basicPrefix: string; 189 | stylish: string; 190 | }; 191 | frame?: HTMLElement; 192 | fields: Record; 193 | onInit?: (this: GM_configStruct) => void; 194 | onOpen?: (this: GM_configStruct, document: Document, window: Window, frame: HTMLElement) => void; 195 | onSave?: (this: GM_configStruct, values: any) => void; 196 | onClose?: (this: GM_configStruct) => void; 197 | onReset?: (this: GM_configStruct) => void; 198 | isOpen: boolean; 199 | } 200 | 201 | /** Default GM_config object */ 202 | declare let GM_config: GM_configStruct; 203 | 204 | /* GM_configField and related */ 205 | 206 | declare class GM_configField { 207 | constructor( 208 | settings: Field, 209 | stored: FieldValue | undefined, 210 | id: string, 211 | customType: CustomType | undefined, 212 | configId: string, 213 | ) 214 | 215 | [key: string]: any; 216 | settings: Field; 217 | id: string; 218 | configId: string; 219 | node: HTMLElement | null; 220 | wrapper: HTMLElement | null; 221 | save: boolean; 222 | /** The stored value */ 223 | value: FieldValue; 224 | default: FieldValue; 225 | 226 | create: GM_configStruct['create']; 227 | 228 | toNode(this: GM_configField, configId?: string): HTMLElement; 229 | 230 | /** Get value from field */ 231 | toValue(this: GM_configField): FieldValue | null; 232 | 233 | reset(this: GM_configField): void; 234 | 235 | remove(el?: HTMLElement): void; 236 | 237 | reload(): void; 238 | 239 | _checkNumberRange(num: number, warn: string): true | null; 240 | } 241 | -------------------------------------------------------------------------------- /tg-ad-filter.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name Telegram Ad Filter 3 | // @version 1.4.0 4 | // @description Collapses messages that contain words from the ad-word list 5 | // @license MIT 6 | // @author VChet 7 | // @icon https://web.telegram.org/favicon.ico 8 | // @namespace telegram-ad-filter 9 | // @match https://web.telegram.org/k/* 10 | // @require https://openuserjs.org/src/libs/sizzle/GM_config.js 11 | // @grant GM_addStyle 12 | // @grant GM_getValue 13 | // @grant GM_setValue 14 | // @homepage https://github.com/VChet/telegram-ad-filter 15 | // @homepageURL https://github.com/VChet/telegram-ad-filter 16 | // @supportURL https://github.com/VChet/telegram-ad-filter 17 | // @updateURL https://github.com/VChet/telegram-ad-filter/raw/master/tg-ad-filter.user.js 18 | // @downloadURL https://github.com/VChet/telegram-ad-filter/raw/master/tg-ad-filter.user.js 19 | // ==/UserScript== 20 | 21 | /* jshint esversion: 11 */ 22 | 23 | 24 | // src/DOM.ts 25 | var globalStyles = ` 26 | .bubble:not(.has-advertisement) .advertisement, 27 | .bubble.has-advertisement .bubble-content *:not(.advertisement), 28 | .bubble.has-advertisement .reply-markup { 29 | display: none; 30 | } 31 | .advertisement { 32 | padding: 0.5rem 1rem; 33 | cursor: pointer; 34 | white-space: nowrap; 35 | font-style: italic; 36 | font-size: var(--messages-text-size); 37 | font-weight: var(--font-weight-bold); 38 | color: var(--link-color); 39 | } 40 | #telegram-ad-filter-settings { 41 | display: inline-flex; 42 | justify-content: center; 43 | width: 24px; 44 | font-size: 24px; 45 | color: transparent; 46 | text-shadow: 0 0 var(--secondary-text-color); 47 | } 48 | `; 49 | var frameStyle = ` 50 | inset: 115px auto auto 130px; 51 | border: 1px solid rgb(0, 0, 0); 52 | height: 300px; 53 | margin: 0px; 54 | max-height: 95%; 55 | max-width: 95%; 56 | opacity: 1; 57 | overflow: auto; 58 | padding: 0px; 59 | position: fixed; 60 | width: 75%; 61 | z-index: 9999; 62 | display: block; 63 | `; 64 | var popupStyle = ` 65 | #telegram-ad-filter { 66 | background: #181818; 67 | color: #ffffff; 68 | } 69 | #telegram-ad-filter textarea { 70 | resize: vertical; 71 | width: 100%; 72 | min-height: 150px; 73 | } 74 | #telegram-ad-filter .reset, #telegram-ad-filter .reset a, #telegram-ad-filter_buttons_holder { 75 | color: inherit; 76 | } 77 | `; 78 | function addSettingsButton(element, callback) { 79 | const settingsButton = document.createElement("button"); 80 | settingsButton.classList.add("btn-icon", "rp"); 81 | settingsButton.setAttribute("title", "Telegram Ad Filter Settings"); 82 | const ripple = document.createElement("div"); 83 | ripple.classList.add("c-ripple"); 84 | const icon = document.createElement("span"); 85 | icon.id = "telegram-ad-filter-settings"; 86 | icon.textContent = "\u2699\uFE0F"; 87 | settingsButton.append(ripple); 88 | settingsButton.append(icon); 89 | settingsButton.addEventListener("click", (event) => { 90 | event.stopPropagation(); 91 | callback(); 92 | }); 93 | element.append(settingsButton); 94 | } 95 | function handleMessageNode(node, adWords) { 96 | const message = node.querySelector(".message"); 97 | if (!message || node.querySelector(".advertisement")) { 98 | return; 99 | } 100 | const textContent = message.textContent?.toLowerCase(); 101 | const links = [...message.querySelectorAll("a")].reduce((acc, { href }) => { 102 | if (href) { 103 | acc.push(href.toLowerCase()); 104 | } 105 | return acc; 106 | }, []); 107 | if (!textContent && !links.length) { 108 | return; 109 | } 110 | const filters = adWords.map((filter) => filter.toLowerCase()); 111 | const hasMatch = filters.some( 112 | (filter) => textContent?.includes(filter) || links.some((href) => href.includes(filter)) 113 | ); 114 | if (!hasMatch) { 115 | return; 116 | } 117 | const trigger = document.createElement("div"); 118 | trigger.classList.add("advertisement"); 119 | trigger.textContent = "Hidden by filter"; 120 | node.querySelector(".bubble-content")?.prepend(trigger); 121 | node.classList.add("has-advertisement"); 122 | trigger.addEventListener("click", () => { 123 | node.classList.remove("has-advertisement"); 124 | }); 125 | message.addEventListener("click", () => { 126 | node.classList.add("has-advertisement"); 127 | }); 128 | } 129 | 130 | // src/configs.ts 131 | var settingsConfig = { 132 | id: "telegram-ad-filter", 133 | frameStyle, 134 | css: popupStyle, 135 | title: "Telegram Ad Filter Settings", 136 | fields: { 137 | listUrls: { 138 | label: "Blacklist URLs (one per line) \u2013 each URL must be a publicly accessible JSON file containing an array of blocked words or phrases", 139 | type: "textarea", 140 | default: "https://raw.githubusercontent.com/VChet/telegram-ad-filter/master/blacklist.json" 141 | } 142 | } 143 | }; 144 | 145 | // src/fetch.ts 146 | function isValidURL(payload) { 147 | try { 148 | if (typeof payload !== "string") { 149 | return false; 150 | } 151 | const parsedUrl = new URL(payload); 152 | return parsedUrl.protocol === "http:" || parsedUrl.protocol === "https:"; 153 | } catch { 154 | return false; 155 | } 156 | } 157 | function isValidJSON(payload) { 158 | try { 159 | JSON.parse(payload); 160 | return true; 161 | } catch { 162 | return false; 163 | } 164 | } 165 | async function fetchAndParseJSON(url) { 166 | const content = await fetch(url).then((response) => response.text()); 167 | if (!isValidJSON(content)) { 168 | throw new SyntaxError(`Invalid JSON: data from ${url}`); 169 | } 170 | return JSON.parse(content); 171 | } 172 | async function fetchLists(urlsString) { 173 | const urls = urlsString.split("\n").map((url) => url.trim()).filter(Boolean); 174 | const resultSet = /* @__PURE__ */ new Set(); 175 | for (const url of urls) { 176 | if (!isValidURL(url)) { 177 | throw new URIError(`Invalid URL: ${url}. Please ensure it leads to an online source like GitHub, Gist, Pastebin, etc.`); 178 | } 179 | try { 180 | let parsedData = await fetchAndParseJSON(url); 181 | if (!Array.isArray(parsedData)) { 182 | throw new TypeError(`Invalid array: data from ${url}`); 183 | } 184 | const strings = parsedData.filter((entry) => typeof entry === "string").map((entry) => entry.trim()).filter(Boolean); 185 | for (const string of strings) { 186 | resultSet.add(string); 187 | } 188 | } catch (error) { 189 | if (error instanceof SyntaxError) { 190 | throw error; 191 | } 192 | throw new Error(`Fetch error: ${url}. Please check the URL or your network connection.`); 193 | } 194 | } 195 | return [...resultSet]; 196 | } 197 | 198 | // src/main.ts 199 | (async () => { 200 | GM_addStyle(globalStyles); 201 | let adWords = []; 202 | const gmc = new GM_configStruct({ 203 | ...settingsConfig, 204 | events: { 205 | init: async function() { 206 | adWords = await fetchLists(this.get("listUrls").toString()); 207 | }, 208 | save: async function() { 209 | try { 210 | adWords = await fetchLists(this.get("listUrls").toString()); 211 | this.close(); 212 | } catch (error) { 213 | alert(error instanceof Error ? error.message : String(error)); 214 | } 215 | } 216 | } 217 | }); 218 | function walk(node) { 219 | if (!(node instanceof HTMLElement) || !node.nodeType) { 220 | return; 221 | } 222 | let child = null; 223 | let next = null; 224 | switch (node.nodeType) { 225 | case node.ELEMENT_NODE: 226 | case node.DOCUMENT_NODE: 227 | case node.DOCUMENT_FRAGMENT_NODE: 228 | if (node.matches(".chat-utils")) { 229 | addSettingsButton(node, () => { 230 | gmc.open(); 231 | }); 232 | } 233 | if (node.matches(".bubble")) { 234 | handleMessageNode(node, adWords); 235 | } 236 | child = node.firstChild; 237 | while (child) { 238 | next = child.nextSibling; 239 | walk(child); 240 | child = next; 241 | } 242 | break; 243 | case node.TEXT_NODE: 244 | default: 245 | break; 246 | } 247 | } 248 | function mutationHandler(mutationRecords) { 249 | for (const { type, addedNodes } of mutationRecords) { 250 | if (type === "childList" && typeof addedNodes === "object" && addedNodes.length) { 251 | for (const node of addedNodes) { 252 | walk(node); 253 | } 254 | } 255 | } 256 | } 257 | const observer = new MutationObserver(mutationHandler); 258 | observer.observe(document, { childList: true, subtree: true, attributeFilter: ["class"] }); 259 | })(); 260 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "module": "ESNext", 5 | "strict": true, 6 | "types": ["tampermonkey"] 7 | }, 8 | "include": ["src"] 9 | } 10 | -------------------------------------------------------------------------------- /watch.js: -------------------------------------------------------------------------------- 1 | import { context } from "esbuild"; 2 | import config from "./esbuild.config.js"; 3 | 4 | const ctx = await context(config); 5 | await ctx.watch(); 6 | --------------------------------------------------------------------------------