diff --git a/README.md b/README.md index 564c896..1e697a3 100644 --- a/README.md +++ b/README.md @@ -58,16 +58,18 @@ npm install cd .. ``` -4. **开发模式运行** +4. **开发模式运行(推荐)** ```bash -make dev +wails dev ``` 5. **构建发布版本** ```bash -make release +wails build -clean ``` +> 说明:在 Windows 下可以直接使用 `wails dev` 进入开发模式,不依赖 `make`。 + ## 使用说明 ### 1. 启动应用 @@ -209,14 +211,13 @@ make lint ### 构建 ```bash -# 开发构建 -make build +# 开发模式 +wails dev # 发布构建 -make release +wails build -clean -# 清理构建文件 -make clean +# (可选)如果你本地装了 make,也可以使用 make build / make release / make clean ``` ## 数据存储 @@ -312,4 +313,4 @@ make clean --- -**注意**: 本工具仅用于学习和研究目的,请遵守相关法律法规和游戏服务条款。 \ No newline at end of file +**注意**: 本工具仅用于学习和研究目的,请遵守相关法律法规和游戏服务条款。 diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 8ada1be..2232130 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -30,8 +30,6 @@ }, "node_modules/@ampproject/remapping": { "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -44,8 +42,6 @@ }, "node_modules/@ant-design/colors": { "version": "7.2.1", - "resolved": "https://registry.npmmirror.com/@ant-design/colors/-/colors-7.2.1.tgz", - "integrity": "sha512-lCHDcEzieu4GA3n8ELeZ5VQ8pKQAWcGGLRTQ50aQM2iqPpq2evTxER84jfdPvsPAtEcZ7m44NI45edFMo8oOYQ==", "license": "MIT", "dependencies": { "@ant-design/fast-color": "^2.0.6" @@ -53,8 +49,6 @@ }, "node_modules/@ant-design/cssinjs": { "version": "1.23.0", - "resolved": "https://registry.npmmirror.com/@ant-design/cssinjs/-/cssinjs-1.23.0.tgz", - "integrity": "sha512-7GAg9bD/iC9ikWatU9ym+P9ugJhi/WbsTWzcKN6T4gU0aehsprtke1UAaaSxxkjjmkJb3llet/rbUSLPgwlY4w==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", @@ -72,8 +66,6 @@ }, "node_modules/@ant-design/cssinjs-utils": { "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/@ant-design/cssinjs-utils/-/cssinjs-utils-1.1.3.tgz", - "integrity": "sha512-nOoQMLW1l+xR1Co8NFVYiP8pZp3VjIIzqV6D6ShYF2ljtdwWJn5WSsH+7kvCktXL/yhEtWURKOfH5Xz/gzlwsg==", "license": "MIT", "dependencies": { "@ant-design/cssinjs": "^1.21.0", @@ -87,8 +79,6 @@ }, "node_modules/@ant-design/fast-color": { "version": "2.0.6", - "resolved": "https://registry.npmmirror.com/@ant-design/fast-color/-/fast-color-2.0.6.tgz", - "integrity": "sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.7" @@ -99,8 +89,6 @@ }, "node_modules/@ant-design/icons": { "version": "5.6.1", - "resolved": "https://registry.npmmirror.com/@ant-design/icons/-/icons-5.6.1.tgz", - "integrity": "sha512-0/xS39c91WjPAZOWsvi1//zjx6kAp4kxWwctR6kuU6p133w8RU0D2dSCvZC19uQyharg/sAvYxGYWl01BbZZfg==", "license": "MIT", "dependencies": { "@ant-design/colors": "^7.0.0", @@ -119,14 +107,10 @@ }, "node_modules/@ant-design/icons-svg": { "version": "4.4.2", - "resolved": "https://registry.npmmirror.com/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", - "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==", "license": "MIT" }, "node_modules/@ant-design/react-slick": { "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/@ant-design/react-slick/-/react-slick-1.1.2.tgz", - "integrity": "sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.4", @@ -141,8 +125,6 @@ }, "node_modules/@babel/code-frame": { "version": "7.27.1", - "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, "license": "MIT", "dependencies": { @@ -156,8 +138,6 @@ }, "node_modules/@babel/compat-data": { "version": "7.27.7", - "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.27.7.tgz", - "integrity": "sha512-xgu/ySj2mTiUFmdE9yCMfBxLp4DHd5DwmbbD05YAuICfodYT3VvRxbrh81LGQ/8UpSdtMdfKMn3KouYDX59DGQ==", "dev": true, "license": "MIT", "engines": { @@ -166,8 +146,6 @@ }, "node_modules/@babel/core": { "version": "7.27.7", - "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.27.7.tgz", - "integrity": "sha512-BU2f9tlKQ5CAthiMIgpzAh4eDTLWo1mqi9jqE2OxMG0E/OM199VJt2q8BztTxpnSW0i1ymdwLXRJnYzvDM5r2w==", "dev": true, "license": "MIT", "dependencies": { @@ -197,8 +175,6 @@ }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -207,8 +183,6 @@ }, "node_modules/@babel/generator": { "version": "7.27.5", - "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.27.5.tgz", - "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", "dev": true, "license": "MIT", "dependencies": { @@ -224,8 +198,6 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "7.27.2", - "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dev": true, "license": "MIT", "dependencies": { @@ -241,8 +213,6 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -251,8 +221,6 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.27.1", - "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "dev": true, "license": "MIT", "dependencies": { @@ -265,8 +233,6 @@ }, "node_modules/@babel/helper-module-transforms": { "version": "7.27.3", - "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", - "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", "dev": true, "license": "MIT", "dependencies": { @@ -283,8 +249,6 @@ }, "node_modules/@babel/helper-plugin-utils": { "version": "7.27.1", - "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true, "license": "MIT", "engines": { @@ -293,8 +257,6 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", - "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "license": "MIT", "engines": { @@ -303,8 +265,6 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.27.1", - "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true, "license": "MIT", "engines": { @@ -313,8 +273,6 @@ }, "node_modules/@babel/helper-validator-option": { "version": "7.27.1", - "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, "license": "MIT", "engines": { @@ -323,8 +281,6 @@ }, "node_modules/@babel/helpers": { "version": "7.27.6", - "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.27.6.tgz", - "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", "dev": true, "license": "MIT", "dependencies": { @@ -337,8 +293,6 @@ }, "node_modules/@babel/parser": { "version": "7.27.7", - "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.27.7.tgz", - "integrity": "sha512-qnzXzDXdr/po3bOTbTIQZ7+TxNKxpkN5IifVLXS+r7qwynkZfPyjZfE7hCXbo7IoO9TNcSyibgONsf2HauUd3Q==", "dev": true, "license": "MIT", "dependencies": { @@ -353,8 +307,6 @@ }, "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.27.1", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", "dev": true, "license": "MIT", "dependencies": { @@ -369,8 +321,6 @@ }, "node_modules/@babel/plugin-transform-react-jsx-source": { "version": "7.27.1", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", "dev": true, "license": "MIT", "dependencies": { @@ -385,8 +335,6 @@ }, "node_modules/@babel/runtime": { "version": "7.27.6", - "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.27.6.tgz", - "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -394,8 +342,6 @@ }, "node_modules/@babel/template": { "version": "7.27.2", - "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, "license": "MIT", "dependencies": { @@ -409,8 +355,6 @@ }, "node_modules/@babel/traverse": { "version": "7.27.7", - "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.27.7.tgz", - "integrity": "sha512-X6ZlfR/O/s5EQ/SnUSLzr+6kGnkg8HXGMzpgsMsrJVcfDtH1vIp6ctCN4eZ1LS5c0+te5Cb6Y514fASjMRJ1nw==", "dev": true, "license": "MIT", "dependencies": { @@ -428,8 +372,6 @@ }, "node_modules/@babel/types": { "version": "7.27.7", - "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.27.7.tgz", - "integrity": "sha512-8OLQgDScAOHXnAz2cV+RfzzNMipuLVBz2biuAJFMV9bfkNf393je3VM8CLkjQodW5+iWsSJdSgSWT6rsZoXHPw==", "dev": true, "license": "MIT", "dependencies": { @@ -442,394 +384,14 @@ }, "node_modules/@emotion/hash": { "version": "0.8.0", - "resolved": "https://registry.npmmirror.com/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", "license": "MIT" }, "node_modules/@emotion/unitless": { "version": "0.7.5", - "resolved": "https://registry.npmmirror.com/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", "license": "MIT" }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@esbuild/win32-x64": { "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], @@ -845,8 +407,6 @@ }, "node_modules/@eslint-community/eslint-utils": { "version": "4.7.0", - "resolved": "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", "dev": true, "license": "MIT", "dependencies": { @@ -864,8 +424,6 @@ }, "node_modules/@eslint-community/regexpp": { "version": "4.12.1", - "resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, "license": "MIT", "engines": { @@ -874,8 +432,6 @@ }, "node_modules/@eslint/eslintrc": { "version": "2.1.4", - "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "license": "MIT", "dependencies": { @@ -898,8 +454,6 @@ }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { "version": "1.1.12", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -909,8 +463,6 @@ }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "13.24.0", - "resolved": "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -925,8 +477,6 @@ }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { @@ -938,8 +488,6 @@ }, "node_modules/@eslint/js": { "version": "8.57.1", - "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, "license": "MIT", "engines": { @@ -948,9 +496,6 @@ }, "node_modules/@humanwhocodes/config-array": { "version": "0.13.0", - "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -964,8 +509,6 @@ }, "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { "version": "1.1.12", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -975,8 +518,6 @@ }, "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { @@ -988,8 +529,6 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1002,16 +541,11 @@ }, "node_modules/@humanwhocodes/object-schema": { "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", "dev": true, "license": "BSD-3-Clause" }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.11", - "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.11.tgz", - "integrity": "sha512-C512c1ytBTio4MrpWKlJpyFHT6+qfFL8SZ58zBzJ1OOzUEjHeF1BtjY2fH7n4x/g2OV/KiiMLAivOp1DXmiMMw==", "dev": true, "license": "MIT", "dependencies": { @@ -1021,8 +555,6 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "license": "MIT", "engines": { @@ -1031,15 +563,11 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.3", - "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.3.tgz", - "integrity": "sha512-AiR5uKpFxP3PjO4R19kQGIMwxyRyPuXmKEEy301V1C0+1rVjS94EZQXf1QKZYN8Q0YM+estSPhmx5JwNftv6nw==", "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.28", - "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.28.tgz", - "integrity": "sha512-KNNHHwW3EIp4EDYOvYFGyIFfx36R2dNJYH4knnZlF8T5jdbD5Wx8xmSaQ2gP9URkJ04LGEtlcCtwArKcmFcwKw==", "dev": true, "license": "MIT", "dependencies": { @@ -1049,8 +577,6 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "license": "MIT", "dependencies": { @@ -1063,8 +589,6 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", - "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "license": "MIT", "engines": { @@ -1073,8 +597,6 @@ }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", - "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "license": "MIT", "dependencies": { @@ -1087,8 +609,6 @@ }, "node_modules/@rc-component/async-validator": { "version": "5.0.4", - "resolved": "https://registry.npmmirror.com/@rc-component/async-validator/-/async-validator-5.0.4.tgz", - "integrity": "sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.4" @@ -1099,8 +619,6 @@ }, "node_modules/@rc-component/color-picker": { "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/@rc-component/color-picker/-/color-picker-2.0.1.tgz", - "integrity": "sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==", "license": "MIT", "dependencies": { "@ant-design/fast-color": "^2.0.6", @@ -1115,8 +633,6 @@ }, "node_modules/@rc-component/context": { "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/@rc-component/context/-/context-1.4.0.tgz", - "integrity": "sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -1129,8 +645,6 @@ }, "node_modules/@rc-component/mini-decimal": { "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz", - "integrity": "sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.0" @@ -1141,8 +655,6 @@ }, "node_modules/@rc-component/mutate-observer": { "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz", - "integrity": "sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.0", @@ -1159,8 +671,6 @@ }, "node_modules/@rc-component/portal": { "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/@rc-component/portal/-/portal-1.1.2.tgz", - "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.0", @@ -1177,8 +687,6 @@ }, "node_modules/@rc-component/qrcode": { "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/@rc-component/qrcode/-/qrcode-1.0.0.tgz", - "integrity": "sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.7", @@ -1195,8 +703,6 @@ }, "node_modules/@rc-component/tour": { "version": "1.15.1", - "resolved": "https://registry.npmmirror.com/@rc-component/tour/-/tour-1.15.1.tgz", - "integrity": "sha512-Tr2t7J1DKZUpfJuDZWHxyxWpfmj8EZrqSgyMZ+BCdvKZ6r1UDsfU46M/iWAAFBy961Ssfom2kv5f3UcjIL2CmQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.0", @@ -1215,8 +721,6 @@ }, "node_modules/@rc-component/trigger": { "version": "2.2.7", - "resolved": "https://registry.npmmirror.com/@rc-component/trigger/-/trigger-2.2.7.tgz", - "integrity": "sha512-Qggj4Z0AA2i5dJhzlfFSmg1Qrziu8dsdHOihROL5Kl18seO2Eh/ZaTYt2c8a/CyGaTChnFry7BEYew1+/fhSbA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.2", @@ -1236,281 +740,11 @@ }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-beta.19", - "resolved": "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.19.tgz", - "integrity": "sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==", "dev": true, "license": "MIT" }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.44.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.1.tgz", - "integrity": "sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.44.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.1.tgz", - "integrity": "sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.44.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.1.tgz", - "integrity": "sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.44.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.1.tgz", - "integrity": "sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.44.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.1.tgz", - "integrity": "sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.44.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.1.tgz", - "integrity": "sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.44.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.1.tgz", - "integrity": "sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.44.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.1.tgz", - "integrity": "sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.1.tgz", - "integrity": "sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.44.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.1.tgz", - "integrity": "sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.1.tgz", - "integrity": "sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.1.tgz", - "integrity": "sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.1.tgz", - "integrity": "sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.44.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.1.tgz", - "integrity": "sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.1.tgz", - "integrity": "sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.1.tgz", - "integrity": "sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.44.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.1.tgz", - "integrity": "sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.44.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.1.tgz", - "integrity": "sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.44.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.1.tgz", - "integrity": "sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@rollup/rollup-win32-x64-msvc": { "version": "4.44.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.1.tgz", - "integrity": "sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug==", "cpu": [ "x64" ], @@ -1523,8 +757,6 @@ }, "node_modules/@types/babel__core": { "version": "7.20.5", - "resolved": "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "license": "MIT", "dependencies": { @@ -1537,8 +769,6 @@ }, "node_modules/@types/babel__generator": { "version": "7.27.0", - "resolved": "https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, "license": "MIT", "dependencies": { @@ -1547,8 +777,6 @@ }, "node_modules/@types/babel__template": { "version": "7.4.4", - "resolved": "https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "license": "MIT", "dependencies": { @@ -1558,8 +786,6 @@ }, "node_modules/@types/babel__traverse": { "version": "7.20.7", - "resolved": "https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", - "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", "dev": true, "license": "MIT", "dependencies": { @@ -1568,29 +794,21 @@ }, "node_modules/@types/estree": { "version": "1.0.8", - "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", - "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, "license": "MIT" }, "node_modules/@types/prop-types": { "version": "15.7.15", - "resolved": "https://registry.npmmirror.com/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", "devOptional": true, "license": "MIT" }, "node_modules/@types/react": { "version": "18.3.23", - "resolved": "https://registry.npmmirror.com/@types/react/-/react-18.3.23.tgz", - "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", "devOptional": true, "license": "MIT", "dependencies": { @@ -1600,8 +818,6 @@ }, "node_modules/@types/react-dom": { "version": "18.3.7", - "resolved": "https://registry.npmmirror.com/@types/react-dom/-/react-dom-18.3.7.tgz", - "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -1610,15 +826,11 @@ }, "node_modules/@types/semver": { "version": "7.7.0", - "resolved": "https://registry.npmmirror.com/@types/semver/-/semver-7.7.0.tgz", - "integrity": "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==", "dev": true, "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "6.21.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", - "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", "dev": true, "license": "MIT", "dependencies": { @@ -1653,8 +865,6 @@ }, "node_modules/@typescript-eslint/parser": { "version": "6.21.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-6.21.0.tgz", - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -1682,8 +892,6 @@ }, "node_modules/@typescript-eslint/scope-manager": { "version": "6.21.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", "dev": true, "license": "MIT", "dependencies": { @@ -1700,8 +908,6 @@ }, "node_modules/@typescript-eslint/type-utils": { "version": "6.21.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", - "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", "dev": true, "license": "MIT", "dependencies": { @@ -1728,8 +934,6 @@ }, "node_modules/@typescript-eslint/types": { "version": "6.21.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-6.21.0.tgz", - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "dev": true, "license": "MIT", "engines": { @@ -1742,8 +946,6 @@ }, "node_modules/@typescript-eslint/typescript-estree": { "version": "6.21.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", - "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -1771,8 +973,6 @@ }, "node_modules/@typescript-eslint/utils": { "version": "6.21.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-6.21.0.tgz", - "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1797,8 +997,6 @@ }, "node_modules/@typescript-eslint/visitor-keys": { "version": "6.21.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", "dev": true, "license": "MIT", "dependencies": { @@ -1815,15 +1013,11 @@ }, "node_modules/@ungap/structured-clone": { "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "dev": true, "license": "ISC" }, "node_modules/@vitejs/plugin-react": { "version": "4.6.0", - "resolved": "https://registry.npmmirror.com/@vitejs/plugin-react/-/plugin-react-4.6.0.tgz", - "integrity": "sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1843,8 +1037,6 @@ }, "node_modules/acorn": { "version": "8.15.0", - "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", "bin": { @@ -1856,8 +1048,6 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", - "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -1866,8 +1056,6 @@ }, "node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", "dependencies": { @@ -1883,8 +1071,6 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { @@ -1893,8 +1079,6 @@ }, "node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -1909,8 +1093,6 @@ }, "node_modules/antd": { "version": "5.26.3", - "resolved": "https://registry.npmmirror.com/antd/-/antd-5.26.3.tgz", - "integrity": "sha512-M/s9Q39h/+G7AWnS6fbNxmAI9waTH4ti022GVEXBLq2j810V1wJ3UOQps13nEilzDNcyxnFN/EIbqIgS7wSYaA==", "license": "MIT", "dependencies": { "@ant-design/colors": "^7.2.1", @@ -1974,15 +1156,11 @@ }, "node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, "license": "Python-2.0" }, "node_modules/array-union": { "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, "license": "MIT", "engines": { @@ -1991,15 +1169,11 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "license": "MIT" }, "node_modules/brace-expansion": { "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2008,8 +1182,6 @@ }, "node_modules/braces": { "version": "3.0.3", - "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "license": "MIT", "dependencies": { @@ -2021,8 +1193,6 @@ }, "node_modules/browserslist": { "version": "4.25.1", - "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.25.1.tgz", - "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", "dev": true, "funding": [ { @@ -2054,8 +1224,6 @@ }, "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "license": "MIT", "engines": { @@ -2064,8 +1232,6 @@ }, "node_modules/caniuse-lite": { "version": "1.0.30001726", - "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001726.tgz", - "integrity": "sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==", "dev": true, "funding": [ { @@ -2085,8 +1251,6 @@ }, "node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -2102,14 +1266,10 @@ }, "node_modules/classnames": { "version": "2.5.1", - "resolved": "https://registry.npmmirror.com/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", "license": "MIT" }, "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2121,35 +1281,25 @@ }, "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/compute-scroll-into-view": { "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz", - "integrity": "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==", "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true, "license": "MIT" }, "node_modules/convert-source-map": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, "license": "MIT" }, "node_modules/cookie": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/cookie/-/cookie-1.0.2.tgz", - "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", "license": "MIT", "engines": { "node": ">=18" @@ -2157,8 +1307,6 @@ }, "node_modules/copy-to-clipboard": { "version": "3.3.3", - "resolved": "https://registry.npmmirror.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", - "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", "license": "MIT", "dependencies": { "toggle-selection": "^1.0.6" @@ -2166,8 +1314,6 @@ }, "node_modules/cross-spawn": { "version": "7.0.6", - "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", "dependencies": { @@ -2181,20 +1327,14 @@ }, "node_modules/csstype": { "version": "3.1.3", - "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "license": "MIT" }, "node_modules/dayjs": { "version": "1.11.13", - "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz", - "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", "license": "MIT" }, "node_modules/debug": { "version": "4.4.1", - "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2211,15 +1351,11 @@ }, "node_modules/deep-is": { "version": "0.1.4", - "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, "license": "MIT" }, "node_modules/dir-glob": { "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "license": "MIT", "dependencies": { @@ -2231,8 +1367,6 @@ }, "node_modules/doctrine": { "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2244,15 +1378,11 @@ }, "node_modules/electron-to-chromium": { "version": "1.5.178", - "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.178.tgz", - "integrity": "sha512-wObbz/ar3Bc6e4X5vf0iO8xTN8YAjN/tgiAOJLr7yjYFtP9wAjq8Mb5h0yn6kResir+VYx2DXBj9NNobs0ETSA==", "dev": true, "license": "ISC" }, "node_modules/esbuild": { "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -2290,8 +1420,6 @@ }, "node_modules/escalade": { "version": "3.2.0", - "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "license": "MIT", "engines": { @@ -2300,8 +1428,6 @@ }, "node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", "engines": { @@ -2313,9 +1439,6 @@ }, "node_modules/eslint": { "version": "8.57.1", - "resolved": "https://registry.npmmirror.com/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", "dependencies": { @@ -2370,8 +1493,6 @@ }, "node_modules/eslint-plugin-react-hooks": { "version": "4.6.2", - "resolved": "https://registry.npmmirror.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", - "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", "dev": true, "license": "MIT", "engines": { @@ -2383,8 +1504,6 @@ }, "node_modules/eslint-plugin-react-refresh": { "version": "0.4.20", - "resolved": "https://registry.npmmirror.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz", - "integrity": "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==", "dev": true, "license": "MIT", "peerDependencies": { @@ -2393,8 +1512,6 @@ }, "node_modules/eslint-scope": { "version": "7.2.2", - "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -2410,8 +1527,6 @@ }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", - "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "license": "Apache-2.0", "engines": { @@ -2423,8 +1538,6 @@ }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.12", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -2434,8 +1547,6 @@ }, "node_modules/eslint/node_modules/globals": { "version": "13.24.0", - "resolved": "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2450,8 +1561,6 @@ }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { @@ -2463,8 +1572,6 @@ }, "node_modules/espree": { "version": "9.6.1", - "resolved": "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -2481,8 +1588,6 @@ }, "node_modules/esquery": { "version": "1.6.0", - "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -2494,8 +1599,6 @@ }, "node_modules/esrecurse": { "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -2507,8 +1610,6 @@ }, "node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -2517,8 +1618,6 @@ }, "node_modules/esutils": { "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -2527,15 +1626,11 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.3", - "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "license": "MIT", "dependencies": { @@ -2551,8 +1646,6 @@ }, "node_modules/fast-glob/node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "license": "ISC", "dependencies": { @@ -2564,22 +1657,16 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, "license": "MIT" }, "node_modules/fastq": { "version": "1.19.1", - "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, "license": "ISC", "dependencies": { @@ -2588,8 +1675,6 @@ }, "node_modules/file-entry-cache": { "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "license": "MIT", "dependencies": { @@ -2601,8 +1686,6 @@ }, "node_modules/fill-range": { "version": "7.1.1", - "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "license": "MIT", "dependencies": { @@ -2614,8 +1697,6 @@ }, "node_modules/find-up": { "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", "dependencies": { @@ -2631,8 +1712,6 @@ }, "node_modules/flat-cache": { "version": "3.2.0", - "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "license": "MIT", "dependencies": { @@ -2646,37 +1725,16 @@ }, "node_modules/flatted": { "version": "3.3.3", - "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true, "license": "ISC" }, "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true, "license": "ISC" }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", - "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "license": "MIT", "engines": { @@ -2685,9 +1743,6 @@ }, "node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -2707,8 +1762,6 @@ }, "node_modules/glob-parent": { "version": "6.0.2", - "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", "dependencies": { @@ -2720,8 +1773,6 @@ }, "node_modules/glob/node_modules/brace-expansion": { "version": "1.1.12", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -2731,8 +1782,6 @@ }, "node_modules/glob/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { @@ -2744,8 +1793,6 @@ }, "node_modules/globals": { "version": "11.12.0", - "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, "license": "MIT", "engines": { @@ -2754,8 +1801,6 @@ }, "node_modules/globby": { "version": "11.1.0", - "resolved": "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "license": "MIT", "dependencies": { @@ -2775,15 +1820,11 @@ }, "node_modules/graphemer": { "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, "license": "MIT" }, "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -2792,8 +1833,6 @@ }, "node_modules/ignore": { "version": "5.3.2", - "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", "engines": { @@ -2802,8 +1841,6 @@ }, "node_modules/import-fresh": { "version": "3.3.1", - "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2819,8 +1856,6 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", "engines": { @@ -2829,9 +1864,6 @@ }, "node_modules/inflight": { "version": "1.0.6", - "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, "license": "ISC", "dependencies": { @@ -2841,15 +1873,11 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, "license": "ISC" }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", "engines": { @@ -2858,8 +1886,6 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", "dependencies": { @@ -2871,8 +1897,6 @@ }, "node_modules/is-number": { "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "license": "MIT", "engines": { @@ -2881,8 +1905,6 @@ }, "node_modules/is-path-inside": { "version": "3.0.3", - "resolved": "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, "license": "MIT", "engines": { @@ -2891,21 +1913,15 @@ }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, "license": "ISC" }, "node_modules/js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "license": "MIT", "dependencies": { @@ -2917,8 +1933,6 @@ }, "node_modules/jsesc": { "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", "bin": { @@ -2930,29 +1944,21 @@ }, "node_modules/json-buffer": { "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, "license": "MIT" }, "node_modules/json2mq": { "version": "0.2.0", - "resolved": "https://registry.npmmirror.com/json2mq/-/json2mq-0.2.0.tgz", - "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", "license": "MIT", "dependencies": { "string-convert": "^0.2.0" @@ -2960,8 +1966,6 @@ }, "node_modules/json5": { "version": "2.2.3", - "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "license": "MIT", "bin": { @@ -2973,8 +1977,6 @@ }, "node_modules/keyv": { "version": "4.5.4", - "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "license": "MIT", "dependencies": { @@ -2983,8 +1985,6 @@ }, "node_modules/levn": { "version": "0.4.1", - "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2997,8 +1997,6 @@ }, "node_modules/locate-path": { "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", "dependencies": { @@ -3013,15 +2011,11 @@ }, "node_modules/lodash.merge": { "version": "4.6.2", - "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, "license": "MIT" }, "node_modules/loose-envify": { "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" @@ -3032,8 +2026,6 @@ }, "node_modules/lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "license": "ISC", "dependencies": { @@ -3042,8 +2034,6 @@ }, "node_modules/merge2": { "version": "1.4.1", - "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, "license": "MIT", "engines": { @@ -3052,8 +2042,6 @@ }, "node_modules/micromatch": { "version": "4.0.8", - "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", "dependencies": { @@ -3066,8 +2054,6 @@ }, "node_modules/minimatch": { "version": "9.0.3", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "license": "ISC", "dependencies": { @@ -3082,15 +2068,11 @@ }, "node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.11", - "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, "funding": [ { @@ -3108,22 +2090,16 @@ }, "node_modules/natural-compare": { "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, "license": "MIT" }, "node_modules/node-releases": { "version": "2.0.19", - "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true, "license": "MIT" }, "node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "license": "ISC", "dependencies": { @@ -3132,8 +2108,6 @@ }, "node_modules/optionator": { "version": "0.9.4", - "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", "dependencies": { @@ -3150,8 +2124,6 @@ }, "node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3166,8 +2138,6 @@ }, "node_modules/p-locate": { "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", "dependencies": { @@ -3182,8 +2152,6 @@ }, "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "license": "MIT", "dependencies": { @@ -3195,8 +2163,6 @@ }, "node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", "engines": { @@ -3205,8 +2171,6 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, "license": "MIT", "engines": { @@ -3215,8 +2179,6 @@ }, "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "license": "MIT", "engines": { @@ -3225,8 +2187,6 @@ }, "node_modules/path-type": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, "license": "MIT", "engines": { @@ -3235,15 +2195,11 @@ }, "node_modules/picocolors": { "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true, "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "license": "MIT", "engines": { @@ -3255,8 +2211,6 @@ }, "node_modules/postcss": { "version": "8.5.6", - "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, "funding": [ { @@ -3284,8 +2238,6 @@ }, "node_modules/prelude-ls": { "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", "engines": { @@ -3294,8 +2246,6 @@ }, "node_modules/punycode": { "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "license": "MIT", "engines": { @@ -3304,8 +2254,6 @@ }, "node_modules/queue-microtask": { "version": "1.2.3", - "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { @@ -3325,8 +2273,6 @@ }, "node_modules/rc-cascader": { "version": "3.34.0", - "resolved": "https://registry.npmmirror.com/rc-cascader/-/rc-cascader-3.34.0.tgz", - "integrity": "sha512-KpXypcvju9ptjW9FaN2NFcA2QH9E9LHKq169Y0eWtH4e/wHQ5Wh5qZakAgvb8EKZ736WZ3B0zLLOBsrsja5Dag==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.7", @@ -3342,8 +2288,6 @@ }, "node_modules/rc-checkbox": { "version": "3.5.0", - "resolved": "https://registry.npmmirror.com/rc-checkbox/-/rc-checkbox-3.5.0.tgz", - "integrity": "sha512-aOAQc3E98HteIIsSqm6Xk2FPKIER6+5vyEFMZfo73TqM+VVAIqOkHoPjgKLqSNtVLWScoaM7vY2ZrGEheI79yg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -3357,8 +2301,6 @@ }, "node_modules/rc-collapse": { "version": "3.9.0", - "resolved": "https://registry.npmmirror.com/rc-collapse/-/rc-collapse-3.9.0.tgz", - "integrity": "sha512-swDdz4QZ4dFTo4RAUMLL50qP0EY62N2kvmk2We5xYdRwcRn8WcYtuetCJpwpaCbUfUt5+huLpVxhvmnK+PHrkA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -3373,8 +2315,6 @@ }, "node_modules/rc-dialog": { "version": "9.6.0", - "resolved": "https://registry.npmmirror.com/rc-dialog/-/rc-dialog-9.6.0.tgz", - "integrity": "sha512-ApoVi9Z8PaCQg6FsUzS8yvBEQy0ZL2PkuvAgrmohPkN3okps5WZ5WQWPc1RNuiOKaAYv8B97ACdsFU5LizzCqg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -3390,8 +2330,6 @@ }, "node_modules/rc-drawer": { "version": "7.3.0", - "resolved": "https://registry.npmmirror.com/rc-drawer/-/rc-drawer-7.3.0.tgz", - "integrity": "sha512-DX6CIgiBWNpJIMGFO8BAISFkxiuKitoizooj4BDyee8/SnBn0zwO2FHrNDpqqepj0E/TFTDpmEBCyFuTgC7MOg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", @@ -3407,8 +2345,6 @@ }, "node_modules/rc-dropdown": { "version": "4.2.1", - "resolved": "https://registry.npmmirror.com/rc-dropdown/-/rc-dropdown-4.2.1.tgz", - "integrity": "sha512-YDAlXsPv3I1n42dv1JpdM7wJ+gSUBfeyPK59ZpBD9jQhK9jVuxpjj3NmWQHOBceA1zEPVX84T2wbdb2SD0UjmA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", @@ -3423,8 +2359,6 @@ }, "node_modules/rc-field-form": { "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/rc-field-form/-/rc-field-form-2.7.0.tgz", - "integrity": "sha512-hgKsCay2taxzVnBPZl+1n4ZondsV78G++XVsMIJCAoioMjlMQR9YwAp7JZDIECzIu2Z66R+f4SFIRrO2DjDNAA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.0", @@ -3441,8 +2375,6 @@ }, "node_modules/rc-image": { "version": "7.12.0", - "resolved": "https://registry.npmmirror.com/rc-image/-/rc-image-7.12.0.tgz", - "integrity": "sha512-cZ3HTyyckPnNnUb9/DRqduqzLfrQRyi+CdHjdqgsyDpI3Ln5UX1kXnAhPBSJj9pVRzwRFgqkN7p9b6HBDjmu/Q==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.2", @@ -3459,8 +2391,6 @@ }, "node_modules/rc-input": { "version": "1.8.0", - "resolved": "https://registry.npmmirror.com/rc-input/-/rc-input-1.8.0.tgz", - "integrity": "sha512-KXvaTbX+7ha8a/k+eg6SYRVERK0NddX8QX7a7AnRvUa/rEH0CNMlpcBzBkhI0wp2C8C4HlMoYl8TImSN+fuHKA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", @@ -3474,8 +2404,6 @@ }, "node_modules/rc-input-number": { "version": "9.5.0", - "resolved": "https://registry.npmmirror.com/rc-input-number/-/rc-input-number-9.5.0.tgz", - "integrity": "sha512-bKaEvB5tHebUURAEXw35LDcnRZLq3x1k7GxfAqBMzmpHkDGzjAtnUL8y4y5N15rIFIg5IJgwr211jInl3cipag==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -3491,8 +2419,6 @@ }, "node_modules/rc-mentions": { "version": "2.20.0", - "resolved": "https://registry.npmmirror.com/rc-mentions/-/rc-mentions-2.20.0.tgz", - "integrity": "sha512-w8HCMZEh3f0nR8ZEd466ATqmXFCMGMN5UFCzEUL0bM/nGw/wOS2GgRzKBcm19K++jDyuWCOJOdgcKGXU3fXfbQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.22.5", @@ -3510,8 +2436,6 @@ }, "node_modules/rc-menu": { "version": "9.16.1", - "resolved": "https://registry.npmmirror.com/rc-menu/-/rc-menu-9.16.1.tgz", - "integrity": "sha512-ghHx6/6Dvp+fw8CJhDUHFHDJ84hJE3BXNCzSgLdmNiFErWSOaZNsihDAsKq9ByTALo/xkNIwtDFGIl6r+RPXBg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -3528,8 +2452,6 @@ }, "node_modules/rc-motion": { "version": "2.9.5", - "resolved": "https://registry.npmmirror.com/rc-motion/-/rc-motion-2.9.5.tgz", - "integrity": "sha512-w+XTUrfh7ArbYEd2582uDrEhmBHwK1ZENJiSJVb7uRxdE7qJSYjbO2eksRXmndqyKqKoYPc9ClpPh5242mV1vA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", @@ -3543,8 +2465,6 @@ }, "node_modules/rc-notification": { "version": "5.6.4", - "resolved": "https://registry.npmmirror.com/rc-notification/-/rc-notification-5.6.4.tgz", - "integrity": "sha512-KcS4O6B4qzM3KH7lkwOB7ooLPZ4b6J+VMmQgT51VZCeEcmghdeR4IrMcFq0LG+RPdnbe/ArT086tGM8Snimgiw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -3562,8 +2482,6 @@ }, "node_modules/rc-overflow": { "version": "1.4.1", - "resolved": "https://registry.npmmirror.com/rc-overflow/-/rc-overflow-1.4.1.tgz", - "integrity": "sha512-3MoPQQPV1uKyOMVNd6SZfONi+f3st0r8PksexIdBTeIYbMX0Jr+k7pHEDvsXtR4BpCv90/Pv2MovVNhktKrwvw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", @@ -3578,8 +2496,6 @@ }, "node_modules/rc-pagination": { "version": "5.1.0", - "resolved": "https://registry.npmmirror.com/rc-pagination/-/rc-pagination-5.1.0.tgz", - "integrity": "sha512-8416Yip/+eclTFdHXLKTxZvn70duYVGTvUUWbckCCZoIl3jagqke3GLsFrMs0bsQBikiYpZLD9206Ej4SOdOXQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -3593,8 +2509,6 @@ }, "node_modules/rc-picker": { "version": "4.11.3", - "resolved": "https://registry.npmmirror.com/rc-picker/-/rc-picker-4.11.3.tgz", - "integrity": "sha512-MJ5teb7FlNE0NFHTncxXQ62Y5lytq6sh5nUw0iH8OkHL/TjARSEvSHpr940pWgjGANpjCwyMdvsEV55l5tYNSg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.7", @@ -3632,8 +2546,6 @@ }, "node_modules/rc-progress": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/rc-progress/-/rc-progress-4.0.0.tgz", - "integrity": "sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -3647,8 +2559,6 @@ }, "node_modules/rc-rate": { "version": "2.13.1", - "resolved": "https://registry.npmmirror.com/rc-rate/-/rc-rate-2.13.1.tgz", - "integrity": "sha512-QUhQ9ivQ8Gy7mtMZPAjLbxBt5y9GRp65VcUyGUMF3N3fhiftivPHdpuDIaWIMOTEprAjZPC08bls1dQB+I1F2Q==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -3665,8 +2575,6 @@ }, "node_modules/rc-resize-observer": { "version": "1.4.3", - "resolved": "https://registry.npmmirror.com/rc-resize-observer/-/rc-resize-observer-1.4.3.tgz", - "integrity": "sha512-YZLjUbyIWox8E9i9C3Tm7ia+W7euPItNWSPX5sCcQTYbnwDb5uNpnLHQCG1f22oZWUhLw4Mv2tFmeWe68CDQRQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.7", @@ -3681,8 +2589,6 @@ }, "node_modules/rc-segmented": { "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/rc-segmented/-/rc-segmented-2.7.0.tgz", - "integrity": "sha512-liijAjXz+KnTRVnxxXG2sYDGd6iLL7VpGGdR8gwoxAXy2KglviKCxLWZdjKYJzYzGSUwKDSTdYk8brj54Bn5BA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", @@ -3697,8 +2603,6 @@ }, "node_modules/rc-select": { "version": "14.16.8", - "resolved": "https://registry.npmmirror.com/rc-select/-/rc-select-14.16.8.tgz", - "integrity": "sha512-NOV5BZa1wZrsdkKaiK7LHRuo5ZjZYMDxPP6/1+09+FB4KoNi8jcG1ZqLE3AVCxEsYMBe65OBx71wFoHRTP3LRg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -3719,8 +2623,6 @@ }, "node_modules/rc-slider": { "version": "11.1.8", - "resolved": "https://registry.npmmirror.com/rc-slider/-/rc-slider-11.1.8.tgz", - "integrity": "sha512-2gg/72YFSpKP+Ja5AjC5DPL1YnV8DEITDQrcc1eASrUYjl0esptaBVJBh5nLTXCCp15eD8EuGjwezVGSHhs9tQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -3737,8 +2639,6 @@ }, "node_modules/rc-steps": { "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/rc-steps/-/rc-steps-6.0.1.tgz", - "integrity": "sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.16.7", @@ -3755,8 +2655,6 @@ }, "node_modules/rc-switch": { "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/rc-switch/-/rc-switch-4.1.0.tgz", - "integrity": "sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.21.0", @@ -3770,8 +2668,6 @@ }, "node_modules/rc-table": { "version": "7.51.1", - "resolved": "https://registry.npmmirror.com/rc-table/-/rc-table-7.51.1.tgz", - "integrity": "sha512-5iq15mTHhvC42TlBLRCoCBLoCmGlbRZAlyF21FonFnS/DIC8DeRqnmdyVREwt2CFbPceM0zSNdEeVfiGaqYsKw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -3791,8 +2687,6 @@ }, "node_modules/rc-tabs": { "version": "15.6.1", - "resolved": "https://registry.npmmirror.com/rc-tabs/-/rc-tabs-15.6.1.tgz", - "integrity": "sha512-/HzDV1VqOsUWyuC0c6AkxVYFjvx9+rFPKZ32ejxX0Uc7QCzcEjTA9/xMgv4HemPKwzBNX8KhGVbbumDjnj92aA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.2", @@ -3813,8 +2707,6 @@ }, "node_modules/rc-textarea": { "version": "1.10.0", - "resolved": "https://registry.npmmirror.com/rc-textarea/-/rc-textarea-1.10.0.tgz", - "integrity": "sha512-ai9IkanNuyBS4x6sOL8qu/Ld40e6cEs6pgk93R+XLYg0mDSjNBGey6/ZpDs5+gNLD7urQ14po3V6Ck2dJLt9SA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -3830,8 +2722,6 @@ }, "node_modules/rc-tooltip": { "version": "6.4.0", - "resolved": "https://registry.npmmirror.com/rc-tooltip/-/rc-tooltip-6.4.0.tgz", - "integrity": "sha512-kqyivim5cp8I5RkHmpsp1Nn/Wk+1oeloMv9c7LXNgDxUpGm+RbXJGL+OPvDlcRnx9DBeOe4wyOIl4OKUERyH1g==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.2", @@ -3846,8 +2736,6 @@ }, "node_modules/rc-tree": { "version": "5.13.1", - "resolved": "https://registry.npmmirror.com/rc-tree/-/rc-tree-5.13.1.tgz", - "integrity": "sha512-FNhIefhftobCdUJshO7M8uZTA9F4OPGVXqGfZkkD/5soDeOhwO06T/aKTrg0WD8gRg/pyfq+ql3aMymLHCTC4A==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -3866,8 +2754,6 @@ }, "node_modules/rc-tree-select": { "version": "5.27.0", - "resolved": "https://registry.npmmirror.com/rc-tree-select/-/rc-tree-select-5.27.0.tgz", - "integrity": "sha512-2qTBTzwIT7LRI1o7zLyrCzmo5tQanmyGbSaGTIf7sYimCklAToVVfpMC6OAldSKolcnjorBYPNSKQqJmN3TCww==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.7", @@ -3883,8 +2769,6 @@ }, "node_modules/rc-upload": { "version": "4.9.2", - "resolved": "https://registry.npmmirror.com/rc-upload/-/rc-upload-4.9.2.tgz", - "integrity": "sha512-nHx+9rbd1FKMiMRYsqQ3NkXUv7COHPBo3X1Obwq9SWS6/diF/A0aJ5OHubvwUAIDs+4RMleljV0pcrNUc823GQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", @@ -3898,8 +2782,6 @@ }, "node_modules/rc-util": { "version": "5.44.4", - "resolved": "https://registry.npmmirror.com/rc-util/-/rc-util-5.44.4.tgz", - "integrity": "sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", @@ -3912,8 +2794,6 @@ }, "node_modules/rc-virtual-list": { "version": "3.19.1", - "resolved": "https://registry.npmmirror.com/rc-virtual-list/-/rc-virtual-list-3.19.1.tgz", - "integrity": "sha512-DCapO2oyPqmooGhxBuXHM4lFuX+sshQwWqqkuyFA+4rShLe//+GEPVwiDgO+jKtKHtbeYwZoNvetwfHdOf+iUQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.0", @@ -3931,8 +2811,6 @@ }, "node_modules/react": { "version": "18.3.1", - "resolved": "https://registry.npmmirror.com/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" @@ -3943,8 +2821,6 @@ }, "node_modules/react-dom": { "version": "18.3.1", - "resolved": "https://registry.npmmirror.com/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", @@ -3956,14 +2832,10 @@ }, "node_modules/react-is": { "version": "18.3.1", - "resolved": "https://registry.npmmirror.com/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "license": "MIT" }, "node_modules/react-refresh": { "version": "0.17.0", - "resolved": "https://registry.npmmirror.com/react-refresh/-/react-refresh-0.17.0.tgz", - "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", "dev": true, "license": "MIT", "engines": { @@ -3972,8 +2844,6 @@ }, "node_modules/react-router": { "version": "7.6.3", - "resolved": "https://registry.npmmirror.com/react-router/-/react-router-7.6.3.tgz", - "integrity": "sha512-zf45LZp5skDC6I3jDLXQUu0u26jtuP4lEGbc7BbdyxenBN1vJSTA18czM2D+h5qyMBuMrD+9uB+mU37HIoKGRA==", "license": "MIT", "dependencies": { "cookie": "^1.0.1", @@ -3994,8 +2864,6 @@ }, "node_modules/react-router-dom": { "version": "7.6.3", - "resolved": "https://registry.npmmirror.com/react-router-dom/-/react-router-dom-7.6.3.tgz", - "integrity": "sha512-DiWJm9qdUAmiJrVWaeJdu4TKu13+iB/8IEi0EW/XgaHCjW/vWGrwzup0GVvaMteuZjKnh5bEvJP/K0MDnzawHw==", "license": "MIT", "dependencies": { "react-router": "7.6.3" @@ -4010,14 +2878,10 @@ }, "node_modules/resize-observer-polyfill": { "version": "1.5.1", - "resolved": "https://registry.npmmirror.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", "license": "MIT" }, "node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", "engines": { @@ -4026,8 +2890,6 @@ }, "node_modules/reusify": { "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, "license": "MIT", "engines": { @@ -4037,9 +2899,6 @@ }, "node_modules/rimraf": { "version": "3.0.2", - "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -4054,8 +2913,6 @@ }, "node_modules/rollup": { "version": "4.44.1", - "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.44.1.tgz", - "integrity": "sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg==", "dev": true, "license": "MIT", "dependencies": { @@ -4094,8 +2951,6 @@ }, "node_modules/run-parallel": { "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { @@ -4118,8 +2973,6 @@ }, "node_modules/scheduler": { "version": "0.23.2", - "resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" @@ -4127,8 +2980,6 @@ }, "node_modules/scroll-into-view-if-needed": { "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", - "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==", "license": "MIT", "dependencies": { "compute-scroll-into-view": "^3.0.2" @@ -4136,8 +2987,6 @@ }, "node_modules/semver": { "version": "7.7.2", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true, "license": "ISC", "bin": { @@ -4149,14 +2998,10 @@ }, "node_modules/set-cookie-parser": { "version": "2.7.1", - "resolved": "https://registry.npmmirror.com/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", - "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", "license": "MIT" }, "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "license": "MIT", "dependencies": { @@ -4168,8 +3013,6 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "license": "MIT", "engines": { @@ -4178,8 +3021,6 @@ }, "node_modules/slash": { "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "license": "MIT", "engines": { @@ -4188,8 +3029,6 @@ }, "node_modules/source-map-js": { "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -4198,14 +3037,10 @@ }, "node_modules/string-convert": { "version": "0.2.1", - "resolved": "https://registry.npmmirror.com/string-convert/-/string-convert-0.2.1.tgz", - "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==", "license": "MIT" }, "node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -4217,8 +3052,6 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "license": "MIT", "engines": { @@ -4230,14 +3063,10 @@ }, "node_modules/stylis": { "version": "4.3.6", - "resolved": "https://registry.npmmirror.com/stylis/-/stylis-4.3.6.tgz", - "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", "license": "MIT" }, "node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -4249,15 +3078,11 @@ }, "node_modules/text-table": { "version": "0.2.0", - "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true, "license": "MIT" }, "node_modules/throttle-debounce": { "version": "5.0.2", - "resolved": "https://registry.npmmirror.com/throttle-debounce/-/throttle-debounce-5.0.2.tgz", - "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", "license": "MIT", "engines": { "node": ">=12.22" @@ -4265,8 +3090,6 @@ }, "node_modules/to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4278,14 +3101,10 @@ }, "node_modules/toggle-selection": { "version": "1.0.6", - "resolved": "https://registry.npmmirror.com/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==", "license": "MIT" }, "node_modules/ts-api-utils": { "version": "1.4.3", - "resolved": "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-1.4.3.tgz", - "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", "dev": true, "license": "MIT", "engines": { @@ -4297,8 +3116,6 @@ }, "node_modules/type-check": { "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", "dependencies": { @@ -4310,8 +3127,6 @@ }, "node_modules/type-fest": { "version": "0.20.2", - "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -4323,8 +3138,6 @@ }, "node_modules/typescript": { "version": "5.8.3", - "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -4337,8 +3150,6 @@ }, "node_modules/update-browserslist-db": { "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "dev": true, "funding": [ { @@ -4368,8 +3179,6 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -4378,8 +3187,6 @@ }, "node_modules/vite": { "version": "5.4.19", - "resolved": "https://registry.npmmirror.com/vite/-/vite-5.4.19.tgz", - "integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==", "dev": true, "license": "MIT", "dependencies": { @@ -4438,8 +3245,6 @@ }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", "dependencies": { @@ -4454,8 +3259,6 @@ }, "node_modules/word-wrap": { "version": "1.2.5", - "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "license": "MIT", "engines": { @@ -4464,22 +3267,16 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true, "license": "ISC" }, "node_modules/yallist": { "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "license": "ISC" }, "node_modules/yocto-queue": { "version": "0.1.0", - "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", "engines": { @@ -4491,8 +3288,6 @@ }, "node_modules/zustand": { "version": "5.0.6", - "resolved": "https://registry.npmmirror.com/zustand/-/zustand-5.0.6.tgz", - "integrity": "sha512-ihAqNeUVhe0MAD+X8M5UzqyZ9k3FFZLBTtqo6JLPwV53cbRB/mJwBI0PxcIgqhBBHlEs8G45OTDTMq3gNcLq3A==", "license": "MIT", "engines": { "node": ">=12.20.0" diff --git a/frontend/package.json.md5 b/frontend/package.json.md5 index c4c8cd7..382c539 100644 --- a/frontend/package.json.md5 +++ b/frontend/package.json.md5 @@ -1 +1 @@ -98e3c997ed559906a235af48ee6be17d \ No newline at end of file +340ef73da49fc2e1f0f32752fcad55cd \ No newline at end of file diff --git a/frontend/src/pages/CapturePage.tsx b/frontend/src/pages/CapturePage.tsx index 086fd48..40dfb3f 100644 --- a/frontend/src/pages/CapturePage.tsx +++ b/frontend/src/pages/CapturePage.tsx @@ -1,24 +1,19 @@ import React, {useEffect, useRef, useState} from 'react'; -import {Button, Card, Layout, message, Select, Spin, Table} from 'antd'; +import {Button, Card, Layout, message, Spin, Table} from 'antd'; import {DownloadOutlined, PlayCircleOutlined, StopOutlined, UploadOutlined} from '@ant-design/icons'; import '../App.css'; import { - GetNetworkInterfaces, ReadRawJsonFile, SaveParsedDataToDatabase, - StartCapture, + StartCaptureWithFilter, + StopCapture, StopAndParseCapture } from '../../wailsjs/go/service/App'; +import { GetCaptureStatus } from '../../wailsjs/go/service/App'; +import { EventsOn } from '../../wailsjs/runtime'; import {useCaptureStore} from '../store/useCaptureStore'; -const { Header, Content, Sider } = Layout; - -interface NetworkInterface { - name: string - description: string - addresses: string[] - is_loopback: boolean -} +const { Content, Sider } = Layout; interface Equipment { id: string @@ -40,21 +35,15 @@ interface CaptureResult { } function CapturePage() { - // 只用全局 parsedData const parsedData = useCaptureStore(state => state.parsedData); const setParsedData = useCaptureStore(state => state.setParsedData); - // 其余状态全部本地 useState - const [interfaces, setInterfaces] = useState([]); - const [selectedInterface, setSelectedInterface] = useState(''); const [isCapturing, setIsCapturing] = useState(false); - const [capturedData, setCapturedData] = useState([]); const [loading, setLoading] = useState(false); - const [interfaceLoading, setInterfaceLoading] = useState(false); const [uploadedFileName, setUploadedFileName] = useState(''); + const [statusText, setStatusText] = useState('准备就绪'); const fileInputRef = useRef(null); - // 顶部 message 只显示一次 const showMessage = (type: 'success' | 'error' | 'warning', content: string) => { message.destroy(); message[type](content); @@ -73,65 +62,91 @@ function CapturePage() { } }; - const fetchInterfaces = async () => { + const resetUiState = () => { setIsCapturing(false); - setCapturedData([]); setLoading(false); - setInterfaceLoading(true); - try { - const response = await safeApiCall( - () => GetNetworkInterfaces(), - '获取网络接口失败' - ); - if (!response || response.length === 0) { - showMessage('error', '未获取到任何网络接口'); - setInterfaces([]); - setSelectedInterface(''); - return; - } - setInterfaces(response); - let defaultSelected = ''; - console.log("获取的网卡:"+JSON.stringify(response)) - for (const iface of response) { - if (iface.addresses && iface.addresses.some(ip => ip.includes('192.168'))) { - defaultSelected = iface.name; - break; - } - } - if (!defaultSelected && response.length > 0) { - defaultSelected = response[0].name; - } - setSelectedInterface(defaultSelected); - } catch (error) { - console.error('获取网络接口时发生未知错误:', error); - showMessage('error', '获取网络接口时发生未知错误'); - setInterfaces([]); - setSelectedInterface(''); - } finally { - setInterfaceLoading(false); - } + setUploadedFileName(''); + setParsedData({ items: [], heroes: [] } as CaptureResult); + setStatusText('准备就绪'); }; + useEffect(() => { + let cancelled = false; + const syncCaptureStatus = async () => { + resetUiState(); + try { + const status = await GetCaptureStatus(); + if (!cancelled && status?.status === 'starting') { + setIsCapturing(true); + setStatusText('启动中...'); + } else if (!cancelled && status?.is_capturing) { + setIsCapturing(true); + setStatusText('抓包中'); + } + } catch (err) { + // ignore status sync errors + } + }; + syncCaptureStatus(); + return () => { + // Leave capture page: ensure backend is not left running + StopCapture().catch(() => {}); + cancelled = true; + }; + }, []); + + useEffect(() => { + const off = EventsOn('capture:ready_to_parse', () => { + setStatusText('抓包成功,待解析数据'); + }); + const offStarted = EventsOn('capture:started', () => { + setIsCapturing(true); + setStatusText('抓包中'); + }); + const offStartFailed = EventsOn('capture:start_failed', () => { + setIsCapturing(false); + setStatusText('准备就绪'); + showMessage('error', '开始抓包失败'); + }); + return () => { + off(); + offStarted(); + offStartFailed(); + }; + }, []); + const startCapture = async () => { - if (!selectedInterface) { - showMessage('warning', '请选择网络接口'); - return; - } setLoading(true); try { - const result = await safeApiCall( - () => StartCapture(selectedInterface), - '开始抓包失败' - ); - if (result === undefined) { + // Best-effort reset to avoid "capture already running" + await StopCapture().catch(() => {}); + setParsedData({ items: [], heroes: [] } as CaptureResult); + setIsCapturing(true); + setStatusText('启动中...'); + + try { + console.log('StartCaptureWithFilter calling', new Date().toISOString()); + await StartCaptureWithFilter('', ''); + console.log('StartCaptureWithFilter returned', new Date().toISOString()); + showMessage('success', '开始抓包'); + } catch (err) { + const msg = String(err); + if (msg.includes('capture already running')) { + // 后端仍在抓包,允许前端停止 + setIsCapturing(true); + setStatusText('抓包中'); + showMessage('warning', '抓包已在进行'); + return; + } setIsCapturing(false); + setStatusText('准备就绪'); + showMessage('error', '开始抓包失败'); return; } - setIsCapturing(true); - showMessage('success', '开始抓包'); } catch (error) { - console.error('开始抓包时发生未知错误:', error); + console.error('开始抓包出错:', error); setIsCapturing(false); + setStatusText('准备就绪'); showMessage('error', '开始抓包失败'); } finally { setLoading(false); @@ -139,31 +154,45 @@ function CapturePage() { }; const stopCapture = async () => { + console.log('stopCapture clicked', new Date().toISOString()); setLoading(false); - setIsCapturing(false); - setCapturedData([]); + setStatusText('抓取中...'); try { setLoading(true); - // 新接口:直接停止抓包并解析 - const parsedData = await safeApiCall( - () => StopAndParseCapture(), - '停止抓包并解析数据失败' - ); - console.log("解析数据:"+JSON.stringify(parsedData)) + console.log('StopAndParseCapture calling', new Date().toISOString()); + const parsedData = await StopAndParseCapture(); + console.log('StopAndParseCapture returned', new Date().toISOString()); if (!parsedData || !Array.isArray((parsedData as CaptureResult).items)) { setParsedData({ items: [], heroes: [] } as CaptureResult); - showMessage('error', '解析数据失败'); + setIsCapturing(false); + setStatusText('解析失败'); + showMessage('error', '解析失败'); return; } setParsedData(parsedData as CaptureResult); + setIsCapturing(false); + setStatusText('导入成功'); showMessage('success', '数据处理完成'); } catch (error) { - console.error('停止抓包时发生未知错误:', error); - setIsCapturing(false); - setCapturedData([]); + const errMsg = String(error); + console.error('停止抓包出错:', error); setParsedData({ items: [], heroes: [] } as CaptureResult); setLoading(false); - showMessage('error', '抓包失败,已重置状态'); + if (errMsg.includes('capture starting')) { + setIsCapturing(true); + setStatusText('启动中,停止已请求'); + showMessage('warning', '启动中,停止已请求'); + return; + } + if (errMsg.includes('no captured data') || errMsg.includes('没有数据')) { + setIsCapturing(false); + setStatusText('未获取到任何数据'); + showMessage('error', '未获取到任何数据'); + return; + } + setIsCapturing(false); + setStatusText('抓包失败'); + showMessage('error', '抓包失败'); return; } finally { setLoading(false); @@ -171,37 +200,26 @@ function CapturePage() { }; const exportData = () => { - // 检查是否有解析数据 if (!parsedData || !Array.isArray(parsedData.items) || parsedData.items.length === 0) { showMessage('warning', '没有数据可导出'); return; } try { - // 创建要导出的数据内容 const exportContent = JSON.stringify(parsedData, null, 2); - - // 创建 Blob 对象 const blob = new Blob([exportContent], { type: 'text/plain;charset=utf-8' }); - - // 创建下载链接 const url = URL.createObjectURL(blob); const link = document.createElement('a'); link.href = url; link.download = 'gear.txt'; - - // 触发下载 document.body.appendChild(link); link.click(); - - // 清理 document.body.removeChild(link); URL.revokeObjectURL(url); - showMessage('success', '数据导出成功'); } catch (error) { - console.error('导出数据时发生错误:', error); - showMessage('error', '导出数据失败'); + console.error('导出数据出错:', error); + showMessage('error', '数据导出失败'); } }; @@ -216,7 +234,6 @@ function CapturePage() { const text = e.target?.result as string; const json = JSON.parse(text); - // 校验数据格式 if (!json || typeof json !== 'object') { showMessage('error', '文件格式错误:不是有效的JSON对象'); return; @@ -242,23 +259,20 @@ function CapturePage() { return; } - // 数据校验通过,保存到数据库 const sessionName = `import_${Date.now()}`; const equipmentJSON = JSON.stringify(json.items); const heroesJSON = JSON.stringify(json.heroes); await SaveParsedDataToDatabase(sessionName, equipmentJSON, heroesJSON); - // 更新界面显示 const safeData = { items: json.items, heroes: json.heroes }; setParsedData(safeData); - setUploadedFileName(''); // 清空文件名显示 - - showMessage('success', `数据导入成功:${json.items.length}件装备,${json.heroes.length}个英雄,已保存到数据库`); + setUploadedFileName(''); + showMessage('success', `导入成功:${json.items.length}件装备,${json.heroes.length}个英雄`); } catch (err) { console.error('文件处理错误:', err); if (err instanceof SyntaxError) { @@ -276,7 +290,6 @@ function CapturePage() { setLoading(true); try { const json = await ReadRawJsonFile(); - console.log('已加载本地解析数据:', json); const safeData = { items: Array.isArray(json.items) ? json.items : [], heroes: Array.isArray(json.heroes) ? json.heroes : [] @@ -306,52 +319,15 @@ function CapturePage() { fileInputRef.current?.click(); }; - useEffect(() => { - fetchInterfaces(); - }, []); - const equipmentColumns = [ - { - title: 'ID', - dataIndex: 'id', - key: 'id', - }, - { - title: '代码', - dataIndex: 'code', - key: 'code', - }, - { - title: '等级', - dataIndex: 'g', - key: 'g', - }, - { - title: '经验', - dataIndex: 'e', - key: 'e', - }, - { - title: '锁定', - dataIndex: 'l', - key: 'l', - render: (locked: boolean) => locked ? '是' : '否', - }, - { - title: '魔法值', - dataIndex: 'mg', - key: 'mg', - }, - { - title: '力量', - dataIndex: 'p', - key: 'p', - }, - { - title: '技能', - dataIndex: 'sk', - key: 'sk', - }, + { title: 'ID', dataIndex: 'id', key: 'id' }, + { title: '代码', dataIndex: 'code', key: 'code' }, + { title: '等级', dataIndex: 'g', key: 'g' }, + { title: '经验', dataIndex: 'e', key: 'e' }, + { title: '锁定', dataIndex: 'l', key: 'l', render: (locked: boolean) => locked ? '是' : '否' }, + { title: '魔法值', dataIndex: 'mg', key: 'mg' }, + { title: '力量', dataIndex: 'p', key: 'p' }, + { title: '技能', dataIndex: 'sk', key: 'sk' }, ]; return ( @@ -359,30 +335,13 @@ function CapturePage() {
-
- - -
-
- - 显示最新一次抓包解析的数据 - + setRenameValue(e.target.value)} + placeholder="请输入名称" + maxLength={50} + /> + ); }; -export default DatabasePage; \ No newline at end of file +export default DatabasePage; diff --git a/frontend/wailsjs/go/models.ts b/frontend/wailsjs/go/models.ts index b6c8952..7c07670 100644 --- a/frontend/wailsjs/go/models.ts +++ b/frontend/wailsjs/go/models.ts @@ -48,6 +48,22 @@ export namespace model { this.heroes = source["heroes"]; } } + export class ParsedSession { + id: number; + session_name: string; + created_at: number; + + static createFrom(source: any = {}) { + return new ParsedSession(source); + } + + constructor(source: any = {}) { + if ('string' === typeof source) source = JSON.parse(source); + this.id = source["id"]; + this.session_name = source["session_name"]; + this.created_at = source["created_at"]; + } + } } diff --git a/frontend/wailsjs/go/service/App.d.ts b/frontend/wailsjs/go/service/App.d.ts index 4b76fe6..d31de32 100644 --- a/frontend/wailsjs/go/service/App.d.ts +++ b/frontend/wailsjs/go/service/App.d.ts @@ -2,6 +2,8 @@ // This file is automatically generated. DO NOT EDIT import {model} from '../models'; +export function DeleteParsedSession(arg1:number):Promise; + export function ExportCurrentData(arg1:string):Promise; export function ExportData(arg1:Array,arg2:string):Promise; @@ -20,6 +22,10 @@ export function GetLatestParsedDataFromDatabase():Promise; export function GetNetworkInterfaces():Promise>; +export function GetParsedDataByID(arg1:number):Promise; + +export function GetParsedSessions():Promise>; + export function ParseData(arg1:Array):Promise; export function ReadRawJsonFile():Promise; @@ -30,6 +36,10 @@ export function SaveParsedDataToDatabase(arg1:string,arg2:string,arg3:string):Pr export function StartCapture(arg1:string):Promise; +export function StartCaptureWithFilter(arg1:string,arg2:string):Promise; + export function StopAndParseCapture():Promise; export function StopCapture():Promise; + +export function UpdateParsedSessionName(arg1:number,arg2:string):Promise; diff --git a/frontend/wailsjs/go/service/App.js b/frontend/wailsjs/go/service/App.js index 497ea1c..ce4dee4 100644 --- a/frontend/wailsjs/go/service/App.js +++ b/frontend/wailsjs/go/service/App.js @@ -2,6 +2,10 @@ // Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL // This file is automatically generated. DO NOT EDIT +export function DeleteParsedSession(arg1) { + return window['go']['service']['App']['DeleteParsedSession'](arg1); +} + export function ExportCurrentData(arg1) { return window['go']['service']['App']['ExportCurrentData'](arg1); } @@ -38,6 +42,14 @@ export function GetNetworkInterfaces() { return window['go']['service']['App']['GetNetworkInterfaces'](); } +export function GetParsedDataByID(arg1) { + return window['go']['service']['App']['GetParsedDataByID'](arg1); +} + +export function GetParsedSessions() { + return window['go']['service']['App']['GetParsedSessions'](); +} + export function ParseData(arg1) { return window['go']['service']['App']['ParseData'](arg1); } @@ -58,6 +70,10 @@ export function StartCapture(arg1) { return window['go']['service']['App']['StartCapture'](arg1); } +export function StartCaptureWithFilter(arg1, arg2) { + return window['go']['service']['App']['StartCaptureWithFilter'](arg1, arg2); +} + export function StopAndParseCapture() { return window['go']['service']['App']['StopAndParseCapture'](); } @@ -65,3 +81,7 @@ export function StopAndParseCapture() { export function StopCapture() { return window['go']['service']['App']['StopCapture'](); } + +export function UpdateParsedSessionName(arg1, arg2) { + return window['go']['service']['App']['UpdateParsedSessionName'](arg1, arg2); +} diff --git a/frontend/wailsjs/runtime/runtime.js b/frontend/wailsjs/runtime/runtime.js index 623397b..7cb89d7 100644 --- a/frontend/wailsjs/runtime/runtime.js +++ b/frontend/wailsjs/runtime/runtime.js @@ -48,6 +48,10 @@ export function EventsOff(eventName, ...additionalEventNames) { return window.runtime.EventsOff(eventName, ...additionalEventNames); } +export function EventsOffAll() { + return window.runtime.EventsOffAll(); +} + export function EventsOnce(eventName, callback) { return EventsOnMultiple(eventName, callback, 1); } diff --git a/go.mod b/go.mod index 16cb5a3..5830d6a 100644 --- a/go.mod +++ b/go.mod @@ -6,17 +6,20 @@ toolchain go1.24.4 require ( github.com/google/gopacket v1.1.19 - github.com/mattn/go-sqlite3 v1.14.17 - github.com/wailsapp/wails/v2 v2.10.1 + github.com/wailsapp/wails/v2 v2.11.0 go.uber.org/zap v1.26.0 gopkg.in/natefinch/lumberjack.v2 v2.2.1 + modernc.org/sqlite v1.29.0 ) require ( github.com/bep/debounce v1.2.1 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/websocket v1.5.3 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e // indirect github.com/labstack/echo/v4 v4.13.3 // indirect github.com/labstack/gommon v0.4.2 // indirect @@ -26,18 +29,26 @@ require ( github.com/leaanthony/u v1.1.1 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect + github.com/ncruces/go-strftime v0.1.9 // indirect github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/pkg/errors v0.9.1 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/samber/lo v1.49.1 // indirect github.com/tkrajina/go-reflector v0.5.8 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasttemplate v1.2.2 // indirect - github.com/wailsapp/go-webview2 v1.0.19 // indirect + github.com/wailsapp/go-webview2 v1.0.22 // indirect github.com/wailsapp/mimetype v1.4.1 // indirect go.uber.org/multierr v1.10.0 // indirect golang.org/x/crypto v0.33.0 // indirect golang.org/x/net v0.35.0 // indirect golang.org/x/sys v0.30.0 // indirect golang.org/x/text v0.22.0 // indirect + modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 // indirect + modernc.org/libc v1.41.0 // indirect + modernc.org/mathutil v1.6.0 // indirect + modernc.org/memory v1.7.2 // indirect + modernc.org/strutil v1.2.0 // indirect + modernc.org/token v1.1.0 // indirect ) diff --git a/go.sum b/go.sum index eb26d38..9353359 100644 --- a/go.sum +++ b/go.sum @@ -2,14 +2,22 @@ github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY= github.com/bep/debounce v1.2.1/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= +github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= +github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e h1:Q3+PugElBCf4PFpxhErSzU3/PY5sFL5Z6rfv4AbGAck= github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e/go.mod h1:alcuEEnZsY1WQsagKhZDsoPCRoOijYqhZvPwLG0kzVs= github.com/labstack/echo/v4 v4.13.3 h1:pwhpCPrTl5qry5HRdM5FwdXnhXSLSY+WE+YQSeCaafY= @@ -34,14 +42,18 @@ github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovk github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-sqlite3 v1.14.17 h1:mCRHCLDUBXgpKAqIKsaAaAsrAlbkeomtRFKXh2L6YIM= -github.com/mattn/go-sqlite3 v1.14.17/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= +github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= +github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= @@ -55,12 +67,12 @@ github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6Kllzaw github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/wailsapp/go-webview2 v1.0.19 h1:7U3QcDj1PrBPaxJNCui2k1SkWml+Q5kvFUFyTImA6NU= -github.com/wailsapp/go-webview2 v1.0.19/go.mod h1:qJmWAmAmaniuKGZPWwne+uor3AHMB5PFhqiK0Bbj8kc= +github.com/wailsapp/go-webview2 v1.0.22 h1:YT61F5lj+GGaat5OB96Aa3b4QA+mybD0Ggq6NZijQ58= +github.com/wailsapp/go-webview2 v1.0.22/go.mod h1:qJmWAmAmaniuKGZPWwne+uor3AHMB5PFhqiK0Bbj8kc= github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs= github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o= -github.com/wailsapp/wails/v2 v2.10.1 h1:QWHvWMXII2nI/nXz77gpPG8P3ehl6zKe+u4su5BWIns= -github.com/wailsapp/wails/v2 v2.10.1/go.mod h1:zrebnFV6MQf9kx8HI4iAv63vsR5v67oS7GTEZ7Pz1TY= +github.com/wailsapp/wails/v2 v2.11.0 h1:seLacV8pqupq32IjS4Y7V8ucab0WZwtK6VvUVxSBtqQ= +github.com/wailsapp/wails/v2 v2.11.0/go.mod h1:jrf0ZaM6+GBc1wRmXsM8cIvzlg0karYin3erahI4+0k= go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= @@ -73,12 +85,16 @@ golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM= +golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8= golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -96,8 +112,24 @@ golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY= +golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI= +modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4= +modernc.org/libc v1.41.0 h1:g9YAc6BkKlgORsUWj+JwqoB1wU3o4DE3bM3yvA3k+Gk= +modernc.org/libc v1.41.0/go.mod h1:w0eszPsiXoOnoMJgrXjglgLuDy/bt5RR4y3QzUUeodY= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= +modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= +modernc.org/sqlite v1.29.0 h1:lQVw+ZsFM3aRG5m4myG70tbXpr3S/J1ej0KHIP4EvjM= +modernc.org/sqlite v1.29.0/go.mod h1:hG41jCYxOAOoO6BRK66AdRlmOcDzXf7qnwlwjUIOqa0= +modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= +modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= diff --git a/internal/capture/capture.go b/internal/capture/capture.go index e86d189..6206b82 100644 --- a/internal/capture/capture.go +++ b/internal/capture/capture.go @@ -1,9 +1,13 @@ package capture import ( + "errors" "fmt" + "io" "log" + "sort" "sync" + "sync/atomic" "time" "equipment-analyzer/internal/model" @@ -13,13 +17,28 @@ import ( ) type PacketCapture struct { - handle *pcap.Handle + handles []*pcap.Handle isCapturing bool - stopChan chan bool + stopChan chan struct{} mutex sync.RWMutex tcpProcessor *TCPProcessor dataChan chan *model.TCPData errorChan chan error + totalPackets uint64 + tcpPackets uint64 + payloads uint64 + portCounts map[uint16]uint64 + ipCounts map[string]uint64 +} + +type CaptureStats struct { + TotalPackets uint64 + TCPPackets uint64 + PayloadPackets uint64 + AckGroups int + UniquePayloads int + RawSegments int + FinalBuffers int } type Config struct { @@ -31,10 +50,12 @@ type Config struct { func NewPacketCapture() *PacketCapture { return &PacketCapture{ - stopChan: make(chan bool), + stopChan: make(chan struct{}), tcpProcessor: NewTCPProcessor(), dataChan: make(chan *model.TCPData, 1000), errorChan: make(chan error, 100), + portCounts: make(map[uint16]uint64), + ipCounts: make(map[string]uint64), } } @@ -46,46 +67,93 @@ func (pc *PacketCapture) Start(config Config) error { return fmt.Errorf("capture already running") } - // 打开网络接口 - handle, err := pcap.OpenLive( - config.InterfaceName, - int32(config.BufferSize), - true, // promiscuous - config.Timeout, - ) - if err != nil { - return fmt.Errorf("failed to open interface: %v", err) + atomic.StoreUint64(&pc.totalPackets, 0) + atomic.StoreUint64(&pc.tcpPackets, 0) + atomic.StoreUint64(&pc.payloads, 0) + pc.resetStats() + + if pc.stopChan == nil { + pc.stopChan = make(chan struct{}) } - // 设置过滤器 - if err := handle.SetBPFFilter(config.Filter); err != nil { - handle.Close() - return fmt.Errorf("failed to set filter: %v", err) + interfaces := []string{} + if config.InterfaceName != "" { + interfaces = []string{config.InterfaceName} + } else { + interfaces = findWorkingInterfaces() } - pc.handle = handle + log.Printf("[capture] start: interfaces=%v filter=%q timeout=%s buffer_size=%d", + interfaces, config.Filter, config.Timeout, config.BufferSize) + + var opened []*pcap.Handle + for _, iface := range interfaces { + handle, err := pcap.OpenLive( + iface, + int32(config.BufferSize), + true, + config.Timeout, + ) + if err != nil { + log.Printf("[capture] OpenLive failed: interface=%s err=%v", iface, err) + continue + } + + if config.Filter != "" { + if err := handle.SetBPFFilter(config.Filter); err != nil { + handle.Close() + log.Printf("[capture] SetBPFFilter failed: interface=%s filter=%q err=%v", iface, config.Filter, err) + continue + } + log.Printf("[capture] SetBPFFilter applied: interface=%s filter=%q", iface, config.Filter) + } else { + log.Printf("[capture] SetBPFFilter skipped: interface=%s filter=empty", iface) + } + opened = append(opened, handle) + } + + if len(opened) == 0 { + return fmt.Errorf("failed to open any interfaces") + } + + pc.handles = opened pc.isCapturing = true - - // 启动抓包协程 - go pc.captureLoop() + for _, h := range pc.handles { + go pc.captureLoop(h) + } return nil } func (pc *PacketCapture) Stop() { pc.mutex.Lock() - defer pc.mutex.Unlock() if !pc.isCapturing { + pc.mutex.Unlock() return } pc.isCapturing = false - close(pc.stopChan) - - if pc.handle != nil { - pc.handle.Close() + if pc.stopChan != nil { + close(pc.stopChan) + pc.stopChan = nil } + + stats := pc.GetStats() + portsSnapshot, ipsSnapshot := pc.snapshotStatsLocked() + + for _, h := range pc.handles { + if h != nil { + h.Close() + } + } + pc.handles = nil + + pc.mutex.Unlock() + + log.Printf("[capture] stop: total=%d tcp=%d payload=%d ack_groups=%d unique_payloads=%d raw_segments=%d final_buffers=%d", + stats.TotalPackets, stats.TCPPackets, stats.PayloadPackets, stats.AckGroups, stats.UniquePayloads, stats.RawSegments, stats.FinalBuffers) + pc.logTopStatsFromSnapshots(portsSnapshot, ipsSnapshot) } func (pc *PacketCapture) IsCapturing() bool { @@ -94,10 +162,9 @@ func (pc *PacketCapture) IsCapturing() bool { return pc.isCapturing } -func (pc *PacketCapture) captureLoop() { - packetSource := gopacket.NewPacketSource(pc.handle, pc.handle.LinkType()) - - log.Println("[抓包] 开始监听数据包...") +func (pc *PacketCapture) captureLoop(handle *pcap.Handle) { + packetSource := gopacket.NewPacketSource(handle, handle.LinkType()) + log.Println("[capture] packet loop started") for { select { @@ -106,37 +173,73 @@ func (pc *PacketCapture) captureLoop() { default: packet, err := packetSource.NextPacket() if err != nil { + if errors.Is(err, io.EOF) || err.Error() == "EOF" { + return + } if err.Error() == "Timeout Expired" { - // 静默跳过超时 continue } - log.Printf("Error reading packet: %v", err) + log.Printf("[capture] NextPacket error: %v", err) continue } - // 处理TCP包 + atomic.AddUint64(&pc.totalPackets, 1) pc.processTCPPacket(packet) } } } +func findWorkingInterfaces() []string { + devs, err := pcap.FindAllDevs() + if err != nil { + log.Printf("[capture] FindAllDevs failed: %v", err) + return nil + } + + for _, dev := range devs { + log.Printf("[capture] iface: name=%s desc=%q addrs=%v", dev.Name, dev.Description, dev.Addresses) + } + + all := make([]string, 0, len(devs)) + for _, dev := range devs { + all = append(all, dev.Name) + } + return uniqueStrings(all) +} + +func uniqueStrings(in []string) []string { + seen := make(map[string]struct{}, len(in)) + out := make([]string, 0, len(in)) + for _, v := range in { + if _, ok := seen[v]; ok { + continue + } + seen[v] = struct{}{} + out = append(out, v) + } + return out +} + func (pc *PacketCapture) processTCPPacket(packet gopacket.Packet) { + ipLayer := packet.Layer(layers.LayerTypeIPv4) + tcpLayer := packet.Layer(layers.LayerTypeTCP) if tcpLayer == nil { return } + atomic.AddUint64(&pc.tcpPackets, 1) tcp, ok := tcpLayer.(*layers.TCP) if !ok { return } - // 提取TCP负载 if len(tcp.Payload) == 0 { return } + atomic.AddUint64(&pc.payloads, 1) + pc.recordTCPStats(tcp, ipLayer) - // 创建TCP数据包 tcpData := &model.TCPData{ Payload: tcp.Payload, Seq: uint32(tcp.Seq), @@ -145,18 +248,101 @@ func (pc *PacketCapture) processTCPPacket(packet gopacket.Packet) { DstPort: uint16(tcp.DstPort), } - // 发送给TCP处理器 pc.tcpProcessor.ProcessPacket(tcpData) } +func (pc *PacketCapture) resetStats() { + pc.portCounts = make(map[uint16]uint64) + pc.ipCounts = make(map[string]uint64) +} + +func (pc *PacketCapture) recordTCPStats(tcp *layers.TCP, ipLayer gopacket.Layer) { + pc.mutex.Lock() + defer pc.mutex.Unlock() + + pc.portCounts[uint16(tcp.SrcPort)]++ + pc.portCounts[uint16(tcp.DstPort)]++ + + if ipLayer == nil { + return + } + if ip, ok := ipLayer.(*layers.IPv4); ok { + pc.ipCounts[ip.SrcIP.String()]++ + pc.ipCounts[ip.DstIP.String()]++ + } +} + +type kvU16 struct { + Key uint16 + Value uint64 +} + +type kvStr struct { + Key string + Value uint64 +} + +func (pc *PacketCapture) snapshotStatsLocked() ([]kvU16, []kvStr) { + ports := make([]kvU16, 0, len(pc.portCounts)) + for k, v := range pc.portCounts { + ports = append(ports, kvU16{Key: k, Value: v}) + } + + ips := make([]kvStr, 0, len(pc.ipCounts)) + for k, v := range pc.ipCounts { + ips = append(ips, kvStr{Key: k, Value: v}) + } + + return ports, ips +} + +func (pc *PacketCapture) logTopStatsFromSnapshots(ports []kvU16, ips []kvStr) { + sort.Slice(ports, func(i, j int) bool { return ports[i].Value > ports[j].Value }) + sort.Slice(ips, func(i, j int) bool { return ips[i].Value > ips[j].Value }) + + maxPorts := 10 + if len(ports) < maxPorts { + maxPorts = len(ports) + } + maxIPs := 10 + if len(ips) < maxIPs { + maxIPs = len(ips) + } + + log.Printf("[capture] top tcp ports: %v", ports[:maxPorts]) + log.Printf("[capture] top tcp ips: %v", ips[:maxIPs]) +} + func (pc *PacketCapture) GetCapturedData() []string { return pc.tcpProcessor.GetFinalBuffer() } +func (pc *PacketCapture) GetPortCount(port uint16) uint64 { + pc.mutex.RLock() + defer pc.mutex.RUnlock() + return pc.portCounts[port] +} + func (pc *PacketCapture) ProcessAllData() { + start := time.Now() + log.Printf("[capture] ProcessAllData started") pc.tcpProcessor.ProcessAllData() + log.Printf("[capture] ProcessAllData finished in %s", time.Since(start)) } func (pc *PacketCapture) Clear() { pc.tcpProcessor.Clear() } + +func (pc *PacketCapture) GetStats() CaptureStats { + processorStats := pc.tcpProcessor.Stats() + return CaptureStats{ + TotalPackets: atomic.LoadUint64(&pc.totalPackets), + TCPPackets: atomic.LoadUint64(&pc.tcpPackets), + PayloadPackets: atomic.LoadUint64(&pc.payloads), + AckGroups: processorStats.AckGroups, + UniquePayloads: processorStats.UniquePayloads, + RawSegments: processorStats.RawSegmentCount, + FinalBuffers: processorStats.FinalBufferSize, + } +} diff --git a/internal/capture/processor.go b/internal/capture/processor.go index 6d1e4a6..2fc3fd1 100644 --- a/internal/capture/processor.go +++ b/internal/capture/processor.go @@ -9,6 +9,13 @@ import ( "sync" ) +type ProcessorStats struct { + AckGroups int + UniquePayloads int + RawSegmentCount int + FinalBufferSize int +} + type TCPProcessor struct { mutex sync.RWMutex ackData map[uint32][]*model.TCPData @@ -94,3 +101,20 @@ func (tp *TCPProcessor) Clear() { tp.finalBuffer = make([]string, 0) tp.loads = make(map[string]bool) } + +func (tp *TCPProcessor) Stats() ProcessorStats { + tp.mutex.RLock() + defer tp.mutex.RUnlock() + + rawSegmentCount := 0 + for _, dataList := range tp.ackData { + rawSegmentCount += len(dataList) + } + + return ProcessorStats{ + AckGroups: len(tp.ackData), + UniquePayloads: len(tp.loads), + RawSegmentCount: rawSegmentCount, + FinalBufferSize: len(tp.finalBuffer), + } +} diff --git a/internal/model/database.go b/internal/model/database.go index 96c147a..8eff793 100644 --- a/internal/model/database.go +++ b/internal/model/database.go @@ -3,11 +3,12 @@ package model import ( "database/sql" "fmt" + "log" "os" "path/filepath" "time" - _ "github.com/mattn/go-sqlite3" + _ "modernc.org/sqlite" ) // Database 数据库管理器 @@ -18,31 +19,37 @@ type Database struct { // NewDatabase 创建新的数据库连接 func NewDatabase() (*Database, error) { dbPath := getDatabasePath() - + log.Printf("[db] init: path=%s", dbPath) + // 确保目录存在 dir := filepath.Dir(dbPath) if err := os.MkdirAll(dir, 0755); err != nil { + log.Printf("[db] mkdir failed: dir=%s err=%v", dir, err) return nil, fmt.Errorf("创建数据库目录失败: %w", err) } // 连接数据库 - db, err := sql.Open("sqlite3", dbPath) + db, err := sql.Open("sqlite", dbPath) if err != nil { + log.Printf("[db] open failed: path=%s err=%v", dbPath, err) return nil, fmt.Errorf("连接数据库失败: %w", err) } // 测试连接 if err := db.Ping(); err != nil { + log.Printf("[db] ping failed: err=%v", err) return nil, fmt.Errorf("数据库连接测试失败: %w", err) } database := &Database{db: db} - + // 初始化表结构 if err := database.initTables(); err != nil { + log.Printf("[db] init tables failed: err=%v", err) return nil, fmt.Errorf("初始化数据库表失败: %w", err) } + log.Printf("[db] init ok") return database, nil } @@ -115,13 +122,76 @@ func (d *Database) GetLatestParsedData() (string, string, error) { var itemsJSON, heroesJSON string err := d.db.QueryRow(stmt).Scan(&itemsJSON, &heroesJSON) if err != nil { + if err == sql.ErrNoRows { + return "", "", nil + } return "", "", err } return itemsJSON, heroesJSON, nil } +// GetParsedSessions 获取所有解析会话 +func (d *Database) GetParsedSessions() ([]ParsedSession, error) { + stmt := ` + SELECT id, session_name, created_at + FROM parsed_data + ORDER BY created_at DESC` + rows, err := d.db.Query(stmt) + if err != nil { + return nil, err + } + defer rows.Close() + + sessions := make([]ParsedSession, 0) + for rows.Next() { + var s ParsedSession + if err := rows.Scan(&s.ID, &s.SessionName, &s.CreatedAt); err != nil { + return nil, err + } + sessions = append(sessions, s) + } + return sessions, nil +} + +// GetParsedDataByID 获取指定会话的数据 +func (d *Database) GetParsedDataByID(id int64) (string, string, error) { + stmt := ` + SELECT items_json, heroes_json + FROM parsed_data + WHERE id = ? + LIMIT 1` + + var itemsJSON, heroesJSON string + err := d.db.QueryRow(stmt, id).Scan(&itemsJSON, &heroesJSON) + if err != nil { + if err == sql.ErrNoRows { + return "", "", nil + } + return "", "", err + } + return itemsJSON, heroesJSON, nil +} + +// UpdateParsedSessionName 更新解析会话名称 +func (d *Database) UpdateParsedSessionName(id int64, name string) error { + stmt := ` + UPDATE parsed_data + SET session_name = ? + WHERE id = ?` + _, err := d.db.Exec(stmt, name, id) + return err +} + +// DeleteParsedSession 删除解析会话 +func (d *Database) DeleteParsedSession(id int64) error { + stmt := ` + DELETE FROM parsed_data + WHERE id = ?` + _, err := d.db.Exec(stmt, id) + return err +} // SaveSetting 保存应用设置 func (d *Database) SaveSetting(key, value string) error { @@ -160,4 +230,4 @@ func (d *Database) GetAllSettings() (map[string]string, error) { } return settings, nil -} \ No newline at end of file +} diff --git a/internal/model/packet.go b/internal/model/packet.go index 829ef87..a9fd7ed 100644 --- a/internal/model/packet.go +++ b/internal/model/packet.go @@ -35,3 +35,10 @@ type ParsedResult struct { Items []interface{} `json:"items"` Heroes []interface{} `json:"heroes"` } + +// ParsedSession 解析数据会话信息 +type ParsedSession struct { + ID int64 `json:"id"` + SessionName string `json:"session_name"` + CreatedAt int64 `json:"created_at"` +} diff --git a/internal/service/capture_service.go b/internal/service/capture_service.go index 9e88aad..363e0c1 100644 --- a/internal/service/capture_service.go +++ b/internal/service/capture_service.go @@ -3,6 +3,7 @@ package service import ( "context" "fmt" + "log" "sync" "time" @@ -17,54 +18,110 @@ type CaptureService struct { logger *utils.Logger packetCapture *capture.PacketCapture processor *capture.TCPProcessor + parser *ParserService + beforeRemote func() mutex sync.RWMutex isCapturing bool + isStarting bool + pendingStop bool dataChan chan *model.CaptureResult errorChan chan error } -func NewCaptureService(cfg *config.Config, logger *utils.Logger) *CaptureService { +func NewCaptureService(cfg *config.Config, logger *utils.Logger, parser *ParserService) *CaptureService { return &CaptureService{ config: cfg, logger: logger, packetCapture: capture.NewPacketCapture(), processor: capture.NewTCPProcessor(), + parser: parser, dataChan: make(chan *model.CaptureResult, 100), errorChan: make(chan error, 100), } } -// StartCapture 开始抓包 -func (cs *CaptureService) StartCapture(ctx context.Context, config capture.Config) error { +func (cs *CaptureService) SetBeforeRemote(fn func()) { + cs.mutex.Lock() + defer cs.mutex.Unlock() + cs.beforeRemote = fn +} + +func (cs *CaptureService) StartCaptureAsync(ctx context.Context, config capture.Config, onStarted func(), onError func(error)) error { cs.mutex.Lock() defer cs.mutex.Unlock() - if cs.isCapturing { + if cs.isCapturing || cs.isStarting { return fmt.Errorf("capture already running") } - if err := cs.packetCapture.Start(config); err != nil { - return fmt.Errorf("failed to start capture: %w", err) - } + cs.isStarting = true + cs.pendingStop = false - cs.isCapturing = true - cs.logger.Info("Packet capture started", "interface", config.InterfaceName) + cs.logger.Info("StartCapture requested", + "interface", config.InterfaceName, + "filter", config.Filter, + "timeout_ms", config.Timeout.Milliseconds(), + "buffer_size", config.BufferSize, + ) + + go func() { + if err := cs.packetCapture.Start(config); err != nil { + cs.logger.Error("Packet capture start failed", "error", err) + cs.mutex.Lock() + cs.isStarting = false + cs.mutex.Unlock() + if onError != nil { + onError(fmt.Errorf("failed to start capture: %w", err)) + } + return + } + + var shouldStop bool + cs.mutex.Lock() + cs.isStarting = false + cs.isCapturing = true + shouldStop = cs.pendingStop + cs.pendingStop = false + cs.mutex.Unlock() + + cs.logger.Info("Packet capture started", "interface", config.InterfaceName) + if onStarted != nil { + onStarted() + } + if shouldStop { + _, _ = cs.StopAndParseCapture() + } + }() - // 启动数据处理协程 go cs.processData(ctx) - return nil } -// StopCapture 停止抓包 func (cs *CaptureService) StopCapture() error { cs.mutex.Lock() defer cs.mutex.Unlock() + if cs.isStarting { + cs.pendingStop = true + cs.logger.Info("StopCapture queued while starting") + return nil + } + if !cs.isCapturing { return fmt.Errorf("capture not running") } + beforeStats := cs.packetCapture.GetStats() + cs.logger.Info("StopCapture requested", + "total_packets", beforeStats.TotalPackets, + "tcp_packets", beforeStats.TCPPackets, + "payload_packets", beforeStats.PayloadPackets, + "ack_groups", beforeStats.AckGroups, + "unique_payloads", beforeStats.UniquePayloads, + "raw_segments", beforeStats.RawSegments, + "final_buffers", beforeStats.FinalBuffers, + ) + cs.packetCapture.Stop() cs.isCapturing = false cs.logger.Info("Packet capture stopped") @@ -72,62 +129,139 @@ func (cs *CaptureService) StopCapture() error { return nil } -// GetCapturedData 获取抓包数据 func (cs *CaptureService) GetCapturedData() []string { return cs.packetCapture.GetCapturedData() } -// ProcessAllData 处理所有数据 func (cs *CaptureService) ProcessAllData() { cs.packetCapture.ProcessAllData() } -// IsCapturing 检查是否正在抓包 func (cs *CaptureService) IsCapturing() bool { cs.mutex.RLock() defer cs.mutex.RUnlock() return cs.isCapturing } -// processData 处理抓包数据 +func (cs *CaptureService) IsStarting() bool { + cs.mutex.RLock() + defer cs.mutex.RUnlock() + return cs.isStarting +} + func (cs *CaptureService) processData(ctx context.Context) { + ticker := time.NewTicker(3 * time.Second) + defer ticker.Stop() + for { select { case <-ctx.Done(): return - default: - // 这里可以添加实时数据处理逻辑 - time.Sleep(100 * time.Millisecond) + case <-ticker.C: + if !cs.IsCapturing() { + continue + } + stats := cs.packetCapture.GetStats() + cs.logger.Info("Capture heartbeat", + "total_packets", stats.TotalPackets, + "tcp_packets", stats.TCPPackets, + "payload_packets", stats.PayloadPackets, + "ack_groups", stats.AckGroups, + "unique_payloads", stats.UniquePayloads, + "raw_segments", stats.RawSegments, + "final_buffers", stats.FinalBuffers, + ) } } } -// StopAndParseCapture 停止抓包并解析数据 -func (cs *CaptureService) StopAndParseCapture(parser *ParserService) (*model.ParsedResult, error) { +func (cs *CaptureService) StopAndParseCapture() (*model.ParsedResult, error) { + log.Printf("[service] StopAndParseCapture enter") cs.mutex.Lock() - defer cs.mutex.Unlock() - + if cs.isStarting { + cs.pendingStop = true + cs.mutex.Unlock() + log.Printf("[service] StopAndParseCapture queued while starting") + return nil, fmt.Errorf("capture starting") + } if !cs.isCapturing { + cs.mutex.Unlock() + log.Printf("[service] StopAndParseCapture exit: not running") return nil, fmt.Errorf("capture not running") } + cs.mutex.Unlock() + beforeStop := cs.packetCapture.GetStats() + cs.logger.Info("StopAndParseCapture requested", + "total_packets", beforeStop.TotalPackets, + "tcp_packets", beforeStop.TCPPackets, + "payload_packets", beforeStop.PayloadPackets, + "ack_groups", beforeStop.AckGroups, + "unique_payloads", beforeStop.UniquePayloads, + "raw_segments", beforeStop.RawSegments, + "final_buffers", beforeStop.FinalBuffers, + ) + + log.Printf("[service] StopAndParseCapture stopping packet capture") cs.packetCapture.Stop() + log.Printf("[service] StopAndParseCapture packet capture stopped") cs.isCapturing = false cs.logger.Info("Packet capture stopped (StopAndParseCapture)") - // 处理所有收集的数据 cs.packetCapture.ProcessAllData() + afterProcess := cs.packetCapture.GetStats() + cs.logger.Info("ProcessAllData finished", + "total_packets", afterProcess.TotalPackets, + "tcp_packets", afterProcess.TCPPackets, + "payload_packets", afterProcess.PayloadPackets, + "ack_groups", afterProcess.AckGroups, + "unique_payloads", afterProcess.UniquePayloads, + "raw_segments", afterProcess.RawSegments, + "final_buffers", afterProcess.FinalBuffers, + ) - // 获取抓包数据 - rawData := cs.packetCapture.GetCapturedData() - if len(rawData) == 0 { + port5222 := cs.packetCapture.GetPortCount(5222) + port3333 := cs.packetCapture.GetPortCount(3333) + if port5222 == 0 && port3333 == 0 { + cs.logger.Warn("No target port data after processing", + "port_5222", port5222, + "port_3333", port3333, + ) return nil, fmt.Errorf("no captured data") } - // 解析数据 - result, _, err := parser.ParseHexData(rawData) + if afterProcess.FinalBuffers == 0 { + cs.logger.Warn("No captured data after processing", "hint", "check interface and bpf filter") + return nil, fmt.Errorf("no captured data") + } + + rawData := cs.packetCapture.GetCapturedData() + cs.logger.Info("Captured raw data snapshot", "hex_chunks", len(rawData)) + if len(rawData) == 0 { + cs.logger.Warn("No captured data after stop", "hint", "check interface and bpf filter") + return nil, fmt.Errorf("no captured data") + } + + parseStart := time.Now() + cs.logger.Info("ParseHexData starting", + "port_5222", port5222, + "port_3333", port3333, + "final_buffers", afterProcess.FinalBuffers, + "hex_chunks", len(rawData), + ) + cs.mutex.RLock() + beforeRemote := cs.beforeRemote + cs.mutex.RUnlock() + if beforeRemote != nil { + beforeRemote() + } + result, _, err := cs.parser.ParseHexData(rawData) + cs.logger.Info("ParseHexData finished", "duration_ms", time.Since(parseStart).Milliseconds()) if err != nil { + cs.logger.Error("ParseHexData failed", "error", err, "hex_chunks", len(rawData)) return nil, fmt.Errorf("解析数据失败: %v", err) } + + cs.logger.Info("ParseHexData succeeded", "items", len(result.Items), "heroes", len(result.Heroes)) return result, nil } diff --git a/internal/service/database_service.go b/internal/service/database_service.go index e579f4a..ea2b956 100644 --- a/internal/service/database_service.go +++ b/internal/service/database_service.go @@ -45,6 +45,44 @@ func (s *DatabaseService) GetLatestParsedDataFromDatabase() (string, string, err return itemsJSON, heroesJSON, nil } +// GetParsedSessions 从数据库获取所有解析会话 +func (s *DatabaseService) GetParsedSessions() ([]model.ParsedSession, error) { + sessions, err := s.db.GetParsedSessions() + if err != nil { + s.logger.Error("从数据库获取解析会话失败", "error", err) + return nil, fmt.Errorf("获取解析会话失败: %w", err) + } + return sessions, nil +} + +// GetParsedDataByID 从数据库获取指定会话数据 +func (s *DatabaseService) GetParsedDataByID(id int64) (string, string, error) { + itemsJSON, heroesJSON, err := s.db.GetParsedDataByID(id) + if err != nil { + s.logger.Error("从数据库获取解析数据失败", "error", err, "id", id) + return "", "", fmt.Errorf("获取解析数据失败: %w", err) + } + return itemsJSON, heroesJSON, nil +} + +// UpdateParsedSessionName 更新解析会话名称 +func (s *DatabaseService) UpdateParsedSessionName(id int64, name string) error { + if err := s.db.UpdateParsedSessionName(id, name); err != nil { + s.logger.Error("更新解析会话名称失败", "error", err, "id", id) + return fmt.Errorf("更新解析会话名称失败: %w", err) + } + return nil +} + +// DeleteParsedSession 删除解析会话 +func (s *DatabaseService) DeleteParsedSession(id int64) error { + if err := s.db.DeleteParsedSession(id); err != nil { + s.logger.Error("删除解析会话失败", "error", err, "id", id) + return fmt.Errorf("删除解析会话失败: %w", err) + } + return nil +} + // SaveAppSetting 保存应用设置 func (s *DatabaseService) SaveAppSetting(key, value string) error { err := s.db.SaveSetting(key, value) @@ -78,5 +116,3 @@ func (s *DatabaseService) GetAllAppSettings() (map[string]string, error) { return settings, nil } - - \ No newline at end of file diff --git a/internal/service/main_service.go b/internal/service/main_service.go index 866293a..26ae2f9 100644 --- a/internal/service/main_service.go +++ b/internal/service/main_service.go @@ -4,15 +4,18 @@ import ( "context" "encoding/json" "fmt" + "log" "time" "equipment-analyzer/internal/capture" "equipment-analyzer/internal/config" "equipment-analyzer/internal/model" "equipment-analyzer/internal/utils" + "github.com/wailsapp/wails/v2/pkg/runtime" ) type App struct { + ctx context.Context config *config.Config logger *utils.Logger captureService *CaptureService @@ -22,217 +25,228 @@ type App struct { } func NewApp(cfg *config.Config, logger *utils.Logger) *App { - // 初始化数据库 + // init database database, err := model.NewDatabase() if err != nil { - logger.Error("初始化数据库失败", "error", err) - // 如果数据库初始化失败,仍然创建应用,但数据库功能不可用 + logger.Error("database init failed", "error", err) + // allow app to run without db features + parserService := NewParserService(cfg, logger) return &App{ config: cfg, logger: logger, - captureService: NewCaptureService(cfg, logger), - parserService: NewParserService(cfg, logger), + captureService: NewCaptureService(cfg, logger, parserService), + parserService: parserService, } } databaseService := NewDatabaseService(database, logger) + parserService := NewParserService(cfg, logger) return &App{ config: cfg, logger: logger, - captureService: NewCaptureService(cfg, logger), - parserService: NewParserService(cfg, logger), + captureService: NewCaptureService(cfg, logger, parserService), + parserService: parserService, database: database, databaseService: databaseService, } } func (a *App) Startup(ctx context.Context) { - a.logger.Info("应用启动") + a.ctx = ctx + a.captureService.SetBeforeRemote(func() { + if a.ctx != nil { + runtime.EventsEmit(a.ctx, "capture:ready_to_parse") + } + }) + a.logger.Info("app startup") } func (a *App) DomReady(ctx context.Context) { - a.logger.Info("DOM准备就绪") + a.logger.Info("dom ready") } func (a *App) BeforeClose(ctx context.Context) (prevent bool) { - a.logger.Info("应用即将关闭") + a.logger.Info("app closing") return false } func (a *App) Shutdown(ctx context.Context) { - a.logger.Info("应用关闭") + a.logger.Info("app shutdown") - // 关闭数据库连接 if a.database != nil { if err := a.database.Close(); err != nil { - a.logger.Error("关闭数据库连接失败", "error", err) + a.logger.Error("failed to close database connection", "error", err) } else { - a.logger.Info("数据库连接已关闭") + a.logger.Info("database connection closed") } } } -// GetNetworkInterfaces 获取网络接口列表 +// GetNetworkInterfaces returns available network interfaces. func (a *App) GetNetworkInterfaces() ([]model.NetworkInterface, error) { interfaces, err := capture.GetNetworkInterfaces() if err != nil { - a.logger.Error("获取网络接口失败", "error", err) + a.logger.Error("get network interfaces failed", "error", err) return nil, err } return interfaces, nil } -// StartCapture 开始抓包 +// StartCapture starts capture on the given interface. func (a *App) StartCapture(interfaceName string) error { if a.captureService.IsCapturing() { - return fmt.Errorf("抓包已在进行中") + return fmt.Errorf("capture already running") + } + + timeoutMs := a.config.Capture.DefaultTimeout + if timeoutMs > 500 { + log.Printf("[service] capture timeout too high (%dms), clamp to 500ms for responsive stop", timeoutMs) + timeoutMs = 500 } config := capture.Config{ InterfaceName: interfaceName, Filter: a.config.Capture.DefaultFilter, - Timeout: time.Duration(a.config.Capture.DefaultTimeout) * time.Millisecond, + Timeout: time.Duration(timeoutMs) * time.Millisecond, BufferSize: a.config.Capture.BufferSize, } - err := a.captureService.StartCapture(context.Background(), config) + err := a.captureService.StartCaptureAsync(context.Background(), config, func() { + if a.ctx != nil { + runtime.EventsEmit(a.ctx, "capture:started") + } + }, func(err error) { + a.logger.Error("start capture failed", "error", err) + if a.ctx != nil { + runtime.EventsEmit(a.ctx, "capture:start_failed", err.Error()) + } + }) if err != nil { - a.logger.Error("开始抓包失败", "error", err) return err } - - a.logger.Info("抓包开始", "interface", interfaceName) + a.logger.Info("capture start requested", "interface", interfaceName) return nil } -// StopCapture 停止抓包 +// StopCapture stops capture. func (a *App) StopCapture() error { if !a.captureService.IsCapturing() { - return fmt.Errorf("没有正在进行的抓包") + return fmt.Errorf("capture not running") } err := a.captureService.StopCapture() if err != nil { - a.logger.Error("停止抓包失败", "error", err) + a.logger.Error("stop capture failed", "error", err) return err } - // 处理所有收集的数据 a.captureService.ProcessAllData() - a.logger.Info("抓包停止") + a.logger.Info("capture stopped") return nil } -// GetCapturedData 获取抓包数据 +// GetCapturedData returns raw captured data. func (a *App) GetCapturedData() ([]string, error) { return a.captureService.GetCapturedData(), nil } -// ParseData 解析数据为JSON +// ParseData parses captured data to JSON (remote parser). func (a *App) ParseData(hexDataList []string) (string, error) { _, rawJson, err := a.parserService.ParseHexData(hexDataList) if err != nil { - a.logger.Error("解析数据失败", "error", err) + a.logger.Error("parse data failed", "error", err) return "", err } return rawJson, nil } -// ExportData 导出数据到文件 +// ExportData exports data to a file. func (a *App) ExportData(hexDataList []string, filename string) error { result, rawJson, err := a.parserService.ParseHexData(hexDataList) if err != nil { - a.logger.Error("解析数据失败", "error", err) + a.logger.Error("parse data failed", "error", err) return err } - // 这里可以添加文件写入逻辑 - a.logger.Info("导出数据", "filename", filename, "count", len(result.Items)) - // 简单示例:写入到当前目录 + + a.logger.Info("export data", "filename", filename, "count", len(result.Items)) err = utils.WriteFile(filename, []byte(rawJson)) if err != nil { - a.logger.Error("写入文件失败", "error", err) + a.logger.Error("write file failed", "error", err) return err } return nil } -// ExportCurrentData 导出当前数据库中的数据到文件 +// ExportCurrentData exports latest data from database to a file. func (a *App) ExportCurrentData(filename string) error { if a.databaseService == nil { - return fmt.Errorf("数据库服务未初始化") + return fmt.Errorf("database service not initialized") } - - // 从数据库获取最新数据 + parsedResult, err := a.GetLatestParsedDataFromDatabase() if err != nil { - a.logger.Error("获取数据库数据失败", "error", err) + a.logger.Error("failed to load data from database", "error", err) return err } - + if parsedResult == nil || (len(parsedResult.Items) == 0 && len(parsedResult.Heroes) == 0) { - return fmt.Errorf("没有数据可导出") + return fmt.Errorf("no data to export") } - - // 创建导出数据格式 + exportData := map[string]interface{}{ "items": parsedResult.Items, "heroes": parsedResult.Heroes, } - - // 序列化为JSON + jsonData, err := json.MarshalIndent(exportData, "", " ") if err != nil { - a.logger.Error("序列化数据失败", "error", err) + a.logger.Error("failed to marshal data", "error", err) return err } - - // 写入文件 + err = utils.WriteFile(filename, jsonData) if err != nil { - a.logger.Error("写入文件失败", "error", err) + a.logger.Error("write file failed", "error", err) return err } - - a.logger.Info("数据导出成功", "filename", filename, "items_count", len(parsedResult.Items), "heroes_count", len(parsedResult.Heroes)) + + a.logger.Info("export current data succeeded", "filename", filename, "items_count", len(parsedResult.Items), "heroes_count", len(parsedResult.Heroes)) return nil } -// GetCurrentDataForExport 获取当前数据库中的数据,供前端导出使用 +// GetCurrentDataForExport returns latest data from database as JSON string. func (a *App) GetCurrentDataForExport() (string, error) { if a.databaseService == nil { - return "", fmt.Errorf("数据库服务未初始化") + return "", fmt.Errorf("database service not initialized") } - - // 从数据库获取最新数据 + parsedResult, err := a.GetLatestParsedDataFromDatabase() if err != nil { - a.logger.Error("获取数据库数据失败", "error", err) + a.logger.Error("failed to load data from database", "error", err) return "", err } - + if parsedResult == nil || (len(parsedResult.Items) == 0 && len(parsedResult.Heroes) == 0) { - return "", fmt.Errorf("没有数据可导出") + return "", fmt.Errorf("no data to export") } - - // 创建导出数据格式 + exportData := map[string]interface{}{ "items": parsedResult.Items, "heroes": parsedResult.Heroes, } - - // 序列化为JSON + jsonData, err := json.MarshalIndent(exportData, "", " ") if err != nil { - a.logger.Error("序列化数据失败", "error", err) + a.logger.Error("failed to marshal data", "error", err) return "", err } - + return string(jsonData), nil } -// GetCaptureStatus 获取抓包状态 +// GetCaptureStatus returns capture status. func (a *App) GetCaptureStatus() model.CaptureStatus { return model.CaptureStatus{ IsCapturing: a.captureService.IsCapturing(), @@ -242,27 +256,29 @@ func (a *App) GetCaptureStatus() model.CaptureStatus { func (a *App) getStatusMessage() string { if a.captureService.IsCapturing() { - return "正在抓包..." + return "capturing" } - return "准备就绪" + if a.captureService.IsStarting() { + return "starting" + } + return "ready" } -// ReadRawJsonFile 已废弃,请使用GetLatestParsedDataFromDatabase从数据库获取数据 +// ReadRawJsonFile is deprecated; use GetLatestParsedDataFromDatabase. func (a *App) ReadRawJsonFile() (*model.ParsedResult, error) { return a.GetLatestParsedDataFromDatabase() } -// StopAndParseCapture 停止抓包并解析数据,供前端调用 +// StopAndParseCapture stops capture and parses data. func (a *App) StopAndParseCapture() (*model.ParsedResult, error) { - result, err := a.captureService.StopAndParseCapture(a.parserService) + log.Printf("[service] StopAndParseCapture entry") + result, err := a.captureService.StopAndParseCapture() if err != nil { - a.logger.Error("停止抓包并解析数据失败", "error", err) + a.logger.Error("stop and parse capture failed", "error", err) return nil, err } - // 将解析结果保存到数据库 if a.databaseService != nil && result != nil { - // 序列化装备数据 itemsJSON := "[]" if result.Items != nil { if jsonData, err := json.Marshal(result.Items); err == nil { @@ -270,7 +286,6 @@ func (a *App) StopAndParseCapture() (*model.ParsedResult, error) { } } - // 序列化英雄数据 heroesJSON := "[]" if result.Heroes != nil { if jsonData, err := json.Marshal(result.Heroes); err == nil { @@ -278,33 +293,29 @@ func (a *App) StopAndParseCapture() (*model.ParsedResult, error) { } } - // 保存到数据库 sessionName := fmt.Sprintf("capture_%d", time.Now().Unix()) if err := a.databaseService.SaveParsedDataToDatabase(sessionName, itemsJSON, heroesJSON); err != nil { - a.logger.Error("保存解析数据到数据库失败", "error", err) - // 不返回错误,因为解析成功了,只是保存失败 + a.logger.Error("save parsed data failed", "error", err) } else { - a.logger.Info("解析数据已保存到数据库", "session_name", sessionName) + a.logger.Info("parsed data saved", "session_name", sessionName) } } return result, nil } -// ========== 数据库相关API ========== - -// SaveParsedDataToDatabase 保存解析后的数据到数据库 +// SaveParsedDataToDatabase saves parsed data. func (a *App) SaveParsedDataToDatabase(sessionName string, itemsJSON, heroesJSON string) error { if a.databaseService == nil { - return fmt.Errorf("数据库服务未初始化") + return fmt.Errorf("database service not initialized") } return a.databaseService.SaveParsedDataToDatabase(sessionName, itemsJSON, heroesJSON) } -// GetLatestParsedDataFromDatabase 从数据库获取最新的解析数据 +// GetLatestParsedDataFromDatabase returns latest parsed data from database. func (a *App) GetLatestParsedDataFromDatabase() (*model.ParsedResult, error) { if a.databaseService == nil { - return nil, fmt.Errorf("数据库服务未初始化") + return nil, fmt.Errorf("database service not initialized") } itemsJSON, heroesJSON, err := a.databaseService.GetLatestParsedDataFromDatabase() @@ -312,19 +323,17 @@ func (a *App) GetLatestParsedDataFromDatabase() (*model.ParsedResult, error) { return nil, err } - // 解析装备数据 var items []interface{} if itemsJSON != "" { if err := json.Unmarshal([]byte(itemsJSON), &items); err != nil { - return nil, fmt.Errorf("解析装备数据失败: %w", err) + return nil, fmt.Errorf("failed to unmarshal items: %w", err) } } - // 解析英雄数据 var heroes []interface{} if heroesJSON != "" { if err := json.Unmarshal([]byte(heroesJSON), &heroes); err != nil { - return nil, fmt.Errorf("解析英雄数据失败: %w", err) + return nil, fmt.Errorf("failed to unmarshal heroes: %w", err) } } @@ -334,26 +343,125 @@ func (a *App) GetLatestParsedDataFromDatabase() (*model.ParsedResult, error) { }, nil } -// SaveAppSetting 保存应用设置 +// GetParsedSessions returns all parsed sessions. +func (a *App) GetParsedSessions() ([]model.ParsedSession, error) { + if a.databaseService == nil { + return nil, fmt.Errorf("database service not initialized") + } + return a.databaseService.GetParsedSessions() +} + +// GetParsedDataByID returns parsed data by session id. +func (a *App) GetParsedDataByID(id int64) (*model.ParsedResult, error) { + if a.databaseService == nil { + return nil, fmt.Errorf("database service not initialized") + } + itemsJSON, heroesJSON, err := a.databaseService.GetParsedDataByID(id) + if err != nil { + return nil, err + } + + var items []interface{} + if itemsJSON != "" { + if err := json.Unmarshal([]byte(itemsJSON), &items); err != nil { + return nil, fmt.Errorf("failed to unmarshal items: %w", err) + } + } + + var heroes []interface{} + if heroesJSON != "" { + if err := json.Unmarshal([]byte(heroesJSON), &heroes); err != nil { + return nil, fmt.Errorf("failed to unmarshal heroes: %w", err) + } + } + + return &model.ParsedResult{ + Items: items, + Heroes: heroes, + }, nil +} + +// UpdateParsedSessionName updates session name. +func (a *App) UpdateParsedSessionName(id int64, name string) error { + if a.databaseService == nil { + return fmt.Errorf("database service not initialized") + } + if name == "" { + return fmt.Errorf("session name cannot be empty") + } + return a.databaseService.UpdateParsedSessionName(id, name) +} + +// DeleteParsedSession deletes a parsed session by id. +func (a *App) DeleteParsedSession(id int64) error { + if a.databaseService == nil { + return fmt.Errorf("database service not initialized") + } + return a.databaseService.DeleteParsedSession(id) +} + +// SaveAppSetting saves app setting. func (a *App) SaveAppSetting(key, value string) error { if a.databaseService == nil { - return fmt.Errorf("数据库服务未初始化") + return fmt.Errorf("database service not initialized") } return a.databaseService.SaveAppSetting(key, value) } -// GetAppSetting 获取应用设置 +// GetAppSetting gets app setting. func (a *App) GetAppSetting(key string) (string, error) { if a.databaseService == nil { - return "", fmt.Errorf("数据库服务未初始化") + return "", fmt.Errorf("database service not initialized") } return a.databaseService.GetAppSetting(key) } -// GetAllAppSettings 获取所有应用设置 +// GetAllAppSettings gets all app settings. func (a *App) GetAllAppSettings() (map[string]string, error) { if a.databaseService == nil { - return nil, fmt.Errorf("数据库服务未初始化") + return nil, fmt.Errorf("database service not initialized") } return a.databaseService.GetAllAppSettings() } + +// StartCaptureWithFilter allows frontend to provide a custom BPF filter. +func (a *App) StartCaptureWithFilter(interfaceName string, filter string) error { + a.logger.Info("StartCaptureWithFilter requested", "interface", interfaceName, "filter", filter) + if a.captureService.IsCapturing() { + return fmt.Errorf("capture already running") + } + + useFilter := filter + if useFilter == "" { + useFilter = a.config.Capture.DefaultFilter + } + + timeoutMs := a.config.Capture.DefaultTimeout + if timeoutMs > 500 { + log.Printf("[service] capture timeout too high (%dms), clamp to 500ms for responsive stop", timeoutMs) + timeoutMs = 500 + } + + config := capture.Config{ + InterfaceName: interfaceName, + Filter: useFilter, + Timeout: time.Duration(timeoutMs) * time.Millisecond, + BufferSize: a.config.Capture.BufferSize, + } + + err := a.captureService.StartCaptureAsync(context.Background(), config, func() { + if a.ctx != nil { + runtime.EventsEmit(a.ctx, "capture:started") + } + }, func(err error) { + a.logger.Error("start capture failed", "error", err) + if a.ctx != nil { + runtime.EventsEmit(a.ctx, "capture:start_failed", err.Error()) + } + }) + if err != nil { + return err + } + a.logger.Info("capture start requested", "interface", interfaceName, "filter", useFilter) + return nil +}