├── .gitignore ├── LICENSE ├── README.md ├── assets ├── 0.png ├── 1.png └── notes.md ├── dprint.json ├── memory-monitor ├── package.json ├── public │ └── icon.png ├── src │ └── background.ts ├── tsconfig.json └── vite.config.ts ├── package.json ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── system-monitor ├── options.html ├── package.json ├── popup.html ├── public │ └── icon.png ├── src │ ├── background.ts │ ├── icon.svg │ ├── options.tsx │ ├── popup.tsx │ ├── styled.tsx │ └── utils.ts ├── tsconfig.json └── vite.config.ts ├── tsconfig-base.json ├── tsconfig.json └── utils ├── package.json ├── src └── index.ts ├── tsconfig.json └── vite.config.ts /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | *.log 3 | dist/ 4 | *.tsbuildinfo 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 Rongjian Zhang 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # System Monitor 2 | 3 | [![Chrome Web Store](https://img.shields.io/chrome-web-store/v/ecmlflnkenbdjfocclindonmigndecla.svg)](https://chrome.google.com/webstore/detail/system-monitor/ecmlflnkenbdjfocclindonmigndecla) 4 | [![Users](https://img.shields.io/chrome-web-store/d/ecmlflnkenbdjfocclindonmigndecla.svg)](https://chrome.google.com/webstore/detail/system-monitor/ecmlflnkenbdjfocclindonmigndecla) 5 | [![Rating](https://img.shields.io/chrome-web-store/stars/ecmlflnkenbdjfocclindonmigndecla.svg)](https://chrome.google.com/webstore/detail/system-monitor/ecmlflnkenbdjfocclindonmigndecla) 6 | 7 | A browser extension to monitor system status like CPU and memory. 8 | 9 | 10 | 11 | 12 | ## Installation 13 | 14 | Install it from [Chrome Web Store](https://chrome.google.com/webstore/detail/system-monitor/ecmlflnkenbdjfocclindonmigndecla) 15 | 16 | ## License 17 | 18 | MIT 19 | -------------------------------------------------------------------------------- /assets/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pd4d10/system-monitor/1d339e6765d8b091c467a6a4d559e4efb6e9b2af/assets/0.png -------------------------------------------------------------------------------- /assets/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pd4d10/system-monitor/1d339e6765d8b091c467a6a4d559e4efb6e9b2af/assets/1.png -------------------------------------------------------------------------------- /assets/notes.md: -------------------------------------------------------------------------------- 1 | # Performance 2 | 3 | | Type | CPU(%) | GPU(%) | 4 | | ----------------- | ------ | ------ | 5 | | No transition | 1 | 0.5 | 6 | | Width | 8 | 3 | 7 | | Transform with px | 4 | 3 | 8 | | Transform with % | 7 | 3 | 9 | -------------------------------------------------------------------------------- /dprint.json: -------------------------------------------------------------------------------- 1 | { 2 | "typescript": { 3 | "quoteProps": "consistent" 4 | }, 5 | "json": { 6 | }, 7 | "markdown": { 8 | }, 9 | "malva": { 10 | }, 11 | "markup": { 12 | }, 13 | "excludes": [ 14 | "**/node_modules", 15 | "**/*-lock.json" 16 | ], 17 | "plugins": [ 18 | "https://plugins.dprint.dev/typescript-0.91.7.wasm", 19 | "https://plugins.dprint.dev/json-0.19.3.wasm", 20 | "https://plugins.dprint.dev/markdown-0.17.8.wasm", 21 | "https://plugins.dprint.dev/g-plane/malva-v0.10.1.wasm", 22 | "https://plugins.dprint.dev/g-plane/markup_fmt-v0.12.0.wasm" 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /memory-monitor/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "memory-monitor", 3 | "private": true, 4 | "type": "module", 5 | "version": "2.1.2", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build" 9 | }, 10 | "dependencies": { 11 | "@types/chrome": "^0.0.270", 12 | "utils": "workspace:*" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /memory-monitor/public/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pd4d10/system-monitor/1d339e6765d8b091c467a6a4d559e4efb6e9b2af/memory-monitor/public/icon.png -------------------------------------------------------------------------------- /memory-monitor/src/background.ts: -------------------------------------------------------------------------------- 1 | import { runOnceOnStartup, setActionIcon } from "utils"; 2 | 3 | const data = Array(19).fill(1); 4 | 5 | function draw() { 6 | chrome.system.memory.getInfo((info) => { 7 | data.push(info.availableCapacity / info.capacity); 8 | data.shift(); 9 | 10 | chrome.action.setTitle({ 11 | title: "Total: " + (info.capacity / 1073741824).toFixed(2) + " GiB\n" 12 | + "Available: " + (info.availableCapacity / 1073741824).toFixed(2) + " GiB", 13 | }); 14 | 15 | setActionIcon(data, { 16 | color: "#66cdaa", 17 | borderColor: "#008744", 18 | }); 19 | }); 20 | 21 | setTimeout(draw, 1000); 22 | } 23 | 24 | runOnceOnStartup(draw); 25 | -------------------------------------------------------------------------------- /memory-monitor/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig-base", 3 | "include": ["src"], 4 | "compilerOptions": { 5 | "rootDir": "src", 6 | "outDir": "dist" 7 | }, 8 | "references": [ 9 | { "path": "../utils" } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /memory-monitor/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { crx } from "@crxjs/vite-plugin"; 2 | import react from "@vitejs/plugin-react"; 3 | import { defineConfig } from "vite"; 4 | import { viteStaticCopy } from "vite-plugin-static-copy"; 5 | import { vitePlugin as workspace } from "vite-workspace"; 6 | import pkg from "./package.json"; 7 | 8 | export default defineConfig({ 9 | plugins: [ 10 | workspace(), 11 | react(), 12 | crx({ 13 | manifest: { 14 | manifest_version: 3, 15 | name: "Memory Monitor", 16 | version: pkg.version, 17 | description: "Monitor memory status at location bar", 18 | homepage_url: "https://github.com/pd4d10/system-monitor", 19 | offline_enabled: true, 20 | background: { 21 | service_worker: "src/background.ts", 22 | }, 23 | action: {}, 24 | permissions: ["system.memory"], 25 | icons: { 26 | "128": "icon.png", 27 | }, 28 | }, 29 | }), 30 | viteStaticCopy({ targets: [{ src: "../LICENSE", dest: "." }] }), 31 | ], 32 | }); 33 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "monorepo", 3 | "private": true, 4 | "scripts": { 5 | "build": "tsc --build && pnpm --filter '*' build", 6 | "package": "cd system-monitor && zip -r extension.zip ./dist && cd ../memory-monitor && zip -r extension.zip ./dist && cd .." 7 | }, 8 | "devDependencies": { 9 | "@crxjs/vite-plugin": "^1.0.14", 10 | "@vitejs/plugin-react": "^4.3.1", 11 | "typescript": "^5.5.4", 12 | "vite": "^5.4.2", 13 | "vite-plugin-static-copy": "^1.0.6", 14 | "vite-workspace": "^0.2.2" 15 | }, 16 | "packageManager": "pnpm@9.9.0+sha512.60c18acd138bff695d339be6ad13f7e936eea6745660d4cc4a776d5247c540d0edee1a563695c183a66eb917ef88f2b4feb1fc25f32a7adcadc7aaf3438e99c1" 17 | } 18 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | '@crxjs/vite-plugin': 12 | specifier: ^1.0.14 13 | version: 1.0.14(vite@5.4.2) 14 | '@vitejs/plugin-react': 15 | specifier: ^4.3.1 16 | version: 4.3.1(vite@5.4.2) 17 | typescript: 18 | specifier: ^5.5.4 19 | version: 5.5.4 20 | vite: 21 | specifier: ^5.4.2 22 | version: 5.4.2 23 | vite-plugin-static-copy: 24 | specifier: ^1.0.6 25 | version: 1.0.6(vite@5.4.2) 26 | vite-workspace: 27 | specifier: ^0.2.2 28 | version: 0.2.2(typescript@5.5.4)(vite@5.4.2) 29 | 30 | memory-monitor: 31 | dependencies: 32 | '@types/chrome': 33 | specifier: ^0.0.270 34 | version: 0.0.270 35 | utils: 36 | specifier: workspace:* 37 | version: link:../utils 38 | 39 | system-monitor: 40 | dependencies: 41 | '@types/chrome': 42 | specifier: ^0.0.270 43 | version: 0.0.270 44 | '@types/offscreencanvas': 45 | specifier: ^2019.6.4 46 | version: 2019.7.3 47 | '@types/react': 48 | specifier: ^18.3.5 49 | version: 18.3.5 50 | '@types/react-dom': 51 | specifier: ^18.3.0 52 | version: 18.3.0 53 | react: 54 | specifier: ^18.3.1 55 | version: 18.3.1 56 | react-dom: 57 | specifier: ^18.3.1 58 | version: 18.3.1(react@18.3.1) 59 | utils: 60 | specifier: workspace:* 61 | version: link:../utils 62 | 63 | utils: 64 | dependencies: 65 | '@types/chrome': 66 | specifier: ^0.0.270 67 | version: 0.0.270 68 | '@types/lodash-es': 69 | specifier: ^4.17.12 70 | version: 4.17.12 71 | lodash-es: 72 | specifier: ^4.17.21 73 | version: 4.17.21 74 | 75 | packages: 76 | 77 | '@ampproject/remapping@2.3.0': 78 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 79 | engines: {node: '>=6.0.0'} 80 | 81 | '@babel/code-frame@7.24.7': 82 | resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} 83 | engines: {node: '>=6.9.0'} 84 | 85 | '@babel/compat-data@7.25.4': 86 | resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} 87 | engines: {node: '>=6.9.0'} 88 | 89 | '@babel/core@7.25.2': 90 | resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} 91 | engines: {node: '>=6.9.0'} 92 | 93 | '@babel/generator@7.25.6': 94 | resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} 95 | engines: {node: '>=6.9.0'} 96 | 97 | '@babel/helper-compilation-targets@7.25.2': 98 | resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} 99 | engines: {node: '>=6.9.0'} 100 | 101 | '@babel/helper-module-imports@7.24.7': 102 | resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} 103 | engines: {node: '>=6.9.0'} 104 | 105 | '@babel/helper-module-transforms@7.25.2': 106 | resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} 107 | engines: {node: '>=6.9.0'} 108 | peerDependencies: 109 | '@babel/core': ^7.0.0 110 | 111 | '@babel/helper-plugin-utils@7.24.8': 112 | resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} 113 | engines: {node: '>=6.9.0'} 114 | 115 | '@babel/helper-simple-access@7.24.7': 116 | resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} 117 | engines: {node: '>=6.9.0'} 118 | 119 | '@babel/helper-string-parser@7.24.8': 120 | resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} 121 | engines: {node: '>=6.9.0'} 122 | 123 | '@babel/helper-validator-identifier@7.24.7': 124 | resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} 125 | engines: {node: '>=6.9.0'} 126 | 127 | '@babel/helper-validator-option@7.24.8': 128 | resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} 129 | engines: {node: '>=6.9.0'} 130 | 131 | '@babel/helpers@7.25.6': 132 | resolution: {integrity: sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==} 133 | engines: {node: '>=6.9.0'} 134 | 135 | '@babel/highlight@7.24.7': 136 | resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} 137 | engines: {node: '>=6.9.0'} 138 | 139 | '@babel/parser@7.25.6': 140 | resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} 141 | engines: {node: '>=6.0.0'} 142 | hasBin: true 143 | 144 | '@babel/plugin-transform-react-jsx-self@7.24.7': 145 | resolution: {integrity: sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==} 146 | engines: {node: '>=6.9.0'} 147 | peerDependencies: 148 | '@babel/core': ^7.0.0-0 149 | 150 | '@babel/plugin-transform-react-jsx-source@7.24.7': 151 | resolution: {integrity: sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==} 152 | engines: {node: '>=6.9.0'} 153 | peerDependencies: 154 | '@babel/core': ^7.0.0-0 155 | 156 | '@babel/template@7.25.0': 157 | resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} 158 | engines: {node: '>=6.9.0'} 159 | 160 | '@babel/traverse@7.25.6': 161 | resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} 162 | engines: {node: '>=6.9.0'} 163 | 164 | '@babel/types@7.25.6': 165 | resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} 166 | engines: {node: '>=6.9.0'} 167 | 168 | '@crxjs/vite-plugin@1.0.14': 169 | resolution: {integrity: sha512-emOueVCqFRFmpcfT80Xsm4mfuFw9VSp5GY4eh5qeLDeiP81g0hddlobVQCo0pE2ZvNnWbyhLrXEYAaMAXjNL6A==} 170 | engines: {node: '>=14'} 171 | peerDependencies: 172 | vite: ^2.9.0 173 | 174 | '@esbuild/aix-ppc64@0.21.5': 175 | resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} 176 | engines: {node: '>=12'} 177 | cpu: [ppc64] 178 | os: [aix] 179 | 180 | '@esbuild/android-arm64@0.21.5': 181 | resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} 182 | engines: {node: '>=12'} 183 | cpu: [arm64] 184 | os: [android] 185 | 186 | '@esbuild/android-arm@0.21.5': 187 | resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} 188 | engines: {node: '>=12'} 189 | cpu: [arm] 190 | os: [android] 191 | 192 | '@esbuild/android-x64@0.21.5': 193 | resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} 194 | engines: {node: '>=12'} 195 | cpu: [x64] 196 | os: [android] 197 | 198 | '@esbuild/darwin-arm64@0.21.5': 199 | resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} 200 | engines: {node: '>=12'} 201 | cpu: [arm64] 202 | os: [darwin] 203 | 204 | '@esbuild/darwin-x64@0.21.5': 205 | resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} 206 | engines: {node: '>=12'} 207 | cpu: [x64] 208 | os: [darwin] 209 | 210 | '@esbuild/freebsd-arm64@0.21.5': 211 | resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} 212 | engines: {node: '>=12'} 213 | cpu: [arm64] 214 | os: [freebsd] 215 | 216 | '@esbuild/freebsd-x64@0.21.5': 217 | resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} 218 | engines: {node: '>=12'} 219 | cpu: [x64] 220 | os: [freebsd] 221 | 222 | '@esbuild/linux-arm64@0.21.5': 223 | resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} 224 | engines: {node: '>=12'} 225 | cpu: [arm64] 226 | os: [linux] 227 | 228 | '@esbuild/linux-arm@0.21.5': 229 | resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} 230 | engines: {node: '>=12'} 231 | cpu: [arm] 232 | os: [linux] 233 | 234 | '@esbuild/linux-ia32@0.21.5': 235 | resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} 236 | engines: {node: '>=12'} 237 | cpu: [ia32] 238 | os: [linux] 239 | 240 | '@esbuild/linux-loong64@0.21.5': 241 | resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} 242 | engines: {node: '>=12'} 243 | cpu: [loong64] 244 | os: [linux] 245 | 246 | '@esbuild/linux-mips64el@0.21.5': 247 | resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} 248 | engines: {node: '>=12'} 249 | cpu: [mips64el] 250 | os: [linux] 251 | 252 | '@esbuild/linux-ppc64@0.21.5': 253 | resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} 254 | engines: {node: '>=12'} 255 | cpu: [ppc64] 256 | os: [linux] 257 | 258 | '@esbuild/linux-riscv64@0.21.5': 259 | resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} 260 | engines: {node: '>=12'} 261 | cpu: [riscv64] 262 | os: [linux] 263 | 264 | '@esbuild/linux-s390x@0.21.5': 265 | resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} 266 | engines: {node: '>=12'} 267 | cpu: [s390x] 268 | os: [linux] 269 | 270 | '@esbuild/linux-x64@0.21.5': 271 | resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} 272 | engines: {node: '>=12'} 273 | cpu: [x64] 274 | os: [linux] 275 | 276 | '@esbuild/netbsd-x64@0.21.5': 277 | resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} 278 | engines: {node: '>=12'} 279 | cpu: [x64] 280 | os: [netbsd] 281 | 282 | '@esbuild/openbsd-x64@0.21.5': 283 | resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} 284 | engines: {node: '>=12'} 285 | cpu: [x64] 286 | os: [openbsd] 287 | 288 | '@esbuild/sunos-x64@0.21.5': 289 | resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} 290 | engines: {node: '>=12'} 291 | cpu: [x64] 292 | os: [sunos] 293 | 294 | '@esbuild/win32-arm64@0.21.5': 295 | resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} 296 | engines: {node: '>=12'} 297 | cpu: [arm64] 298 | os: [win32] 299 | 300 | '@esbuild/win32-ia32@0.21.5': 301 | resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} 302 | engines: {node: '>=12'} 303 | cpu: [ia32] 304 | os: [win32] 305 | 306 | '@esbuild/win32-x64@0.21.5': 307 | resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} 308 | engines: {node: '>=12'} 309 | cpu: [x64] 310 | os: [win32] 311 | 312 | '@jridgewell/gen-mapping@0.3.5': 313 | resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} 314 | engines: {node: '>=6.0.0'} 315 | 316 | '@jridgewell/resolve-uri@3.1.2': 317 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 318 | engines: {node: '>=6.0.0'} 319 | 320 | '@jridgewell/set-array@1.2.1': 321 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 322 | engines: {node: '>=6.0.0'} 323 | 324 | '@jridgewell/sourcemap-codec@1.5.0': 325 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 326 | 327 | '@jridgewell/trace-mapping@0.3.25': 328 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 329 | 330 | '@nodelib/fs.scandir@2.1.5': 331 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 332 | engines: {node: '>= 8'} 333 | 334 | '@nodelib/fs.stat@2.0.5': 335 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 336 | engines: {node: '>= 8'} 337 | 338 | '@nodelib/fs.walk@1.2.8': 339 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 340 | engines: {node: '>= 8'} 341 | 342 | '@rollup/pluginutils@4.2.1': 343 | resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} 344 | engines: {node: '>= 8.0.0'} 345 | 346 | '@rollup/rollup-android-arm-eabi@4.21.2': 347 | resolution: {integrity: sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==} 348 | cpu: [arm] 349 | os: [android] 350 | 351 | '@rollup/rollup-android-arm64@4.21.2': 352 | resolution: {integrity: sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==} 353 | cpu: [arm64] 354 | os: [android] 355 | 356 | '@rollup/rollup-darwin-arm64@4.21.2': 357 | resolution: {integrity: sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==} 358 | cpu: [arm64] 359 | os: [darwin] 360 | 361 | '@rollup/rollup-darwin-x64@4.21.2': 362 | resolution: {integrity: sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==} 363 | cpu: [x64] 364 | os: [darwin] 365 | 366 | '@rollup/rollup-linux-arm-gnueabihf@4.21.2': 367 | resolution: {integrity: sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==} 368 | cpu: [arm] 369 | os: [linux] 370 | 371 | '@rollup/rollup-linux-arm-musleabihf@4.21.2': 372 | resolution: {integrity: sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==} 373 | cpu: [arm] 374 | os: [linux] 375 | 376 | '@rollup/rollup-linux-arm64-gnu@4.21.2': 377 | resolution: {integrity: sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==} 378 | cpu: [arm64] 379 | os: [linux] 380 | 381 | '@rollup/rollup-linux-arm64-musl@4.21.2': 382 | resolution: {integrity: sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==} 383 | cpu: [arm64] 384 | os: [linux] 385 | 386 | '@rollup/rollup-linux-powerpc64le-gnu@4.21.2': 387 | resolution: {integrity: sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==} 388 | cpu: [ppc64] 389 | os: [linux] 390 | 391 | '@rollup/rollup-linux-riscv64-gnu@4.21.2': 392 | resolution: {integrity: sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==} 393 | cpu: [riscv64] 394 | os: [linux] 395 | 396 | '@rollup/rollup-linux-s390x-gnu@4.21.2': 397 | resolution: {integrity: sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==} 398 | cpu: [s390x] 399 | os: [linux] 400 | 401 | '@rollup/rollup-linux-x64-gnu@4.21.2': 402 | resolution: {integrity: sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==} 403 | cpu: [x64] 404 | os: [linux] 405 | 406 | '@rollup/rollup-linux-x64-musl@4.21.2': 407 | resolution: {integrity: sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==} 408 | cpu: [x64] 409 | os: [linux] 410 | 411 | '@rollup/rollup-win32-arm64-msvc@4.21.2': 412 | resolution: {integrity: sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==} 413 | cpu: [arm64] 414 | os: [win32] 415 | 416 | '@rollup/rollup-win32-ia32-msvc@4.21.2': 417 | resolution: {integrity: sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==} 418 | cpu: [ia32] 419 | os: [win32] 420 | 421 | '@rollup/rollup-win32-x64-msvc@4.21.2': 422 | resolution: {integrity: sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==} 423 | cpu: [x64] 424 | os: [win32] 425 | 426 | '@types/babel__core@7.20.5': 427 | resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} 428 | 429 | '@types/babel__generator@7.6.8': 430 | resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} 431 | 432 | '@types/babel__template@7.4.4': 433 | resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 434 | 435 | '@types/babel__traverse@7.20.6': 436 | resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} 437 | 438 | '@types/chrome@0.0.270': 439 | resolution: {integrity: sha512-ADvkowV7YnJfycZZxL2brluZ6STGW+9oKG37B422UePf2PCXuFA/XdERI0T18wtuWPx0tmFeZqq6MOXVk1IC+Q==} 440 | 441 | '@types/estree@1.0.5': 442 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} 443 | 444 | '@types/filesystem@0.0.36': 445 | resolution: {integrity: sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA==} 446 | 447 | '@types/filewriter@0.0.33': 448 | resolution: {integrity: sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==} 449 | 450 | '@types/har-format@1.2.15': 451 | resolution: {integrity: sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA==} 452 | 453 | '@types/lodash-es@4.17.12': 454 | resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} 455 | 456 | '@types/lodash@4.17.7': 457 | resolution: {integrity: sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==} 458 | 459 | '@types/offscreencanvas@2019.7.3': 460 | resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} 461 | 462 | '@types/prop-types@15.7.12': 463 | resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} 464 | 465 | '@types/react-dom@18.3.0': 466 | resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} 467 | 468 | '@types/react@18.3.5': 469 | resolution: {integrity: sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==} 470 | 471 | '@vitejs/plugin-react@4.3.1': 472 | resolution: {integrity: sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==} 473 | engines: {node: ^14.18.0 || >=16.0.0} 474 | peerDependencies: 475 | vite: ^4.2.0 || ^5.0.0 476 | 477 | '@webcomponents/custom-elements@1.6.0': 478 | resolution: {integrity: sha512-CqTpxOlUCPWRNUPZDxT5v2NnHXA4oox612iUGnmTUGQFhZ1Gkj8kirtl/2wcF6MqX7+PqqicZzOCBKKfIn0dww==} 479 | 480 | acorn-walk@8.3.3: 481 | resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} 482 | engines: {node: '>=0.4.0'} 483 | 484 | acorn@8.12.1: 485 | resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} 486 | engines: {node: '>=0.4.0'} 487 | hasBin: true 488 | 489 | ansi-styles@3.2.1: 490 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 491 | engines: {node: '>=4'} 492 | 493 | anymatch@3.1.3: 494 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 495 | engines: {node: '>= 8'} 496 | 497 | binary-extensions@2.3.0: 498 | resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} 499 | engines: {node: '>=8'} 500 | 501 | boolbase@1.0.0: 502 | resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} 503 | 504 | braces@3.0.3: 505 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 506 | engines: {node: '>=8'} 507 | 508 | browserslist@4.23.3: 509 | resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} 510 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 511 | hasBin: true 512 | 513 | cac@6.7.14: 514 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 515 | engines: {node: '>=8'} 516 | 517 | caniuse-lite@1.0.30001655: 518 | resolution: {integrity: sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==} 519 | 520 | chalk@2.4.2: 521 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 522 | engines: {node: '>=4'} 523 | 524 | cheerio-select@2.1.0: 525 | resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} 526 | 527 | cheerio@1.0.0: 528 | resolution: {integrity: sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==} 529 | engines: {node: '>=18.17'} 530 | 531 | chokidar@3.6.0: 532 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 533 | engines: {node: '>= 8.10.0'} 534 | 535 | color-convert@1.9.3: 536 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 537 | 538 | color-name@1.1.3: 539 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 540 | 541 | connect-injector@0.4.4: 542 | resolution: {integrity: sha512-hdBG8nXop42y2gWCqOV8y1O3uVk4cIU+SoxLCPyCUKRImyPiScoNiSulpHjoktRU1BdI0UzoUdxUa87thrcmHw==} 543 | engines: {node: '>= 0.8.0'} 544 | 545 | convert-source-map@2.0.0: 546 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 547 | 548 | css-select@5.1.0: 549 | resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} 550 | 551 | css-what@6.1.0: 552 | resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} 553 | engines: {node: '>= 6'} 554 | 555 | csstype@3.1.3: 556 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 557 | 558 | debug@2.6.9: 559 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} 560 | peerDependencies: 561 | supports-color: '*' 562 | peerDependenciesMeta: 563 | supports-color: 564 | optional: true 565 | 566 | debug@4.3.6: 567 | resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} 568 | engines: {node: '>=6.0'} 569 | peerDependencies: 570 | supports-color: '*' 571 | peerDependenciesMeta: 572 | supports-color: 573 | optional: true 574 | 575 | dom-serializer@2.0.0: 576 | resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} 577 | 578 | domelementtype@2.3.0: 579 | resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} 580 | 581 | domhandler@5.0.3: 582 | resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} 583 | engines: {node: '>= 4'} 584 | 585 | domutils@3.1.0: 586 | resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} 587 | 588 | electron-to-chromium@1.5.13: 589 | resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==} 590 | 591 | encoding-sniffer@0.2.0: 592 | resolution: {integrity: sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==} 593 | 594 | entities@4.5.0: 595 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 596 | engines: {node: '>=0.12'} 597 | 598 | es-module-lexer@0.10.5: 599 | resolution: {integrity: sha512-+7IwY/kiGAacQfY+YBhKMvEmyAJnw5grTUgjG85Pe7vcUI/6b7pZjZG8nQ7+48YhzEAEqrEgD2dCz/JIK+AYvw==} 600 | 601 | esbuild@0.21.5: 602 | resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} 603 | engines: {node: '>=12'} 604 | hasBin: true 605 | 606 | escalade@3.2.0: 607 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 608 | engines: {node: '>=6'} 609 | 610 | escape-string-regexp@1.0.5: 611 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 612 | engines: {node: '>=0.8.0'} 613 | 614 | estree-walker@2.0.2: 615 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 616 | 617 | fast-glob@3.3.2: 618 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 619 | engines: {node: '>=8.6.0'} 620 | 621 | fastq@1.17.1: 622 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 623 | 624 | fill-range@7.1.1: 625 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 626 | engines: {node: '>=8'} 627 | 628 | find-up@6.3.0: 629 | resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} 630 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 631 | 632 | fs-extra@10.1.0: 633 | resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} 634 | engines: {node: '>=12'} 635 | 636 | fs-extra@11.2.0: 637 | resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} 638 | engines: {node: '>=14.14'} 639 | 640 | fsevents@2.3.3: 641 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 642 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 643 | os: [darwin] 644 | 645 | gensync@1.0.0-beta.2: 646 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 647 | engines: {node: '>=6.9.0'} 648 | 649 | glob-parent@5.1.2: 650 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 651 | engines: {node: '>= 6'} 652 | 653 | globals@11.12.0: 654 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 655 | engines: {node: '>=4'} 656 | 657 | globrex@0.1.2: 658 | resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} 659 | 660 | graceful-fs@4.2.11: 661 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 662 | 663 | has-flag@3.0.0: 664 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 665 | engines: {node: '>=4'} 666 | 667 | htmlparser2@9.1.0: 668 | resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==} 669 | 670 | iconv-lite@0.6.3: 671 | resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} 672 | engines: {node: '>=0.10.0'} 673 | 674 | is-binary-path@2.1.0: 675 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 676 | engines: {node: '>=8'} 677 | 678 | is-extglob@2.1.1: 679 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 680 | engines: {node: '>=0.10.0'} 681 | 682 | is-glob@4.0.3: 683 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 684 | engines: {node: '>=0.10.0'} 685 | 686 | is-number@7.0.0: 687 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 688 | engines: {node: '>=0.12.0'} 689 | 690 | js-tokens@4.0.0: 691 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 692 | 693 | jsesc@2.5.2: 694 | resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} 695 | engines: {node: '>=4'} 696 | hasBin: true 697 | 698 | jsesc@3.0.2: 699 | resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} 700 | engines: {node: '>=6'} 701 | hasBin: true 702 | 703 | json5@2.2.3: 704 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 705 | engines: {node: '>=6'} 706 | hasBin: true 707 | 708 | jsonfile@6.1.0: 709 | resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} 710 | 711 | locate-path@7.2.0: 712 | resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} 713 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 714 | 715 | lodash-es@4.17.21: 716 | resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} 717 | 718 | loose-envify@1.4.0: 719 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 720 | hasBin: true 721 | 722 | lru-cache@5.1.1: 723 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 724 | 725 | magic-string@0.26.7: 726 | resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==} 727 | engines: {node: '>=12'} 728 | 729 | merge2@1.4.1: 730 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 731 | engines: {node: '>= 8'} 732 | 733 | micromatch@4.0.8: 734 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 735 | engines: {node: '>=8.6'} 736 | 737 | ms@2.0.0: 738 | resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} 739 | 740 | ms@2.1.2: 741 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 742 | 743 | nanoid@3.3.7: 744 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 745 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 746 | hasBin: true 747 | 748 | node-releases@2.0.18: 749 | resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} 750 | 751 | normalize-path@3.0.0: 752 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 753 | engines: {node: '>=0.10.0'} 754 | 755 | nth-check@2.1.1: 756 | resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} 757 | 758 | p-limit@4.0.0: 759 | resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} 760 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 761 | 762 | p-locate@6.0.0: 763 | resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} 764 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 765 | 766 | parse5-htmlparser2-tree-adapter@7.0.0: 767 | resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} 768 | 769 | parse5-parser-stream@7.1.2: 770 | resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} 771 | 772 | parse5@7.1.2: 773 | resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} 774 | 775 | path-exists@5.0.0: 776 | resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} 777 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 778 | 779 | picocolors@1.0.1: 780 | resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} 781 | 782 | picomatch@2.3.1: 783 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 784 | engines: {node: '>=8.6'} 785 | 786 | postcss@8.4.42: 787 | resolution: {integrity: sha512-hywKUQB9Ra4dR1mGhldy5Aj1X3MWDSIA1cEi+Uy0CjheLvP6Ual5RlwMCh8i/X121yEDLDIKBsrCQ8ba3FDMfQ==} 788 | engines: {node: ^10 || ^12 || >=14} 789 | 790 | q@1.5.1: 791 | resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} 792 | engines: {node: '>=0.6.0', teleport: '>=0.2.0'} 793 | deprecated: |- 794 | You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. 795 | 796 | (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) 797 | 798 | queue-microtask@1.2.3: 799 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 800 | 801 | react-dom@18.3.1: 802 | resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} 803 | peerDependencies: 804 | react: ^18.3.1 805 | 806 | react-refresh@0.13.0: 807 | resolution: {integrity: sha512-XP8A9BT0CpRBD+NYLLeIhld/RqG9+gktUjW1FkE+Vm7OCinbG1SshcK5tb9ls4kzvjZr9mOQc7HYgBngEyPAXg==} 808 | engines: {node: '>=0.10.0'} 809 | 810 | react-refresh@0.14.2: 811 | resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} 812 | engines: {node: '>=0.10.0'} 813 | 814 | react@18.3.1: 815 | resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} 816 | engines: {node: '>=0.10.0'} 817 | 818 | readdirp@3.6.0: 819 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 820 | engines: {node: '>=8.10.0'} 821 | 822 | reusify@1.0.4: 823 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 824 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 825 | 826 | rollup@2.79.1: 827 | resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} 828 | engines: {node: '>=10.0.0'} 829 | hasBin: true 830 | 831 | rollup@4.21.2: 832 | resolution: {integrity: sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==} 833 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 834 | hasBin: true 835 | 836 | run-parallel@1.2.0: 837 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 838 | 839 | safer-buffer@2.1.2: 840 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 841 | 842 | scheduler@0.23.2: 843 | resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} 844 | 845 | semver@6.3.1: 846 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 847 | hasBin: true 848 | 849 | source-map-js@1.2.0: 850 | resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} 851 | engines: {node: '>=0.10.0'} 852 | 853 | sourcemap-codec@1.4.8: 854 | resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} 855 | deprecated: Please use @jridgewell/sourcemap-codec instead 856 | 857 | stream-buffers@0.2.6: 858 | resolution: {integrity: sha512-ZRpmWyuCdg0TtNKk8bEqvm13oQvXMmzXDsfD4cBgcx5LouborvU5pm3JMkdTP3HcszyUI08AM1dHMXA5r2g6Sg==} 859 | engines: {node: '>= 0.3.0'} 860 | 861 | supports-color@5.5.0: 862 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 863 | engines: {node: '>=4'} 864 | 865 | to-fast-properties@2.0.0: 866 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 867 | engines: {node: '>=4'} 868 | 869 | to-regex-range@5.0.1: 870 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 871 | engines: {node: '>=8.0'} 872 | 873 | tsconfck@3.1.3: 874 | resolution: {integrity: sha512-ulNZP1SVpRDesxeMLON/LtWM8HIgAJEIVpVVhBM6gsmvQ8+Rh+ZG7FWGvHh7Ah3pRABwVJWklWCr/BTZSv0xnQ==} 875 | engines: {node: ^18 || >=20} 876 | hasBin: true 877 | peerDependencies: 878 | typescript: ^5.0.0 879 | peerDependenciesMeta: 880 | typescript: 881 | optional: true 882 | 883 | typescript@5.5.4: 884 | resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} 885 | engines: {node: '>=14.17'} 886 | hasBin: true 887 | 888 | uberproto@1.2.0: 889 | resolution: {integrity: sha512-pGtPAQmLwh+R9w81WVHzui1FfedpQWQpiaIIfPCwhtsBez4q6DYbJFfyXPVHPUTNFnedAvNEnkoFiLuhXIR94w==} 890 | 891 | undici@6.19.8: 892 | resolution: {integrity: sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==} 893 | engines: {node: '>=18.17'} 894 | 895 | universalify@2.0.1: 896 | resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} 897 | engines: {node: '>= 10.0.0'} 898 | 899 | update-browserslist-db@1.1.0: 900 | resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} 901 | hasBin: true 902 | peerDependencies: 903 | browserslist: '>= 4.21.0' 904 | 905 | vite-plugin-static-copy@1.0.6: 906 | resolution: {integrity: sha512-3uSvsMwDVFZRitqoWHj0t4137Kz7UynnJeq1EZlRW7e25h2068fyIZX4ORCCOAkfp1FklGxJNVJBkBOD+PZIew==} 907 | engines: {node: ^18.0.0 || >=20.0.0} 908 | peerDependencies: 909 | vite: ^5.0.0 910 | 911 | vite-tsconfig-paths@4.3.2: 912 | resolution: {integrity: sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==} 913 | peerDependencies: 914 | vite: '*' 915 | peerDependenciesMeta: 916 | vite: 917 | optional: true 918 | 919 | vite-workspace@0.2.2: 920 | resolution: {integrity: sha512-b08xoJ2136M4MfOSnrTbm14+R8n1Sx0iqq19vkUUclgTrRzgiDojmJ47mdQYZlx+eXQJIPs/cOWL9hcHGuUKmQ==} 921 | peerDependencies: 922 | vite: ^4.0.0 923 | 924 | vite@5.4.2: 925 | resolution: {integrity: sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==} 926 | engines: {node: ^18.0.0 || >=20.0.0} 927 | hasBin: true 928 | peerDependencies: 929 | '@types/node': ^18.0.0 || >=20.0.0 930 | less: '*' 931 | lightningcss: ^1.21.0 932 | sass: '*' 933 | sass-embedded: '*' 934 | stylus: '*' 935 | sugarss: '*' 936 | terser: ^5.4.0 937 | peerDependenciesMeta: 938 | '@types/node': 939 | optional: true 940 | less: 941 | optional: true 942 | lightningcss: 943 | optional: true 944 | sass: 945 | optional: true 946 | sass-embedded: 947 | optional: true 948 | stylus: 949 | optional: true 950 | sugarss: 951 | optional: true 952 | terser: 953 | optional: true 954 | 955 | whatwg-encoding@3.1.1: 956 | resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} 957 | engines: {node: '>=18'} 958 | 959 | whatwg-mimetype@4.0.0: 960 | resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} 961 | engines: {node: '>=18'} 962 | 963 | yallist@3.1.1: 964 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 965 | 966 | yocto-queue@1.1.1: 967 | resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} 968 | engines: {node: '>=12.20'} 969 | 970 | snapshots: 971 | 972 | '@ampproject/remapping@2.3.0': 973 | dependencies: 974 | '@jridgewell/gen-mapping': 0.3.5 975 | '@jridgewell/trace-mapping': 0.3.25 976 | 977 | '@babel/code-frame@7.24.7': 978 | dependencies: 979 | '@babel/highlight': 7.24.7 980 | picocolors: 1.0.1 981 | 982 | '@babel/compat-data@7.25.4': {} 983 | 984 | '@babel/core@7.25.2': 985 | dependencies: 986 | '@ampproject/remapping': 2.3.0 987 | '@babel/code-frame': 7.24.7 988 | '@babel/generator': 7.25.6 989 | '@babel/helper-compilation-targets': 7.25.2 990 | '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) 991 | '@babel/helpers': 7.25.6 992 | '@babel/parser': 7.25.6 993 | '@babel/template': 7.25.0 994 | '@babel/traverse': 7.25.6 995 | '@babel/types': 7.25.6 996 | convert-source-map: 2.0.0 997 | debug: 4.3.6 998 | gensync: 1.0.0-beta.2 999 | json5: 2.2.3 1000 | semver: 6.3.1 1001 | transitivePeerDependencies: 1002 | - supports-color 1003 | 1004 | '@babel/generator@7.25.6': 1005 | dependencies: 1006 | '@babel/types': 7.25.6 1007 | '@jridgewell/gen-mapping': 0.3.5 1008 | '@jridgewell/trace-mapping': 0.3.25 1009 | jsesc: 2.5.2 1010 | 1011 | '@babel/helper-compilation-targets@7.25.2': 1012 | dependencies: 1013 | '@babel/compat-data': 7.25.4 1014 | '@babel/helper-validator-option': 7.24.8 1015 | browserslist: 4.23.3 1016 | lru-cache: 5.1.1 1017 | semver: 6.3.1 1018 | 1019 | '@babel/helper-module-imports@7.24.7': 1020 | dependencies: 1021 | '@babel/traverse': 7.25.6 1022 | '@babel/types': 7.25.6 1023 | transitivePeerDependencies: 1024 | - supports-color 1025 | 1026 | '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': 1027 | dependencies: 1028 | '@babel/core': 7.25.2 1029 | '@babel/helper-module-imports': 7.24.7 1030 | '@babel/helper-simple-access': 7.24.7 1031 | '@babel/helper-validator-identifier': 7.24.7 1032 | '@babel/traverse': 7.25.6 1033 | transitivePeerDependencies: 1034 | - supports-color 1035 | 1036 | '@babel/helper-plugin-utils@7.24.8': {} 1037 | 1038 | '@babel/helper-simple-access@7.24.7': 1039 | dependencies: 1040 | '@babel/traverse': 7.25.6 1041 | '@babel/types': 7.25.6 1042 | transitivePeerDependencies: 1043 | - supports-color 1044 | 1045 | '@babel/helper-string-parser@7.24.8': {} 1046 | 1047 | '@babel/helper-validator-identifier@7.24.7': {} 1048 | 1049 | '@babel/helper-validator-option@7.24.8': {} 1050 | 1051 | '@babel/helpers@7.25.6': 1052 | dependencies: 1053 | '@babel/template': 7.25.0 1054 | '@babel/types': 7.25.6 1055 | 1056 | '@babel/highlight@7.24.7': 1057 | dependencies: 1058 | '@babel/helper-validator-identifier': 7.24.7 1059 | chalk: 2.4.2 1060 | js-tokens: 4.0.0 1061 | picocolors: 1.0.1 1062 | 1063 | '@babel/parser@7.25.6': 1064 | dependencies: 1065 | '@babel/types': 7.25.6 1066 | 1067 | '@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.25.2)': 1068 | dependencies: 1069 | '@babel/core': 7.25.2 1070 | '@babel/helper-plugin-utils': 7.24.8 1071 | 1072 | '@babel/plugin-transform-react-jsx-source@7.24.7(@babel/core@7.25.2)': 1073 | dependencies: 1074 | '@babel/core': 7.25.2 1075 | '@babel/helper-plugin-utils': 7.24.8 1076 | 1077 | '@babel/template@7.25.0': 1078 | dependencies: 1079 | '@babel/code-frame': 7.24.7 1080 | '@babel/parser': 7.25.6 1081 | '@babel/types': 7.25.6 1082 | 1083 | '@babel/traverse@7.25.6': 1084 | dependencies: 1085 | '@babel/code-frame': 7.24.7 1086 | '@babel/generator': 7.25.6 1087 | '@babel/parser': 7.25.6 1088 | '@babel/template': 7.25.0 1089 | '@babel/types': 7.25.6 1090 | debug: 4.3.6 1091 | globals: 11.12.0 1092 | transitivePeerDependencies: 1093 | - supports-color 1094 | 1095 | '@babel/types@7.25.6': 1096 | dependencies: 1097 | '@babel/helper-string-parser': 7.24.8 1098 | '@babel/helper-validator-identifier': 7.24.7 1099 | to-fast-properties: 2.0.0 1100 | 1101 | '@crxjs/vite-plugin@1.0.14(vite@5.4.2)': 1102 | dependencies: 1103 | '@rollup/pluginutils': 4.2.1 1104 | '@webcomponents/custom-elements': 1.6.0 1105 | acorn-walk: 8.3.3 1106 | cheerio: 1.0.0 1107 | connect-injector: 0.4.4 1108 | debug: 4.3.6 1109 | es-module-lexer: 0.10.5 1110 | fast-glob: 3.3.2 1111 | fs-extra: 10.1.0 1112 | jsesc: 3.0.2 1113 | magic-string: 0.26.7 1114 | picocolors: 1.0.1 1115 | react-refresh: 0.13.0 1116 | rollup: 2.79.1 1117 | vite: 5.4.2 1118 | optionalDependencies: 1119 | '@vitejs/plugin-react': 4.3.1(vite@5.4.2) 1120 | transitivePeerDependencies: 1121 | - supports-color 1122 | 1123 | '@esbuild/aix-ppc64@0.21.5': 1124 | optional: true 1125 | 1126 | '@esbuild/android-arm64@0.21.5': 1127 | optional: true 1128 | 1129 | '@esbuild/android-arm@0.21.5': 1130 | optional: true 1131 | 1132 | '@esbuild/android-x64@0.21.5': 1133 | optional: true 1134 | 1135 | '@esbuild/darwin-arm64@0.21.5': 1136 | optional: true 1137 | 1138 | '@esbuild/darwin-x64@0.21.5': 1139 | optional: true 1140 | 1141 | '@esbuild/freebsd-arm64@0.21.5': 1142 | optional: true 1143 | 1144 | '@esbuild/freebsd-x64@0.21.5': 1145 | optional: true 1146 | 1147 | '@esbuild/linux-arm64@0.21.5': 1148 | optional: true 1149 | 1150 | '@esbuild/linux-arm@0.21.5': 1151 | optional: true 1152 | 1153 | '@esbuild/linux-ia32@0.21.5': 1154 | optional: true 1155 | 1156 | '@esbuild/linux-loong64@0.21.5': 1157 | optional: true 1158 | 1159 | '@esbuild/linux-mips64el@0.21.5': 1160 | optional: true 1161 | 1162 | '@esbuild/linux-ppc64@0.21.5': 1163 | optional: true 1164 | 1165 | '@esbuild/linux-riscv64@0.21.5': 1166 | optional: true 1167 | 1168 | '@esbuild/linux-s390x@0.21.5': 1169 | optional: true 1170 | 1171 | '@esbuild/linux-x64@0.21.5': 1172 | optional: true 1173 | 1174 | '@esbuild/netbsd-x64@0.21.5': 1175 | optional: true 1176 | 1177 | '@esbuild/openbsd-x64@0.21.5': 1178 | optional: true 1179 | 1180 | '@esbuild/sunos-x64@0.21.5': 1181 | optional: true 1182 | 1183 | '@esbuild/win32-arm64@0.21.5': 1184 | optional: true 1185 | 1186 | '@esbuild/win32-ia32@0.21.5': 1187 | optional: true 1188 | 1189 | '@esbuild/win32-x64@0.21.5': 1190 | optional: true 1191 | 1192 | '@jridgewell/gen-mapping@0.3.5': 1193 | dependencies: 1194 | '@jridgewell/set-array': 1.2.1 1195 | '@jridgewell/sourcemap-codec': 1.5.0 1196 | '@jridgewell/trace-mapping': 0.3.25 1197 | 1198 | '@jridgewell/resolve-uri@3.1.2': {} 1199 | 1200 | '@jridgewell/set-array@1.2.1': {} 1201 | 1202 | '@jridgewell/sourcemap-codec@1.5.0': {} 1203 | 1204 | '@jridgewell/trace-mapping@0.3.25': 1205 | dependencies: 1206 | '@jridgewell/resolve-uri': 3.1.2 1207 | '@jridgewell/sourcemap-codec': 1.5.0 1208 | 1209 | '@nodelib/fs.scandir@2.1.5': 1210 | dependencies: 1211 | '@nodelib/fs.stat': 2.0.5 1212 | run-parallel: 1.2.0 1213 | 1214 | '@nodelib/fs.stat@2.0.5': {} 1215 | 1216 | '@nodelib/fs.walk@1.2.8': 1217 | dependencies: 1218 | '@nodelib/fs.scandir': 2.1.5 1219 | fastq: 1.17.1 1220 | 1221 | '@rollup/pluginutils@4.2.1': 1222 | dependencies: 1223 | estree-walker: 2.0.2 1224 | picomatch: 2.3.1 1225 | 1226 | '@rollup/rollup-android-arm-eabi@4.21.2': 1227 | optional: true 1228 | 1229 | '@rollup/rollup-android-arm64@4.21.2': 1230 | optional: true 1231 | 1232 | '@rollup/rollup-darwin-arm64@4.21.2': 1233 | optional: true 1234 | 1235 | '@rollup/rollup-darwin-x64@4.21.2': 1236 | optional: true 1237 | 1238 | '@rollup/rollup-linux-arm-gnueabihf@4.21.2': 1239 | optional: true 1240 | 1241 | '@rollup/rollup-linux-arm-musleabihf@4.21.2': 1242 | optional: true 1243 | 1244 | '@rollup/rollup-linux-arm64-gnu@4.21.2': 1245 | optional: true 1246 | 1247 | '@rollup/rollup-linux-arm64-musl@4.21.2': 1248 | optional: true 1249 | 1250 | '@rollup/rollup-linux-powerpc64le-gnu@4.21.2': 1251 | optional: true 1252 | 1253 | '@rollup/rollup-linux-riscv64-gnu@4.21.2': 1254 | optional: true 1255 | 1256 | '@rollup/rollup-linux-s390x-gnu@4.21.2': 1257 | optional: true 1258 | 1259 | '@rollup/rollup-linux-x64-gnu@4.21.2': 1260 | optional: true 1261 | 1262 | '@rollup/rollup-linux-x64-musl@4.21.2': 1263 | optional: true 1264 | 1265 | '@rollup/rollup-win32-arm64-msvc@4.21.2': 1266 | optional: true 1267 | 1268 | '@rollup/rollup-win32-ia32-msvc@4.21.2': 1269 | optional: true 1270 | 1271 | '@rollup/rollup-win32-x64-msvc@4.21.2': 1272 | optional: true 1273 | 1274 | '@types/babel__core@7.20.5': 1275 | dependencies: 1276 | '@babel/parser': 7.25.6 1277 | '@babel/types': 7.25.6 1278 | '@types/babel__generator': 7.6.8 1279 | '@types/babel__template': 7.4.4 1280 | '@types/babel__traverse': 7.20.6 1281 | 1282 | '@types/babel__generator@7.6.8': 1283 | dependencies: 1284 | '@babel/types': 7.25.6 1285 | 1286 | '@types/babel__template@7.4.4': 1287 | dependencies: 1288 | '@babel/parser': 7.25.6 1289 | '@babel/types': 7.25.6 1290 | 1291 | '@types/babel__traverse@7.20.6': 1292 | dependencies: 1293 | '@babel/types': 7.25.6 1294 | 1295 | '@types/chrome@0.0.270': 1296 | dependencies: 1297 | '@types/filesystem': 0.0.36 1298 | '@types/har-format': 1.2.15 1299 | 1300 | '@types/estree@1.0.5': {} 1301 | 1302 | '@types/filesystem@0.0.36': 1303 | dependencies: 1304 | '@types/filewriter': 0.0.33 1305 | 1306 | '@types/filewriter@0.0.33': {} 1307 | 1308 | '@types/har-format@1.2.15': {} 1309 | 1310 | '@types/lodash-es@4.17.12': 1311 | dependencies: 1312 | '@types/lodash': 4.17.7 1313 | 1314 | '@types/lodash@4.17.7': {} 1315 | 1316 | '@types/offscreencanvas@2019.7.3': {} 1317 | 1318 | '@types/prop-types@15.7.12': {} 1319 | 1320 | '@types/react-dom@18.3.0': 1321 | dependencies: 1322 | '@types/react': 18.3.5 1323 | 1324 | '@types/react@18.3.5': 1325 | dependencies: 1326 | '@types/prop-types': 15.7.12 1327 | csstype: 3.1.3 1328 | 1329 | '@vitejs/plugin-react@4.3.1(vite@5.4.2)': 1330 | dependencies: 1331 | '@babel/core': 7.25.2 1332 | '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.25.2) 1333 | '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.25.2) 1334 | '@types/babel__core': 7.20.5 1335 | react-refresh: 0.14.2 1336 | vite: 5.4.2 1337 | transitivePeerDependencies: 1338 | - supports-color 1339 | 1340 | '@webcomponents/custom-elements@1.6.0': {} 1341 | 1342 | acorn-walk@8.3.3: 1343 | dependencies: 1344 | acorn: 8.12.1 1345 | 1346 | acorn@8.12.1: {} 1347 | 1348 | ansi-styles@3.2.1: 1349 | dependencies: 1350 | color-convert: 1.9.3 1351 | 1352 | anymatch@3.1.3: 1353 | dependencies: 1354 | normalize-path: 3.0.0 1355 | picomatch: 2.3.1 1356 | 1357 | binary-extensions@2.3.0: {} 1358 | 1359 | boolbase@1.0.0: {} 1360 | 1361 | braces@3.0.3: 1362 | dependencies: 1363 | fill-range: 7.1.1 1364 | 1365 | browserslist@4.23.3: 1366 | dependencies: 1367 | caniuse-lite: 1.0.30001655 1368 | electron-to-chromium: 1.5.13 1369 | node-releases: 2.0.18 1370 | update-browserslist-db: 1.1.0(browserslist@4.23.3) 1371 | 1372 | cac@6.7.14: {} 1373 | 1374 | caniuse-lite@1.0.30001655: {} 1375 | 1376 | chalk@2.4.2: 1377 | dependencies: 1378 | ansi-styles: 3.2.1 1379 | escape-string-regexp: 1.0.5 1380 | supports-color: 5.5.0 1381 | 1382 | cheerio-select@2.1.0: 1383 | dependencies: 1384 | boolbase: 1.0.0 1385 | css-select: 5.1.0 1386 | css-what: 6.1.0 1387 | domelementtype: 2.3.0 1388 | domhandler: 5.0.3 1389 | domutils: 3.1.0 1390 | 1391 | cheerio@1.0.0: 1392 | dependencies: 1393 | cheerio-select: 2.1.0 1394 | dom-serializer: 2.0.0 1395 | domhandler: 5.0.3 1396 | domutils: 3.1.0 1397 | encoding-sniffer: 0.2.0 1398 | htmlparser2: 9.1.0 1399 | parse5: 7.1.2 1400 | parse5-htmlparser2-tree-adapter: 7.0.0 1401 | parse5-parser-stream: 7.1.2 1402 | undici: 6.19.8 1403 | whatwg-mimetype: 4.0.0 1404 | 1405 | chokidar@3.6.0: 1406 | dependencies: 1407 | anymatch: 3.1.3 1408 | braces: 3.0.3 1409 | glob-parent: 5.1.2 1410 | is-binary-path: 2.1.0 1411 | is-glob: 4.0.3 1412 | normalize-path: 3.0.0 1413 | readdirp: 3.6.0 1414 | optionalDependencies: 1415 | fsevents: 2.3.3 1416 | 1417 | color-convert@1.9.3: 1418 | dependencies: 1419 | color-name: 1.1.3 1420 | 1421 | color-name@1.1.3: {} 1422 | 1423 | connect-injector@0.4.4: 1424 | dependencies: 1425 | debug: 2.6.9 1426 | q: 1.5.1 1427 | stream-buffers: 0.2.6 1428 | uberproto: 1.2.0 1429 | transitivePeerDependencies: 1430 | - supports-color 1431 | 1432 | convert-source-map@2.0.0: {} 1433 | 1434 | css-select@5.1.0: 1435 | dependencies: 1436 | boolbase: 1.0.0 1437 | css-what: 6.1.0 1438 | domhandler: 5.0.3 1439 | domutils: 3.1.0 1440 | nth-check: 2.1.1 1441 | 1442 | css-what@6.1.0: {} 1443 | 1444 | csstype@3.1.3: {} 1445 | 1446 | debug@2.6.9: 1447 | dependencies: 1448 | ms: 2.0.0 1449 | 1450 | debug@4.3.6: 1451 | dependencies: 1452 | ms: 2.1.2 1453 | 1454 | dom-serializer@2.0.0: 1455 | dependencies: 1456 | domelementtype: 2.3.0 1457 | domhandler: 5.0.3 1458 | entities: 4.5.0 1459 | 1460 | domelementtype@2.3.0: {} 1461 | 1462 | domhandler@5.0.3: 1463 | dependencies: 1464 | domelementtype: 2.3.0 1465 | 1466 | domutils@3.1.0: 1467 | dependencies: 1468 | dom-serializer: 2.0.0 1469 | domelementtype: 2.3.0 1470 | domhandler: 5.0.3 1471 | 1472 | electron-to-chromium@1.5.13: {} 1473 | 1474 | encoding-sniffer@0.2.0: 1475 | dependencies: 1476 | iconv-lite: 0.6.3 1477 | whatwg-encoding: 3.1.1 1478 | 1479 | entities@4.5.0: {} 1480 | 1481 | es-module-lexer@0.10.5: {} 1482 | 1483 | esbuild@0.21.5: 1484 | optionalDependencies: 1485 | '@esbuild/aix-ppc64': 0.21.5 1486 | '@esbuild/android-arm': 0.21.5 1487 | '@esbuild/android-arm64': 0.21.5 1488 | '@esbuild/android-x64': 0.21.5 1489 | '@esbuild/darwin-arm64': 0.21.5 1490 | '@esbuild/darwin-x64': 0.21.5 1491 | '@esbuild/freebsd-arm64': 0.21.5 1492 | '@esbuild/freebsd-x64': 0.21.5 1493 | '@esbuild/linux-arm': 0.21.5 1494 | '@esbuild/linux-arm64': 0.21.5 1495 | '@esbuild/linux-ia32': 0.21.5 1496 | '@esbuild/linux-loong64': 0.21.5 1497 | '@esbuild/linux-mips64el': 0.21.5 1498 | '@esbuild/linux-ppc64': 0.21.5 1499 | '@esbuild/linux-riscv64': 0.21.5 1500 | '@esbuild/linux-s390x': 0.21.5 1501 | '@esbuild/linux-x64': 0.21.5 1502 | '@esbuild/netbsd-x64': 0.21.5 1503 | '@esbuild/openbsd-x64': 0.21.5 1504 | '@esbuild/sunos-x64': 0.21.5 1505 | '@esbuild/win32-arm64': 0.21.5 1506 | '@esbuild/win32-ia32': 0.21.5 1507 | '@esbuild/win32-x64': 0.21.5 1508 | 1509 | escalade@3.2.0: {} 1510 | 1511 | escape-string-regexp@1.0.5: {} 1512 | 1513 | estree-walker@2.0.2: {} 1514 | 1515 | fast-glob@3.3.2: 1516 | dependencies: 1517 | '@nodelib/fs.stat': 2.0.5 1518 | '@nodelib/fs.walk': 1.2.8 1519 | glob-parent: 5.1.2 1520 | merge2: 1.4.1 1521 | micromatch: 4.0.8 1522 | 1523 | fastq@1.17.1: 1524 | dependencies: 1525 | reusify: 1.0.4 1526 | 1527 | fill-range@7.1.1: 1528 | dependencies: 1529 | to-regex-range: 5.0.1 1530 | 1531 | find-up@6.3.0: 1532 | dependencies: 1533 | locate-path: 7.2.0 1534 | path-exists: 5.0.0 1535 | 1536 | fs-extra@10.1.0: 1537 | dependencies: 1538 | graceful-fs: 4.2.11 1539 | jsonfile: 6.1.0 1540 | universalify: 2.0.1 1541 | 1542 | fs-extra@11.2.0: 1543 | dependencies: 1544 | graceful-fs: 4.2.11 1545 | jsonfile: 6.1.0 1546 | universalify: 2.0.1 1547 | 1548 | fsevents@2.3.3: 1549 | optional: true 1550 | 1551 | gensync@1.0.0-beta.2: {} 1552 | 1553 | glob-parent@5.1.2: 1554 | dependencies: 1555 | is-glob: 4.0.3 1556 | 1557 | globals@11.12.0: {} 1558 | 1559 | globrex@0.1.2: {} 1560 | 1561 | graceful-fs@4.2.11: {} 1562 | 1563 | has-flag@3.0.0: {} 1564 | 1565 | htmlparser2@9.1.0: 1566 | dependencies: 1567 | domelementtype: 2.3.0 1568 | domhandler: 5.0.3 1569 | domutils: 3.1.0 1570 | entities: 4.5.0 1571 | 1572 | iconv-lite@0.6.3: 1573 | dependencies: 1574 | safer-buffer: 2.1.2 1575 | 1576 | is-binary-path@2.1.0: 1577 | dependencies: 1578 | binary-extensions: 2.3.0 1579 | 1580 | is-extglob@2.1.1: {} 1581 | 1582 | is-glob@4.0.3: 1583 | dependencies: 1584 | is-extglob: 2.1.1 1585 | 1586 | is-number@7.0.0: {} 1587 | 1588 | js-tokens@4.0.0: {} 1589 | 1590 | jsesc@2.5.2: {} 1591 | 1592 | jsesc@3.0.2: {} 1593 | 1594 | json5@2.2.3: {} 1595 | 1596 | jsonfile@6.1.0: 1597 | dependencies: 1598 | universalify: 2.0.1 1599 | optionalDependencies: 1600 | graceful-fs: 4.2.11 1601 | 1602 | locate-path@7.2.0: 1603 | dependencies: 1604 | p-locate: 6.0.0 1605 | 1606 | lodash-es@4.17.21: {} 1607 | 1608 | loose-envify@1.4.0: 1609 | dependencies: 1610 | js-tokens: 4.0.0 1611 | 1612 | lru-cache@5.1.1: 1613 | dependencies: 1614 | yallist: 3.1.1 1615 | 1616 | magic-string@0.26.7: 1617 | dependencies: 1618 | sourcemap-codec: 1.4.8 1619 | 1620 | merge2@1.4.1: {} 1621 | 1622 | micromatch@4.0.8: 1623 | dependencies: 1624 | braces: 3.0.3 1625 | picomatch: 2.3.1 1626 | 1627 | ms@2.0.0: {} 1628 | 1629 | ms@2.1.2: {} 1630 | 1631 | nanoid@3.3.7: {} 1632 | 1633 | node-releases@2.0.18: {} 1634 | 1635 | normalize-path@3.0.0: {} 1636 | 1637 | nth-check@2.1.1: 1638 | dependencies: 1639 | boolbase: 1.0.0 1640 | 1641 | p-limit@4.0.0: 1642 | dependencies: 1643 | yocto-queue: 1.1.1 1644 | 1645 | p-locate@6.0.0: 1646 | dependencies: 1647 | p-limit: 4.0.0 1648 | 1649 | parse5-htmlparser2-tree-adapter@7.0.0: 1650 | dependencies: 1651 | domhandler: 5.0.3 1652 | parse5: 7.1.2 1653 | 1654 | parse5-parser-stream@7.1.2: 1655 | dependencies: 1656 | parse5: 7.1.2 1657 | 1658 | parse5@7.1.2: 1659 | dependencies: 1660 | entities: 4.5.0 1661 | 1662 | path-exists@5.0.0: {} 1663 | 1664 | picocolors@1.0.1: {} 1665 | 1666 | picomatch@2.3.1: {} 1667 | 1668 | postcss@8.4.42: 1669 | dependencies: 1670 | nanoid: 3.3.7 1671 | picocolors: 1.0.1 1672 | source-map-js: 1.2.0 1673 | 1674 | q@1.5.1: {} 1675 | 1676 | queue-microtask@1.2.3: {} 1677 | 1678 | react-dom@18.3.1(react@18.3.1): 1679 | dependencies: 1680 | loose-envify: 1.4.0 1681 | react: 18.3.1 1682 | scheduler: 0.23.2 1683 | 1684 | react-refresh@0.13.0: {} 1685 | 1686 | react-refresh@0.14.2: {} 1687 | 1688 | react@18.3.1: 1689 | dependencies: 1690 | loose-envify: 1.4.0 1691 | 1692 | readdirp@3.6.0: 1693 | dependencies: 1694 | picomatch: 2.3.1 1695 | 1696 | reusify@1.0.4: {} 1697 | 1698 | rollup@2.79.1: 1699 | optionalDependencies: 1700 | fsevents: 2.3.3 1701 | 1702 | rollup@4.21.2: 1703 | dependencies: 1704 | '@types/estree': 1.0.5 1705 | optionalDependencies: 1706 | '@rollup/rollup-android-arm-eabi': 4.21.2 1707 | '@rollup/rollup-android-arm64': 4.21.2 1708 | '@rollup/rollup-darwin-arm64': 4.21.2 1709 | '@rollup/rollup-darwin-x64': 4.21.2 1710 | '@rollup/rollup-linux-arm-gnueabihf': 4.21.2 1711 | '@rollup/rollup-linux-arm-musleabihf': 4.21.2 1712 | '@rollup/rollup-linux-arm64-gnu': 4.21.2 1713 | '@rollup/rollup-linux-arm64-musl': 4.21.2 1714 | '@rollup/rollup-linux-powerpc64le-gnu': 4.21.2 1715 | '@rollup/rollup-linux-riscv64-gnu': 4.21.2 1716 | '@rollup/rollup-linux-s390x-gnu': 4.21.2 1717 | '@rollup/rollup-linux-x64-gnu': 4.21.2 1718 | '@rollup/rollup-linux-x64-musl': 4.21.2 1719 | '@rollup/rollup-win32-arm64-msvc': 4.21.2 1720 | '@rollup/rollup-win32-ia32-msvc': 4.21.2 1721 | '@rollup/rollup-win32-x64-msvc': 4.21.2 1722 | fsevents: 2.3.3 1723 | 1724 | run-parallel@1.2.0: 1725 | dependencies: 1726 | queue-microtask: 1.2.3 1727 | 1728 | safer-buffer@2.1.2: {} 1729 | 1730 | scheduler@0.23.2: 1731 | dependencies: 1732 | loose-envify: 1.4.0 1733 | 1734 | semver@6.3.1: {} 1735 | 1736 | source-map-js@1.2.0: {} 1737 | 1738 | sourcemap-codec@1.4.8: {} 1739 | 1740 | stream-buffers@0.2.6: {} 1741 | 1742 | supports-color@5.5.0: 1743 | dependencies: 1744 | has-flag: 3.0.0 1745 | 1746 | to-fast-properties@2.0.0: {} 1747 | 1748 | to-regex-range@5.0.1: 1749 | dependencies: 1750 | is-number: 7.0.0 1751 | 1752 | tsconfck@3.1.3(typescript@5.5.4): 1753 | optionalDependencies: 1754 | typescript: 5.5.4 1755 | 1756 | typescript@5.5.4: {} 1757 | 1758 | uberproto@1.2.0: {} 1759 | 1760 | undici@6.19.8: {} 1761 | 1762 | universalify@2.0.1: {} 1763 | 1764 | update-browserslist-db@1.1.0(browserslist@4.23.3): 1765 | dependencies: 1766 | browserslist: 4.23.3 1767 | escalade: 3.2.0 1768 | picocolors: 1.0.1 1769 | 1770 | vite-plugin-static-copy@1.0.6(vite@5.4.2): 1771 | dependencies: 1772 | chokidar: 3.6.0 1773 | fast-glob: 3.3.2 1774 | fs-extra: 11.2.0 1775 | picocolors: 1.0.1 1776 | vite: 5.4.2 1777 | 1778 | vite-tsconfig-paths@4.3.2(typescript@5.5.4)(vite@5.4.2): 1779 | dependencies: 1780 | debug: 4.3.6 1781 | globrex: 0.1.2 1782 | tsconfck: 3.1.3(typescript@5.5.4) 1783 | optionalDependencies: 1784 | vite: 5.4.2 1785 | transitivePeerDependencies: 1786 | - supports-color 1787 | - typescript 1788 | 1789 | vite-workspace@0.2.2(typescript@5.5.4)(vite@5.4.2): 1790 | dependencies: 1791 | cac: 6.7.14 1792 | debug: 4.3.6 1793 | fast-glob: 3.3.2 1794 | find-up: 6.3.0 1795 | micromatch: 4.0.8 1796 | vite: 5.4.2 1797 | vite-tsconfig-paths: 4.3.2(typescript@5.5.4)(vite@5.4.2) 1798 | transitivePeerDependencies: 1799 | - supports-color 1800 | - typescript 1801 | 1802 | vite@5.4.2: 1803 | dependencies: 1804 | esbuild: 0.21.5 1805 | postcss: 8.4.42 1806 | rollup: 4.21.2 1807 | optionalDependencies: 1808 | fsevents: 2.3.3 1809 | 1810 | whatwg-encoding@3.1.1: 1811 | dependencies: 1812 | iconv-lite: 0.6.3 1813 | 1814 | whatwg-mimetype@4.0.0: {} 1815 | 1816 | yallist@3.1.1: {} 1817 | 1818 | yocto-queue@1.1.1: {} 1819 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pd4d10/system-monitor/1d339e6765d8b091c467a6a4d559e4efb6e9b2af/pnpm-workspace.yaml -------------------------------------------------------------------------------- /system-monitor/options.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /system-monitor/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "system-monitor", 3 | "private": true, 4 | "type": "module", 5 | "version": "2.1.2", 6 | "description": "Monitor system status like CPU, memory, battery", 7 | "scripts": { 8 | "dev": "vite", 9 | "build": "tsc && vite build" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "git+https://github.com/pd4d10/system-monitor.git" 14 | }, 15 | "author": "pd4d10 ", 16 | "license": "MIT", 17 | "bugs": { 18 | "url": "https://github.com/pd4d10/system-monitor/issues" 19 | }, 20 | "homepage": "https://github.com/pd4d10/system-monitor#readme", 21 | "dependencies": { 22 | "@types/chrome": "^0.0.270", 23 | "@types/offscreencanvas": "^2019.6.4", 24 | "@types/react": "^18.3.5", 25 | "@types/react-dom": "^18.3.0", 26 | "react": "^18.3.1", 27 | "react-dom": "^18.3.1", 28 | "utils": "workspace:*" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /system-monitor/popup.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /system-monitor/public/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pd4d10/system-monitor/1d339e6765d8b091c467a6a4d559e4efb6e9b2af/system-monitor/public/icon.png -------------------------------------------------------------------------------- /system-monitor/src/background.ts: -------------------------------------------------------------------------------- 1 | import { runOnceOnStartup, setActionIcon } from "utils"; 2 | import { getSystemInfo } from "./utils"; 3 | 4 | const data = Array(19).fill(1); 5 | 6 | runOnceOnStartup(() => { 7 | getSystemInfo(({ cpu: { modelName, usage } }: { 8 | cpu: { 9 | modelName: string; 10 | usage: chrome.system.cpu.ProcessorUsage[]; 11 | }; 12 | }) => { 13 | const idle = usage.reduce((a, b) => a + b.idle / b.total, 0) / usage.length; 14 | data.push(idle); 15 | data.shift(); 16 | 17 | chrome.action.setTitle({ 18 | title: `${modelName}\nUsage: ${(100 * (1 - idle)).toFixed(0)}%`, 19 | }); 20 | setActionIcon(data, { 21 | color: "#4876ff", 22 | borderColor: "#1874cd", 23 | }); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /system-monitor/src/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 9 | 23 | 24 | -------------------------------------------------------------------------------- /system-monitor/src/options.tsx: -------------------------------------------------------------------------------- 1 | import { FC, useEffect, useState } from "react"; 2 | import { createRoot } from "react-dom/client"; 3 | import { getStatus, saveStatus, Status, statusDefaults } from "./utils"; 4 | 5 | const App: FC = () => { 6 | const [status, setStatus] = useState(); 7 | const mergeStatus = (data: Partial) => { 8 | setStatus(previous => ({ 9 | ...statusDefaults, 10 | ...previous, 11 | ...data, 12 | })); 13 | }; 14 | 15 | useEffect(() => { 16 | getStatus().then(data => { 17 | mergeStatus(data); 18 | }); 19 | }, []); 20 | 21 | useEffect(() => { 22 | if (status) saveStatus(status); 23 | }, [status]); 24 | 25 | return ( 26 | status && ( 27 |
28 |

Popup settings

29 |
30 | {(["cpu", "memory", "battery", "storage"] as const).map((item) => ( 31 |
32 | { 37 | mergeStatus({ [item]: e.target.checked }); 38 | }} 39 | /> 40 | 43 |
44 | ))} 45 |
46 |
47 | 54 |
55 | ) 56 | ); 57 | }; 58 | 59 | const root = document.createElement("div"); 60 | document.body.appendChild(root); 61 | createRoot(root).render(); 62 | -------------------------------------------------------------------------------- /system-monitor/src/popup.tsx: -------------------------------------------------------------------------------- 1 | import { FC, useEffect, useState } from "react"; 2 | import { createRoot } from "react-dom/client"; 3 | import { Bar, colors, Icon, Tip, Title } from "./styled"; 4 | import { getStatus, getSystemInfo, Status, toGiga } from "./utils"; 5 | 6 | type SetState = (data: Partial) => void; 7 | 8 | const App: FC<{ status: Status }> = ({ status }) => { 9 | const [state, _setState] = useState({ 10 | supportBatteryAPI: false, 11 | cpu: { 12 | modelName: "", 13 | usage: [], 14 | temperatures: [], 15 | }, 16 | memory: { 17 | capacity: 1, 18 | availableCapacity: 1, 19 | }, 20 | storage: { storage: [] }, 21 | battery: { 22 | isSupported: false, 23 | isCharging: false, 24 | level: 0, 25 | chargingTime: 0, 26 | dischargingTime: 0, 27 | }, 28 | }); 29 | const setState: SetState = (data) => { 30 | _setState(s => ({ 31 | ...s, 32 | ...data, 33 | })); 34 | }; 35 | 36 | useEffect(() => { 37 | const addBatteryListener = async () => { 38 | // @ts-ignore types 39 | const _battery = await navigator.getBattery(); 40 | 41 | const handleBatteryChange = () => { 42 | setState({ 43 | battery: { 44 | ...state.battery, 45 | isCharging: _battery.charging, 46 | level: _battery.level, 47 | chargingTime: _battery.chargingTime, 48 | dischargingTime: _battery.dischargingTime, 49 | }, 50 | }); 51 | }; 52 | 53 | handleBatteryChange(); 54 | [ 55 | "chargingchange", 56 | "levelchange", 57 | "chargingtimechange", 58 | "dischargingtimechange", 59 | ].forEach((event) => { 60 | _battery.addEventListener(event, handleBatteryChange); 61 | }); 62 | }; 63 | 64 | const init = async () => { 65 | // Trigger CPU, memory and storage status update periodly 66 | // @ts-ignore TODO: 67 | await getSystemInfo(setState); 68 | 69 | // Battery 70 | // @ts-ignore types 71 | if (typeof navigator.getBattery === "function") { 72 | setState({ 73 | supportBatteryAPI: true, 74 | }); 75 | addBatteryListener(); 76 | } 77 | }; 78 | 79 | init(); 80 | }, []); 81 | 82 | const { cpu, memory, battery, storage } = state; 83 | 84 | return ( 85 |
86 | {/* CPU */} 87 | {status.cpu && ( 88 |
89 | CPU 90 | 91 | {cpu.modelName} 92 | {cpu.temperatures.length > 0 93 | && ` | ${cpu.temperatures.map((t) => `${t}°C`).join(", ")}`} 94 | 95 |
96 | 97 | 98 |
99 | {cpu.usage.map(({ user, kernel, total }, index) => ( 100 | 108 | ))} 109 |
110 | )} 111 | 112 | {/* memory */} 113 | {status.memory && ( 114 |
115 | Memory 116 | 117 | Available: {toGiga(memory.availableCapacity)}GB/{toGiga(memory.capacity)}GB 118 | 119 | 123 |
124 | )} 125 | 126 | {/* battery */} 127 | {state.supportBatteryAPI && status.battery && ( 128 |
129 | Battery 130 | 131 | {(battery.level * 100).toFixed(2)}% ( 132 | {battery.isCharging ? "Charging" : "Not charging"}) 133 | 134 | 138 |
139 | )} 140 | 141 | {/* storage */} 142 | {status.storage && ( 143 |
144 | Storage 145 | {storage.storage.map(({ name, capacity, id }) => ( 146 | {`${name || "Unknown"} / ${toGiga(capacity)}GB`} 147 | ))} 148 |
149 | )} 150 | 151 | {/* new window */} 152 | {location.search === "" && ( 153 | 170 | )} 171 |
172 | ); 173 | }; 174 | 175 | const root = document.createElement("div"); 176 | document.body.appendChild(root); 177 | 178 | getStatus().then(status => { 179 | createRoot(root).render(); 180 | }); 181 | -------------------------------------------------------------------------------- /system-monitor/src/styled.tsx: -------------------------------------------------------------------------------- 1 | import { FC, PropsWithChildren } from "react"; 2 | 3 | const width = 220; 4 | 5 | export const colors = { 6 | cpu: { 7 | kernel: "#3a5eca", 8 | user: "#6687e7", 9 | border: "#b3c3f3", 10 | }, 11 | memory: { 12 | usage: "#198e88", 13 | border: "#8fd8d4", 14 | }, 15 | battery: { 16 | usage: "#b6c8f5", 17 | border: "#b6c8f5", 18 | }, 19 | }; 20 | 21 | export const Tip: FC = ({ children }) => ( 22 |

23 | {children} 24 |

25 | ); 26 | 27 | export const Title: FC = ({ children }) => ( 28 |

29 | {children} 30 |

31 | ); 32 | 33 | export const Bar: FC<{ 34 | borderColor: string; 35 | usages: { ratio: number; offset?: number; color: string }[]; 36 | }> = (info) => ( 37 |
47 | {info.usages.map(({ ratio, offset, color }, index) => ( 48 |
66 | ))} 67 |
68 | ); 69 | 70 | export const Icon: FC<{ color: string; text: string }> = ({ color, text }) => ( 71 |
72 |
82 | {text} 83 |
84 | ); 85 | -------------------------------------------------------------------------------- /system-monitor/src/utils.ts: -------------------------------------------------------------------------------- 1 | const TIMEOUT = 1000; 2 | export const storageKey = "popup"; 3 | 4 | // Convert byte to GB 5 | export function toGiga(byte: number) { 6 | return (byte / (1024 * 1024 * 1024)).toFixed(2); 7 | } 8 | 9 | function getCpuUsage( 10 | processors: chrome.system.cpu.ProcessorUsage[], 11 | processorsOld: chrome.system.cpu.ProcessorUsage[], 12 | ) { 13 | const usage = []; 14 | for (let i = 0; i < processors.length; i++) { 15 | const processor = processors[i]; 16 | 17 | // https://github.com/pd4d10/system-monitor/issues/3 18 | if (processor.total === 0) continue; 19 | 20 | const processorOld = processorsOld[i]; 21 | usage.push( 22 | processorOld 23 | ? { 24 | user: processor.user - processorOld.user, 25 | kernel: processor.kernel - processorOld.kernel, 26 | idle: processor.idle - processorOld.idle, 27 | total: processor.total - processorOld.total, 28 | } 29 | : processor, 30 | ); 31 | } 32 | return usage; 33 | } 34 | 35 | export async function getSystemInfo( 36 | cb: (data: { 37 | cpu: { 38 | modelName: string; 39 | usage: any[]; // temperatures?: number[] 40 | }; 41 | memory: { capacity: number; availableCapacity: number }; 42 | storage: { storage: { name: string; capacity: number; id: string }[] }; 43 | }) => void, 44 | processorsOld: chrome.system.cpu.ProcessorUsage[] = [], 45 | ) { 46 | const items = await Promise.all( 47 | (["cpu", "memory", "storage"] as const).map((item) => { 48 | return new Promise((resolve) => { 49 | chrome.system[item].getInfo(resolve); 50 | }); 51 | }), 52 | ); 53 | 54 | const [cpu, memory, storage] = items as [ 55 | chrome.system.cpu.CpuInfo | null, 56 | chrome.system.memory.MemoryInfo | null, 57 | { storage: { name: string; capacity: number; id: string }[] } | null, 58 | ]; 59 | 60 | const data: any = {}; 61 | let processors: chrome.system.cpu.ProcessorUsage[]; 62 | if (cpu) { 63 | processors = cpu.processors.map(({ usage }) => usage); 64 | data.cpu = { 65 | modelName: cpu.modelName, 66 | usage: getCpuUsage(processors, processorsOld), 67 | 68 | // @ts-ignore only chrome os 69 | temperatures: cpu.temperatures || [], 70 | // temperatures: [40, 50], 71 | }; 72 | } 73 | if (memory) data.memory = memory; 74 | if (storage) data.storage = { storage }; 75 | 76 | cb(data); 77 | setTimeout(() => getSystemInfo(cb, processors), TIMEOUT); 78 | } 79 | 80 | export type Status = { 81 | cpu: boolean; 82 | memory: boolean; 83 | battery: boolean; 84 | storage: boolean; 85 | }; 86 | 87 | export const statusDefaults = { 88 | cpu: true, 89 | memory: true, 90 | battery: true, 91 | storage: true, 92 | }; 93 | 94 | export const getStatus = () => { 95 | return new Promise((resolve) => { 96 | chrome.storage.sync.get(storageKey, (res) => { 97 | resolve({ 98 | ...statusDefaults, 99 | ...res[storageKey], 100 | }); 101 | }); 102 | }); 103 | }; 104 | 105 | export const saveStatus = (data: Status) => { 106 | return chrome.storage.sync.set({ [storageKey]: data }); 107 | }; 108 | -------------------------------------------------------------------------------- /system-monitor/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig-base", 3 | "include": ["src"], 4 | "compilerOptions": { 5 | "rootDir": "src", 6 | "outDir": "dist" 7 | }, 8 | "references": [ 9 | { "path": "../utils" } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /system-monitor/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { crx } from "@crxjs/vite-plugin"; 2 | import react from "@vitejs/plugin-react"; 3 | import { defineConfig } from "vite"; 4 | import { viteStaticCopy } from "vite-plugin-static-copy"; 5 | import { vitePlugin as workspace } from "vite-workspace"; 6 | import pkg from "./package.json"; 7 | 8 | export default defineConfig({ 9 | plugins: [ 10 | workspace(), 11 | react(), 12 | crx({ 13 | manifest: { 14 | manifest_version: 3, 15 | name: "System Monitor", 16 | version: pkg.version, 17 | description: "Monitor system status like CPU, memory, battery", 18 | homepage_url: "https://github.com/pd4d10/system-monitor", 19 | offline_enabled: true, 20 | background: { 21 | service_worker: "src/background.ts", 22 | }, 23 | permissions: ["system.cpu", "system.memory", "system.storage", "storage"], 24 | action: { 25 | default_popup: "popup.html", 26 | }, 27 | options_ui: { 28 | page: "options.html", 29 | open_in_tab: false, 30 | }, 31 | icons: { 32 | "128": "icon.png", 33 | }, 34 | }, 35 | }), 36 | viteStaticCopy({ targets: [{ src: "../LICENSE", dest: "." }] }), 37 | ], 38 | }); 39 | -------------------------------------------------------------------------------- /tsconfig-base.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2016", 4 | "jsx": "react-jsx", 5 | "module": "commonjs", 6 | "resolveJsonModule": true, 7 | "esModuleInterop": true, 8 | "forceConsistentCasingInFileNames": true, 9 | "strict": true, 10 | "skipLibCheck": true, 11 | "composite": true, 12 | "emitDeclarationOnly": true 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [ 4 | { "path": "./system-monitor" }, 5 | { "path": "./memory-monitor" }, 6 | { "path": "./utils" } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /utils/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "utils", 3 | "private": true, 4 | "main": "./dist/index.js", 5 | "dependencies": { 6 | "@types/chrome": "^0.0.270", 7 | "@types/lodash-es": "^4.17.12", 8 | "lodash-es": "^4.17.21" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /utils/src/index.ts: -------------------------------------------------------------------------------- 1 | import { once } from "lodash-es"; 2 | 3 | export const runOnceOnStartup = (fn: (...args: any) => any) => { 4 | const init = once(fn); 5 | 6 | // for manifest v3 startup 7 | // https://stackoverflow.com/questions/66618136/persistent-service-worker-in-chrome-extension 8 | chrome.runtime.onStartup.addListener(init); 9 | 10 | // for reload/enable 11 | init(); 12 | }; 13 | 14 | let ctx: OffscreenCanvasRenderingContext2D | null = null; 15 | 16 | export const setActionIcon = (data: number[], { color, borderColor }: { 17 | color: string; 18 | borderColor: string; 19 | }) => { 20 | const SIZE = 19; 21 | const BORDER_WIDTH = 2; 22 | 23 | if (!ctx) { 24 | const canvas = new OffscreenCanvas(SIZE, SIZE); 25 | ctx = canvas.getContext("2d", { 26 | // https://html.spec.whatwg.org/multipage/canvas.html#concept-canvas-will-read-frequently 27 | willReadFrequently: true, 28 | })!; 29 | } 30 | 31 | // clear 32 | ctx.clearRect(0, 0, SIZE, SIZE); 33 | 34 | // main 35 | ctx.beginPath(); 36 | ctx.moveTo(0, SIZE); 37 | for (let i = 0; i < SIZE; i++) { 38 | ctx.lineTo(i, data[i] * SIZE); 39 | } 40 | ctx.lineTo(SIZE, SIZE); 41 | ctx.lineWidth = 2; 42 | ctx.fillStyle = color; 43 | ctx.fill(); 44 | 45 | // border 46 | ctx.beginPath(); 47 | ctx.moveTo(0, 0); 48 | ctx.lineTo(0, SIZE); 49 | ctx.lineTo(SIZE, SIZE); 50 | ctx.lineTo(SIZE, 0); 51 | ctx.closePath(); 52 | ctx.lineWidth = BORDER_WIDTH; 53 | ctx.strokeStyle = borderColor; 54 | ctx.stroke(); 55 | 56 | chrome.action.setIcon({ 57 | imageData: ctx.getImageData(0, 0, SIZE, SIZE), 58 | }); 59 | }; 60 | -------------------------------------------------------------------------------- /utils/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig-base", 3 | "include": ["src"], 4 | "compilerOptions": { 5 | "rootDir": "src", 6 | "outDir": "dist" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /utils/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | 3 | export default defineConfig({ 4 | build: { 5 | lib: { 6 | entry: "src/index.ts", 7 | }, 8 | }, 9 | }); 10 | --------------------------------------------------------------------------------