Explorar el Código

增加充值记录列表

774078984@qq.com hace 3 meses
commit
3869d3e99f
Se han modificado 100 ficheros con 13764 adiciones y 0 borrados
  1. 3 0
      .env.development
  2. 3 0
      .env.production
  3. 27 0
      .gitignore
  4. 3 0
      .vscode/extensions.json
  5. 7 0
      README.md
  6. 177 0
      index.html
  7. 11 0
      jsconfig.json
  8. 5175 0
      package-lock.json
  9. 36 0
      package.json
  10. 396 0
      public/cdn/es-module-shims.wasm.js
  11. 6 0
      public/cdn/runtime-dom.esm-browser.js
  12. 6 0
      public/cdn/server-renderer.esm-browser.js
  13. 1 0
      public/vite.svg
  14. 105 0
      src/App.vue
  15. 54 0
      src/api/customer.js
  16. 12 0
      src/api/path/component.api.js
  17. 31 0
      src/api/path/dict.js
  18. 34 0
      src/api/path/dictionary.js
  19. 65 0
      src/api/path/finance.js
  20. 50 0
      src/api/path/flowPool.api.js
  21. 11 0
      src/api/path/login.api.js
  22. 94 0
      src/api/path/lotCard.api.js
  23. 56 0
      src/api/path/order.js
  24. 27 0
      src/api/path/purchase.js
  25. 6 0
      src/api/path/renewalOrder.js
  26. 20 0
      src/api/path/star.api.js
  27. 85 0
      src/api/path/system.api.js
  28. 51 0
      src/api/path/tariffManagement.api.js
  29. 46 0
      src/assets/css/global.less
  30. 26 0
      src/assets/css/theme.less
  31. 539 0
      src/assets/iconsvg/demo.css
  32. 2051 0
      src/assets/iconsvg/demo_index.html
  33. 339 0
      src/assets/iconsvg/iconfont.css
  34. 0 0
      src/assets/iconsvg/iconfont.js
  35. 576 0
      src/assets/iconsvg/iconfont.json
  36. BIN
      src/assets/iconsvg/iconfont.ttf
  37. BIN
      src/assets/iconsvg/iconfont.woff
  38. BIN
      src/assets/iconsvg/iconfont.woff2
  39. BIN
      src/assets/images/error-image.png
  40. BIN
      src/assets/images/login-banner.png
  41. BIN
      src/assets/images/logo.png
  42. 1 0
      src/assets/vite.svg
  43. 1 0
      src/assets/vue.svg
  44. 176 0
      src/components/FindHead/index.vue
  45. 30 0
      src/components/Layout/Layout.vue
  46. 6 0
      src/components/Layout/components/index.js
  47. 295 0
      src/components/Layout/components/layout/menu.vue
  48. 188 0
      src/components/Layout/components/layoutHeader/index.vue
  49. 254 0
      src/components/Layout/components/setting/index.vue
  50. 33 0
      src/components/Layout/components/subMenu/index.vue
  51. 113 0
      src/components/MonacoEditor/index.vue
  52. 161 0
      src/components/Search/index.vue
  53. 43 0
      src/components/Svg-icon/SvgIcon.vue
  54. 88 0
      src/components/XmSelect/index.vue
  55. 159 0
      src/components/upload/index.vue
  56. 28 0
      src/hooks/enum.js
  57. 2 0
      src/hooks/index.js
  58. 26 0
      src/hooks/useLang.hook.js
  59. 12 0
      src/hooks/useTheme.hook.js
  60. 55 0
      src/i18n/en/dataPackage.js
  61. 63 0
      src/i18n/en/form.js
  62. 11 0
      src/i18n/en/global.js
  63. 15 0
      src/i18n/en/index.js
  64. 3 0
      src/i18n/en/login.js
  65. 54 0
      src/i18n/en/plan.js
  66. 85 0
      src/i18n/en/supplier.js
  67. 36 0
      src/i18n/index.js
  68. 55 0
      src/i18n/th/dataPackage.js
  69. 63 0
      src/i18n/th/form.js
  70. 11 0
      src/i18n/th/global.js
  71. 15 0
      src/i18n/th/index.js
  72. 3 0
      src/i18n/th/login.js
  73. 74 0
      src/i18n/th/plan.js
  74. 85 0
      src/i18n/th/supplier.js
  75. 277 0
      src/i18n/zh/customer.js
  76. 22 0
      src/i18n/zh/customerPackage.js
  77. 65 0
      src/i18n/zh/dataPackage.js
  78. 4 0
      src/i18n/zh/error.js
  79. 32 0
      src/i18n/zh/financialManagement.js
  80. 54 0
      src/i18n/zh/flowPool.js
  81. 23 0
      src/i18n/zh/forewarning.js
  82. 88 0
      src/i18n/zh/form.js
  83. 12 0
      src/i18n/zh/global.js
  84. 34 0
      src/i18n/zh/index.js
  85. 7 0
      src/i18n/zh/login.js
  86. 193 0
      src/i18n/zh/lotCard.js
  87. 51 0
      src/i18n/zh/order.js
  88. 75 0
      src/i18n/zh/plan.js
  89. 10 0
      src/i18n/zh/setting.js
  90. 85 0
      src/i18n/zh/supplier.js
  91. 52 0
      src/i18n/zh/tariffManagement.js
  92. 52 0
      src/main.js
  93. 9 0
      src/mixins/index.js
  94. 23 0
      src/router/index.js
  95. 37 0
      src/router/router.guards.js
  96. 81 0
      src/router/router.system.js
  97. 75 0
      src/router/router.update.js
  98. 10 0
      src/settings/designSetting.js
  99. 11 0
      src/settings/pagination.js
  100. 9 0
      src/store/index.js

+ 3 - 0
.env.development

@@ -0,0 +1,3 @@
+# 开发环境
+VITE_API_URL=http://sim.nanodreamtech.com
+VITE_ENV=development

+ 3 - 0
.env.production

@@ -0,0 +1,3 @@
+# 生产环境api
+VITE_API_URL=http://sim.ainets.net
+VITE_ENV=production

+ 27 - 0
.gitignore

@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+*.vite.config.js
+yarn.lock
+

+ 3 - 0
.vscode/extensions.json

@@ -0,0 +1,3 @@
+{
+  "recommendations": ["Vue.volar"]
+}

+ 7 - 0
README.md

@@ -0,0 +1,7 @@
+# Vue 3 + Vite
+
+This template should help get you started developing with Vue 3 in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.
+
+## Recommended IDE Setup
+
+- [VS Code](https://code.visualstudio.com/) + [Vue - Official](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (previously Volar) and disable Vetur

+ 177 - 0
index.html

@@ -0,0 +1,177 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <link rel="icon" type="image/svg+xml" href="/src/assets/images/logo.png" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>Easy life</title>
+    <style type="text/css">
+      #Loading {
+        width: 100vw;
+        height: 100vh;
+        top: 50%;
+        left: 50%;
+        position: absolute;
+        transform: translateY(-50%) translateX(-50%);
+        z-index: 100;
+        filter: contrast(20);
+        background: #fff;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        display: flex;
+        flex-direction: column;
+      }
+      .breeding-rhombus-spinner {
+        height: 65px;
+        width: 65px;
+        position: relative;
+        transform: rotate(45deg) scale(1.5);
+      }
+
+      .breeding-rhombus-spinner,
+      .breeding-rhombus-spinner * {
+        box-sizing: border-box;
+        filter: blur(2px);
+      }
+
+      .breeding-rhombus-spinner .rhombus {
+        height: calc(65px / 7.5);
+        width: calc(65px / 7.5);
+        top: calc(65px / 2.3077);
+        left: calc(65px / 2.3077);
+        background-color: #e31937;
+        position: absolute;
+        animation-duration: 2s;
+        animation-iteration-count: infinite;
+      }
+
+      .breeding-rhombus-spinner .rhombus:nth-child(2n) {
+        margin-right: 0;
+      }
+
+      .breeding-rhombus-spinner .rhombus.child-1 {
+        animation-name: breeding-rhombus-spinner-animation-child-1;
+        animation-delay: calc(100ms * 1);
+      }
+
+      .breeding-rhombus-spinner .rhombus.child-2 {
+        animation-name: breeding-rhombus-spinner-animation-child-2;
+        animation-delay: calc(100ms * 2);
+      }
+
+      .breeding-rhombus-spinner .rhombus.child-3 {
+        animation-name: breeding-rhombus-spinner-animation-child-3;
+        animation-delay: calc(100ms * 3);
+      }
+
+      .breeding-rhombus-spinner .rhombus.child-4 {
+        animation-name: breeding-rhombus-spinner-animation-child-4;
+        animation-delay: calc(100ms * 4);
+      }
+
+      .breeding-rhombus-spinner .rhombus.child-5 {
+        animation-name: breeding-rhombus-spinner-animation-child-5;
+        animation-delay: calc(100ms * 5);
+      }
+
+      .breeding-rhombus-spinner .rhombus.child-6 {
+        animation-name: breeding-rhombus-spinner-animation-child-6;
+        animation-delay: calc(100ms * 6);
+      }
+
+      .breeding-rhombus-spinner .rhombus.child-7 {
+        animation-name: breeding-rhombus-spinner-animation-child-7;
+        animation-delay: calc(100ms * 7);
+      }
+
+      .breeding-rhombus-spinner .rhombus.child-8 {
+        animation-name: breeding-rhombus-spinner-animation-child-8;
+        animation-delay: calc(100ms * 8);
+      }
+
+      .breeding-rhombus-spinner .rhombus.big {
+        height: calc(65px / 3);
+        width: calc(65px / 3);
+        top: calc(65px / 3);
+        left: calc(65px / 3);
+        background-color: #e31937;
+        animation-duration: 2s;
+        animation: breeding-rhombus-spinner-animation-child-big 2s infinite;
+        animation-delay: 0.5s;
+      }
+
+      @keyframes breeding-rhombus-spinner-animation-child-1 {
+        50% {
+          transform: translate(-325%, -325%);
+        }
+      }
+
+      @keyframes breeding-rhombus-spinner-animation-child-2 {
+        50% {
+          transform: translate(0, -325%);
+        }
+      }
+
+      @keyframes breeding-rhombus-spinner-animation-child-3 {
+        50% {
+          transform: translate(325%, -325%);
+        }
+      }
+
+      @keyframes breeding-rhombus-spinner-animation-child-4 {
+        50% {
+          transform: translate(325%, 0);
+        }
+      }
+
+      @keyframes breeding-rhombus-spinner-animation-child-5 {
+        50% {
+          transform: translate(325%, 325%);
+        }
+      }
+
+      @keyframes breeding-rhombus-spinner-animation-child-6 {
+        50% {
+          transform: translate(0, 325%);
+        }
+      }
+
+      @keyframes breeding-rhombus-spinner-animation-child-7 {
+        50% {
+          transform: translate(-325%, 325%);
+        }
+      }
+
+      @keyframes breeding-rhombus-spinner-animation-child-8 {
+        50% {
+          transform: translate(-325%, 0);
+        }
+      }
+
+      @keyframes breeding-rhombus-spinner-animation-child-big {
+        50% {
+          transform: scale(0.5);
+        }
+      }
+    </style>
+  </head>
+  <body>
+    <div id="Loading">
+      <div class="breeding-rhombus-spinner">
+        <div class="rhombus child-1"></div>
+        <div class="rhombus child-2"></div>
+        <div class="rhombus child-3"></div>
+        <div class="rhombus child-4"></div>
+        <div class="rhombus child-5"></div>
+        <div class="rhombus child-6"></div>
+        <div class="rhombus child-7"></div>
+        <div class="rhombus child-8"></div>
+        <div class="rhombus big"></div>
+      </div>
+    </div>
+    <div id="app"></div>
+    <script type="module" src="/src/main.js"></script>
+    <script src="https://gosspublic.alicdn.com/aliyun-oss-sdk-6.18.0.min.js"></script>
+  </body>
+</html>

+ 11 - 0
jsconfig.json

@@ -0,0 +1,11 @@
+{
+  "compilerOptions": {
+    "baseUrl": "./",
+    "paths": {
+      "@/*": ["src/*"]  // 将项目根目录配置别名为@
+    },
+    "allowSyntheticDefaultImports": true
+  },
+  "include": ["src/**/*.js", "src/**/*.ts", "src/**/*.vue", "src/**/*.tsx"],
+  "exclude": ["node_modules", "dist"]
+}

+ 5175 - 0
package-lock.json

@@ -0,0 +1,5175 @@
+{
+  "name": "admin-web",
+  "version": "0.0.0",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "admin-web",
+      "version": "0.0.0",
+      "dependencies": {
+        "@arco-design/web-vue": "^2.55.3",
+        "axios": "^1.7.2",
+        "crypto-js": "^4.2.0",
+        "dayjs": "^1.11.11",
+        "echarts": "^5.5.1",
+        "file-saver": "^2.0.5",
+        "less": "^4.2.0",
+        "less-loader": "^12.2.0",
+        "lodash": "^4.17.21",
+        "monaco-editor": "^0.52.0",
+        "pinia": "^2.1.7",
+        "qrcode.vue": "^3.6.0",
+        "vue": "^3.4.21",
+        "vue-echarts": "^7.0.3",
+        "vue-i18n": "^10.0.1",
+        "vue-router": "^4.3.2",
+        "xlsx": "^0.18.5"
+      },
+      "devDependencies": {
+        "@vitejs/plugin-vue": "^5.0.4",
+        "fast-glob": "^3.3.2",
+        "vite": "^5.2.0",
+        "vite-plugin-svg-icons": "^2.0.1"
+      }
+    },
+    "node_modules/@arco-design/color": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmmirror.com/@arco-design/color/-/color-0.4.0.tgz",
+      "integrity": "sha512-s7p9MSwJgHeL8DwcATaXvWT3m2SigKpxx4JA1BGPHL4gfvaQsmQfrLBDpjOJFJuJ2jG2dMt3R3P8Pm9E65q18g==",
+      "dependencies": {
+        "color": "^3.1.3"
+      }
+    },
+    "node_modules/@arco-design/web-vue": {
+      "version": "2.56.3",
+      "resolved": "https://registry.npmmirror.com/@arco-design/web-vue/-/web-vue-2.56.3.tgz",
+      "integrity": "sha512-D2CPIXRBUPcg37TFsfWROZddCWFZnIwqGpsOhOn2BhmH89UFqtBGpTxyuMdYJEwKNXunp3dVL6V69ZMmJBRPOg==",
+      "dependencies": {
+        "@arco-design/color": "^0.4.0",
+        "b-tween": "^0.3.3",
+        "b-validate": "^1.4.4",
+        "compute-scroll-into-view": "^1.0.17",
+        "dayjs": "^1.10.3",
+        "number-precision": "^1.5.0",
+        "resize-observer-polyfill": "^1.5.1",
+        "scroll-into-view-if-needed": "^2.2.28"
+      },
+      "peerDependencies": {
+        "vue": "^3.1.0"
+      }
+    },
+    "node_modules/@babel/helper-string-parser": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
+      "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-validator-identifier": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
+      "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/parser": {
+      "version": "7.26.2",
+      "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.26.2.tgz",
+      "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==",
+      "dependencies": {
+        "@babel/types": "^7.26.0"
+      },
+      "bin": {
+        "parser": "bin/babel-parser.js"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@babel/types": {
+      "version": "7.26.0",
+      "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.26.0.tgz",
+      "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==",
+      "dependencies": {
+        "@babel/helper-string-parser": "^7.25.9",
+        "@babel/helper-validator-identifier": "^7.25.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "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,
+      "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,
+      "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,
+      "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,
+      "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,
+      "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,
+      "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,
+      "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,
+      "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,
+      "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,
+      "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,
+      "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,
+      "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,
+      "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,
+      "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,
+      "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,
+      "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,
+      "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,
+      "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,
+      "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,
+      "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,
+      "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,
+      "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"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@intlify/core-base": {
+      "version": "10.0.4",
+      "resolved": "https://registry.npmmirror.com/@intlify/core-base/-/core-base-10.0.4.tgz",
+      "integrity": "sha512-GG428DkrrWCMhxRMRQZjuS7zmSUzarYcaHJqG9VB8dXAxw4iQDoKVQ7ChJRB6ZtsCsX3Jse1PEUlHrJiyQrOTg==",
+      "dependencies": {
+        "@intlify/message-compiler": "10.0.4",
+        "@intlify/shared": "10.0.4"
+      },
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/kazupon"
+      }
+    },
+    "node_modules/@intlify/message-compiler": {
+      "version": "10.0.4",
+      "resolved": "https://registry.npmmirror.com/@intlify/message-compiler/-/message-compiler-10.0.4.tgz",
+      "integrity": "sha512-AFbhEo10DP095/45EauinQJ5hJ3rJUmuuqltGguvc3WsvezZN+g8qNHLGWKu60FHQVizMrQY7VJ+zVlBXlQQkQ==",
+      "dependencies": {
+        "@intlify/shared": "10.0.4",
+        "source-map-js": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/kazupon"
+      }
+    },
+    "node_modules/@intlify/shared": {
+      "version": "10.0.4",
+      "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-10.0.4.tgz",
+      "integrity": "sha512-ukFn0I01HsSgr3VYhYcvkTCLS7rGa0gw4A4AMpcy/A9xx/zRJy7PS2BElMXLwUazVFMAr5zuiTk3MQeoeGXaJg==",
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/kazupon"
+      }
+    },
+    "node_modules/@jridgewell/sourcemap-codec": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+      "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="
+    },
+    "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,
+      "dependencies": {
+        "@nodelib/fs.stat": "2.0.5",
+        "run-parallel": "^1.1.9"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "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,
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "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,
+      "dependencies": {
+        "@nodelib/fs.scandir": "2.1.5",
+        "fastq": "^1.6.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@rollup/rollup-android-arm-eabi": {
+      "version": "4.24.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.4.tgz",
+      "integrity": "sha512-jfUJrFct/hTA0XDM5p/htWKoNNTbDLY0KRwEt6pyOA6k2fmk0WVwl65PdUdJZgzGEHWx+49LilkcSaumQRyNQw==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "android"
+      ]
+    },
+    "node_modules/@rollup/rollup-android-arm64": {
+      "version": "4.24.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.4.tgz",
+      "integrity": "sha512-j4nrEO6nHU1nZUuCfRKoCcvh7PIywQPUCBa2UsootTHvTHIoIu2BzueInGJhhvQO/2FTRdNYpf63xsgEqH9IhA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "android"
+      ]
+    },
+    "node_modules/@rollup/rollup-darwin-arm64": {
+      "version": "4.24.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.4.tgz",
+      "integrity": "sha512-GmU/QgGtBTeraKyldC7cDVVvAJEOr3dFLKneez/n7BvX57UdhOqDsVwzU7UOnYA7AAOt+Xb26lk79PldDHgMIQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@rollup/rollup-darwin-x64": {
+      "version": "4.24.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.4.tgz",
+      "integrity": "sha512-N6oDBiZCBKlwYcsEPXGDE4g9RoxZLK6vT98M8111cW7VsVJFpNEqvJeIPfsCzbf0XEakPslh72X0gnlMi4Ddgg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@rollup/rollup-freebsd-arm64": {
+      "version": "4.24.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.24.4.tgz",
+      "integrity": "sha512-py5oNShCCjCyjWXCZNrRGRpjWsF0ic8f4ieBNra5buQz0O/U6mMXCpC1LvrHuhJsNPgRt36tSYMidGzZiJF6mw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "freebsd"
+      ]
+    },
+    "node_modules/@rollup/rollup-freebsd-x64": {
+      "version": "4.24.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.24.4.tgz",
+      "integrity": "sha512-L7VVVW9FCnTTp4i7KrmHeDsDvjB4++KOBENYtNYAiYl96jeBThFfhP6HVxL74v4SiZEVDH/1ILscR5U9S4ms4g==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "freebsd"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+      "version": "4.24.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.4.tgz",
+      "integrity": "sha512-10ICosOwYChROdQoQo589N5idQIisxjaFE/PAnX2i0Zr84mY0k9zul1ArH0rnJ/fpgiqfu13TFZR5A5YJLOYZA==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+      "version": "4.24.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.4.tgz",
+      "integrity": "sha512-ySAfWs69LYC7QhRDZNKqNhz2UKN8LDfbKSMAEtoEI0jitwfAG2iZwVqGACJT+kfYvvz3/JgsLlcBP+WWoKCLcw==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm64-gnu": {
+      "version": "4.24.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.4.tgz",
+      "integrity": "sha512-uHYJ0HNOI6pGEeZ/5mgm5arNVTI0nLlmrbdph+pGXpC9tFHFDQmDMOEqkmUObRfosJqpU8RliYoGz06qSdtcjg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm64-musl": {
+      "version": "4.24.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.4.tgz",
+      "integrity": "sha512-38yiWLemQf7aLHDgTg85fh3hW9stJ0Muk7+s6tIkSUOMmi4Xbv5pH/5Bofnsb6spIwD5FJiR+jg71f0CH5OzoA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+      "version": "4.24.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.4.tgz",
+      "integrity": "sha512-q73XUPnkwt9ZNF2xRS4fvneSuaHw2BXuV5rI4cw0fWYVIWIBeDZX7c7FWhFQPNTnE24172K30I+dViWRVD9TwA==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+      "version": "4.24.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.4.tgz",
+      "integrity": "sha512-Aie/TbmQi6UXokJqDZdmTJuZBCU3QBDA8oTKRGtd4ABi/nHgXICulfg1KI6n9/koDsiDbvHAiQO3YAUNa/7BCw==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-s390x-gnu": {
+      "version": "4.24.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.4.tgz",
+      "integrity": "sha512-P8MPErVO/y8ohWSP9JY7lLQ8+YMHfTI4bAdtCi3pC2hTeqFJco2jYspzOzTUB8hwUWIIu1xwOrJE11nP+0JFAQ==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-x64-gnu": {
+      "version": "4.24.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.4.tgz",
+      "integrity": "sha512-K03TljaaoPK5FOyNMZAAEmhlyO49LaE4qCsr0lYHUKyb6QacTNF9pnfPpXnFlFD3TXuFbFbz7tJ51FujUXkXYA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-x64-musl": {
+      "version": "4.24.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.4.tgz",
+      "integrity": "sha512-VJYl4xSl/wqG2D5xTYncVWW+26ICV4wubwN9Gs5NrqhJtayikwCXzPL8GDsLnaLU3WwhQ8W02IinYSFJfyo34Q==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-arm64-msvc": {
+      "version": "4.24.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.4.tgz",
+      "integrity": "sha512-ku2GvtPwQfCqoPFIJCqZ8o7bJcj+Y54cZSr43hHca6jLwAiCbZdBUOrqE6y29QFajNAzzpIOwsckaTFmN6/8TA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-ia32-msvc": {
+      "version": "4.24.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.4.tgz",
+      "integrity": "sha512-V3nCe+eTt/W6UYNr/wGvO1fLpHUrnlirlypZfKCT1fG6hWfqhPgQV/K/mRBXBpxc0eKLIF18pIOFVPh0mqHjlg==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-x64-msvc": {
+      "version": "4.24.4",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.4.tgz",
+      "integrity": "sha512-LTw1Dfd0mBIEqUVCxbvTE/LLo+9ZxVC9k99v1v4ahg9Aak6FpqOfNu5kRkeTAn0wphoC4JU7No1/rL+bBCEwhg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@trysound/sax": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmmirror.com/@trysound/sax/-/sax-0.2.0.tgz",
+      "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
+      "dev": true,
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
+    "node_modules/@types/estree": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.6.tgz",
+      "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+      "dev": true
+    },
+    "node_modules/@types/node": {
+      "version": "22.9.0",
+      "resolved": "https://registry.npmmirror.com/@types/node/-/node-22.9.0.tgz",
+      "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==",
+      "dev": true,
+      "dependencies": {
+        "undici-types": "~6.19.8"
+      }
+    },
+    "node_modules/@types/svgo": {
+      "version": "2.6.4",
+      "resolved": "https://registry.npmmirror.com/@types/svgo/-/svgo-2.6.4.tgz",
+      "integrity": "sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==",
+      "dev": true,
+      "dependencies": {
+        "@types/node": "*"
+      }
+    },
+    "node_modules/@vitejs/plugin-vue": {
+      "version": "5.1.4",
+      "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.1.4.tgz",
+      "integrity": "sha512-N2XSI2n3sQqp5w7Y/AN/L2XDjBIRGqXko+eDp42sydYSBeJuSm5a1sLf8zakmo8u7tA8NmBgoDLA1HeOESjp9A==",
+      "dev": true,
+      "engines": {
+        "node": "^18.0.0 || >=20.0.0"
+      },
+      "peerDependencies": {
+        "vite": "^5.0.0",
+        "vue": "^3.2.25"
+      }
+    },
+    "node_modules/@vue/compiler-core": {
+      "version": "3.5.12",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.12.tgz",
+      "integrity": "sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==",
+      "dependencies": {
+        "@babel/parser": "^7.25.3",
+        "@vue/shared": "3.5.12",
+        "entities": "^4.5.0",
+        "estree-walker": "^2.0.2",
+        "source-map-js": "^1.2.0"
+      }
+    },
+    "node_modules/@vue/compiler-core/node_modules/entities": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
+      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+      "engines": {
+        "node": ">=0.12"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
+    "node_modules/@vue/compiler-dom": {
+      "version": "3.5.12",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.12.tgz",
+      "integrity": "sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg==",
+      "dependencies": {
+        "@vue/compiler-core": "3.5.12",
+        "@vue/shared": "3.5.12"
+      }
+    },
+    "node_modules/@vue/compiler-sfc": {
+      "version": "3.5.12",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.12.tgz",
+      "integrity": "sha512-2k973OGo2JuAa5+ZlekuQJtitI5CgLMOwgl94BzMCsKZCX/xiqzJYzapl4opFogKHqwJk34vfsaKpfEhd1k5nw==",
+      "dependencies": {
+        "@babel/parser": "^7.25.3",
+        "@vue/compiler-core": "3.5.12",
+        "@vue/compiler-dom": "3.5.12",
+        "@vue/compiler-ssr": "3.5.12",
+        "@vue/shared": "3.5.12",
+        "estree-walker": "^2.0.2",
+        "magic-string": "^0.30.11",
+        "postcss": "^8.4.47",
+        "source-map-js": "^1.2.0"
+      }
+    },
+    "node_modules/@vue/compiler-ssr": {
+      "version": "3.5.12",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.12.tgz",
+      "integrity": "sha512-eLwc7v6bfGBSM7wZOGPmRavSWzNFF6+PdRhE+VFJhNCgHiF8AM7ccoqcv5kBXA2eWUfigD7byekvf/JsOfKvPA==",
+      "dependencies": {
+        "@vue/compiler-dom": "3.5.12",
+        "@vue/shared": "3.5.12"
+      }
+    },
+    "node_modules/@vue/devtools-api": {
+      "version": "6.6.4",
+      "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
+      "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g=="
+    },
+    "node_modules/@vue/reactivity": {
+      "version": "3.5.12",
+      "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.12.tgz",
+      "integrity": "sha512-UzaN3Da7xnJXdz4Okb/BGbAaomRHc3RdoWqTzlvd9+WBR5m3J39J1fGcHes7U3za0ruYn/iYy/a1euhMEHvTAg==",
+      "dependencies": {
+        "@vue/shared": "3.5.12"
+      }
+    },
+    "node_modules/@vue/runtime-core": {
+      "version": "3.5.12",
+      "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.12.tgz",
+      "integrity": "sha512-hrMUYV6tpocr3TL3Ad8DqxOdpDe4zuQY4HPY3X/VRh+L2myQO8MFXPAMarIOSGNu0bFAjh1yBkMPXZBqCk62Uw==",
+      "dependencies": {
+        "@vue/reactivity": "3.5.12",
+        "@vue/shared": "3.5.12"
+      }
+    },
+    "node_modules/@vue/runtime-dom": {
+      "version": "3.5.12",
+      "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.12.tgz",
+      "integrity": "sha512-q8VFxR9A2MRfBr6/55Q3umyoN7ya836FzRXajPB6/Vvuv0zOPL+qltd9rIMzG/DbRLAIlREmnLsplEF/kotXKA==",
+      "dependencies": {
+        "@vue/reactivity": "3.5.12",
+        "@vue/runtime-core": "3.5.12",
+        "@vue/shared": "3.5.12",
+        "csstype": "^3.1.3"
+      }
+    },
+    "node_modules/@vue/server-renderer": {
+      "version": "3.5.12",
+      "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.12.tgz",
+      "integrity": "sha512-I3QoeDDeEPZm8yR28JtY+rk880Oqmj43hreIBVTicisFTx/Dl7JpG72g/X7YF8hnQD3IFhkky5i2bPonwrTVPg==",
+      "dependencies": {
+        "@vue/compiler-ssr": "3.5.12",
+        "@vue/shared": "3.5.12"
+      },
+      "peerDependencies": {
+        "vue": "3.5.12"
+      }
+    },
+    "node_modules/@vue/shared": {
+      "version": "3.5.12",
+      "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.12.tgz",
+      "integrity": "sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg=="
+    },
+    "node_modules/adler-32": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz",
+      "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/ansi-regex": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz",
+      "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/ansi-styles": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-2.2.1.tgz",
+      "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/arr-diff": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/arr-diff/-/arr-diff-4.0.0.tgz",
+      "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/arr-flatten": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/arr-flatten/-/arr-flatten-1.1.0.tgz",
+      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/arr-union": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/arr-union/-/arr-union-3.1.0.tgz",
+      "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/array-buffer-byte-length": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
+      "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.5",
+        "is-array-buffer": "^3.0.4"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/array-unique": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmmirror.com/array-unique/-/array-unique-0.3.2.tgz",
+      "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/arraybuffer.prototype.slice": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz",
+      "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==",
+      "dev": true,
+      "dependencies": {
+        "array-buffer-byte-length": "^1.0.1",
+        "call-bind": "^1.0.5",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.22.3",
+        "es-errors": "^1.2.1",
+        "get-intrinsic": "^1.2.3",
+        "is-array-buffer": "^3.0.4",
+        "is-shared-array-buffer": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/assign-symbols": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/assign-symbols/-/assign-symbols-1.0.0.tgz",
+      "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+    },
+    "node_modules/atob": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmmirror.com/atob/-/atob-2.1.2.tgz",
+      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
+      "dev": true,
+      "bin": {
+        "atob": "bin/atob.js"
+      },
+      "engines": {
+        "node": ">= 4.5.0"
+      }
+    },
+    "node_modules/available-typed-arrays": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+      "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+      "dev": true,
+      "dependencies": {
+        "possible-typed-array-names": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/axios": {
+      "version": "1.7.7",
+      "resolved": "https://registry.npmmirror.com/axios/-/axios-1.7.7.tgz",
+      "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==",
+      "dependencies": {
+        "follow-redirects": "^1.15.6",
+        "form-data": "^4.0.0",
+        "proxy-from-env": "^1.1.0"
+      }
+    },
+    "node_modules/b-tween": {
+      "version": "0.3.3",
+      "resolved": "https://registry.npmmirror.com/b-tween/-/b-tween-0.3.3.tgz",
+      "integrity": "sha512-oEHegcRpA7fAuc9KC4nktucuZn2aS8htymCPcP3qkEGPqiBH+GfqtqoG2l7LxHngg6O0HFM7hOeOYExl1Oz4ZA=="
+    },
+    "node_modules/b-validate": {
+      "version": "1.5.3",
+      "resolved": "https://registry.npmmirror.com/b-validate/-/b-validate-1.5.3.tgz",
+      "integrity": "sha512-iCvCkGFskbaYtfQ0a3GmcQCHl/Sv1GufXFGuUQ+FE+WJa7A/espLOuFIn09B944V8/ImPj71T4+rTASxO2PAuA=="
+    },
+    "node_modules/base": {
+      "version": "0.11.2",
+      "resolved": "https://registry.npmmirror.com/base/-/base-0.11.2.tgz",
+      "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+      "dev": true,
+      "dependencies": {
+        "cache-base": "^1.0.1",
+        "class-utils": "^0.3.5",
+        "component-emitter": "^1.2.1",
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.1",
+        "mixin-deep": "^1.2.0",
+        "pascalcase": "^0.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/base/node_modules/isobject": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz",
+      "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/big.js": {
+      "version": "5.2.2",
+      "resolved": "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz",
+      "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+      "dev": true,
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/bluebird": {
+      "version": "3.7.2",
+      "resolved": "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz",
+      "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+      "dev": true
+    },
+    "node_modules/boolbase": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz",
+      "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+      "dev": true
+    },
+    "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,
+      "dependencies": {
+        "fill-range": "^7.1.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/cache-base": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/cache-base/-/cache-base-1.0.1.tgz",
+      "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+      "dev": true,
+      "dependencies": {
+        "collection-visit": "^1.0.0",
+        "component-emitter": "^1.2.1",
+        "get-value": "^2.0.6",
+        "has-value": "^1.0.0",
+        "isobject": "^3.0.1",
+        "set-value": "^2.0.0",
+        "to-object-path": "^0.3.0",
+        "union-value": "^1.0.0",
+        "unset-value": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/cache-base/node_modules/isobject": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz",
+      "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/call-bind": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.7.tgz",
+      "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
+      "dev": true,
+      "dependencies": {
+        "es-define-property": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
+        "get-intrinsic": "^1.2.4",
+        "set-function-length": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/cfb": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz",
+      "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==",
+      "dependencies": {
+        "adler-32": "~1.3.0",
+        "crc-32": "~1.2.0"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/chalk": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-1.1.3.tgz",
+      "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^2.2.1",
+        "escape-string-regexp": "^1.0.2",
+        "has-ansi": "^2.0.0",
+        "strip-ansi": "^3.0.0",
+        "supports-color": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/chalk/node_modules/supports-color": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-2.0.0.tgz",
+      "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/class-utils": {
+      "version": "0.3.6",
+      "resolved": "https://registry.npmmirror.com/class-utils/-/class-utils-0.3.6.tgz",
+      "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+      "dev": true,
+      "dependencies": {
+        "arr-union": "^3.1.0",
+        "define-property": "^0.2.5",
+        "isobject": "^3.0.0",
+        "static-extend": "^0.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/class-utils/node_modules/define-property": {
+      "version": "0.2.5",
+      "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz",
+      "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+      "dev": true,
+      "dependencies": {
+        "is-descriptor": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/class-utils/node_modules/is-descriptor": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz",
+      "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
+      "dev": true,
+      "dependencies": {
+        "is-accessor-descriptor": "^1.0.1",
+        "is-data-descriptor": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/class-utils/node_modules/isobject": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz",
+      "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/clone": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmmirror.com/clone/-/clone-2.1.2.tgz",
+      "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/codepage": {
+      "version": "1.15.0",
+      "resolved": "https://registry.npmmirror.com/codepage/-/codepage-1.15.0.tgz",
+      "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/collection-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/collection-visit/-/collection-visit-1.0.0.tgz",
+      "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==",
+      "dev": true,
+      "dependencies": {
+        "map-visit": "^1.0.0",
+        "object-visit": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/color": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmmirror.com/color/-/color-3.2.1.tgz",
+      "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==",
+      "dependencies": {
+        "color-convert": "^1.9.3",
+        "color-string": "^1.6.0"
+      }
+    },
+    "node_modules/color-convert": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+      "dependencies": {
+        "color-name": "1.1.3"
+      }
+    },
+    "node_modules/color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+    },
+    "node_modules/color-string": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmmirror.com/color-string/-/color-string-1.9.1.tgz",
+      "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
+      "dependencies": {
+        "color-name": "^1.0.0",
+        "simple-swizzle": "^0.2.2"
+      }
+    },
+    "node_modules/combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "dependencies": {
+        "delayed-stream": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/commander": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz",
+      "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+      "dev": true,
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/component-emitter": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmmirror.com/component-emitter/-/component-emitter-1.3.1.tgz",
+      "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/compute-scroll-into-view": {
+      "version": "1.0.20",
+      "resolved": "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz",
+      "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg=="
+    },
+    "node_modules/copy-anything": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-2.0.6.tgz",
+      "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==",
+      "dependencies": {
+        "is-what": "^3.14.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/mesqueeb"
+      }
+    },
+    "node_modules/copy-descriptor": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmmirror.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+      "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/cors": {
+      "version": "2.8.5",
+      "resolved": "https://registry.npmmirror.com/cors/-/cors-2.8.5.tgz",
+      "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+      "dev": true,
+      "dependencies": {
+        "object-assign": "^4",
+        "vary": "^1"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/crc-32": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz",
+      "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
+      "bin": {
+        "crc32": "bin/crc32.njs"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/crypto-js": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz",
+      "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="
+    },
+    "node_modules/css-select": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/css-select/-/css-select-4.3.0.tgz",
+      "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
+      "dev": true,
+      "dependencies": {
+        "boolbase": "^1.0.0",
+        "css-what": "^6.0.1",
+        "domhandler": "^4.3.1",
+        "domutils": "^2.8.0",
+        "nth-check": "^2.0.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/fb55"
+      }
+    },
+    "node_modules/css-select/node_modules/dom-serializer": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz",
+      "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
+      "dev": true,
+      "dependencies": {
+        "domelementtype": "^2.0.1",
+        "domhandler": "^4.2.0",
+        "entities": "^2.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+      }
+    },
+    "node_modules/css-select/node_modules/domelementtype": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz",
+      "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/fb55"
+        }
+      ]
+    },
+    "node_modules/css-select/node_modules/domhandler": {
+      "version": "4.3.1",
+      "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz",
+      "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
+      "dev": true,
+      "dependencies": {
+        "domelementtype": "^2.2.0"
+      },
+      "engines": {
+        "node": ">= 4"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/domhandler?sponsor=1"
+      }
+    },
+    "node_modules/css-select/node_modules/domutils": {
+      "version": "2.8.0",
+      "resolved": "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz",
+      "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
+      "dev": true,
+      "dependencies": {
+        "dom-serializer": "^1.0.1",
+        "domelementtype": "^2.2.0",
+        "domhandler": "^4.2.0"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/domutils?sponsor=1"
+      }
+    },
+    "node_modules/css-select/node_modules/entities": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz",
+      "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
+    "node_modules/css-tree": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-1.1.3.tgz",
+      "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
+      "dev": true,
+      "dependencies": {
+        "mdn-data": "2.0.14",
+        "source-map": "^0.6.1"
+      },
+      "engines": {
+        "node": ">=8.0.0"
+      }
+    },
+    "node_modules/css-what": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz",
+      "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
+      "dev": true,
+      "engines": {
+        "node": ">= 6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/fb55"
+      }
+    },
+    "node_modules/csso": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmmirror.com/csso/-/csso-4.2.0.tgz",
+      "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
+      "dev": true,
+      "dependencies": {
+        "css-tree": "^1.1.2"
+      },
+      "engines": {
+        "node": ">=8.0.0"
+      }
+    },
+    "node_modules/csstype": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
+      "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
+    },
+    "node_modules/data-view-buffer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
+      "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.6",
+        "es-errors": "^1.3.0",
+        "is-data-view": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/data-view-byte-length": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz",
+      "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "es-errors": "^1.3.0",
+        "is-data-view": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/data-view-byte-offset": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz",
+      "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.6",
+        "es-errors": "^1.3.0",
+        "is-data-view": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/dayjs": {
+      "version": "1.11.13",
+      "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz",
+      "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
+    },
+    "node_modules/debug": {
+      "version": "4.3.7",
+      "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.7.tgz",
+      "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+      "dev": true,
+      "dependencies": {
+        "ms": "^2.1.3"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/decode-uri-component": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmmirror.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
+      "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/define-data-property": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz",
+      "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+      "dev": true,
+      "dependencies": {
+        "es-define-property": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/define-properties": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz",
+      "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+      "dev": true,
+      "dependencies": {
+        "define-data-property": "^1.0.1",
+        "has-property-descriptors": "^1.0.0",
+        "object-keys": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/define-property": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/define-property/-/define-property-1.0.0.tgz",
+      "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==",
+      "dev": true,
+      "dependencies": {
+        "is-descriptor": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/dom-serializer": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-0.2.2.tgz",
+      "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+      "dev": true,
+      "dependencies": {
+        "domelementtype": "^2.0.1",
+        "entities": "^2.0.0"
+      }
+    },
+    "node_modules/dom-serializer/node_modules/domelementtype": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz",
+      "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/fb55"
+        }
+      ]
+    },
+    "node_modules/dom-serializer/node_modules/entities": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz",
+      "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
+    "node_modules/domelementtype": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-1.3.1.tgz",
+      "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
+      "dev": true
+    },
+    "node_modules/domhandler": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-2.4.2.tgz",
+      "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
+      "dev": true,
+      "dependencies": {
+        "domelementtype": "1"
+      }
+    },
+    "node_modules/domutils": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmmirror.com/domutils/-/domutils-1.7.0.tgz",
+      "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
+      "dev": true,
+      "dependencies": {
+        "dom-serializer": "0",
+        "domelementtype": "1"
+      }
+    },
+    "node_modules/echarts": {
+      "version": "5.5.1",
+      "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.5.1.tgz",
+      "integrity": "sha512-Fce8upazaAXUVUVsjgV6mBnGuqgO+JNDlcgF79Dksy4+wgGpQB2lmYoO4TSweFg/mZITdpGHomw/cNBJZj1icA==",
+      "dependencies": {
+        "tslib": "2.3.0",
+        "zrender": "5.6.0"
+      }
+    },
+    "node_modules/echarts/node_modules/tslib": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
+      "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
+    },
+    "node_modules/emojis-list": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/emojis-list/-/emojis-list-3.0.0.tgz",
+      "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+      "dev": true,
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/entities": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/entities/-/entities-1.1.2.tgz",
+      "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
+      "dev": true
+    },
+    "node_modules/errno": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz",
+      "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
+      "optional": true,
+      "dependencies": {
+        "prr": "~1.0.1"
+      },
+      "bin": {
+        "errno": "cli.js"
+      }
+    },
+    "node_modules/es-abstract": {
+      "version": "1.23.3",
+      "resolved": "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.23.3.tgz",
+      "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==",
+      "dev": true,
+      "dependencies": {
+        "array-buffer-byte-length": "^1.0.1",
+        "arraybuffer.prototype.slice": "^1.0.3",
+        "available-typed-arrays": "^1.0.7",
+        "call-bind": "^1.0.7",
+        "data-view-buffer": "^1.0.1",
+        "data-view-byte-length": "^1.0.1",
+        "data-view-byte-offset": "^1.0.0",
+        "es-define-property": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.0.0",
+        "es-set-tostringtag": "^2.0.3",
+        "es-to-primitive": "^1.2.1",
+        "function.prototype.name": "^1.1.6",
+        "get-intrinsic": "^1.2.4",
+        "get-symbol-description": "^1.0.2",
+        "globalthis": "^1.0.3",
+        "gopd": "^1.0.1",
+        "has-property-descriptors": "^1.0.2",
+        "has-proto": "^1.0.3",
+        "has-symbols": "^1.0.3",
+        "hasown": "^2.0.2",
+        "internal-slot": "^1.0.7",
+        "is-array-buffer": "^3.0.4",
+        "is-callable": "^1.2.7",
+        "is-data-view": "^1.0.1",
+        "is-negative-zero": "^2.0.3",
+        "is-regex": "^1.1.4",
+        "is-shared-array-buffer": "^1.0.3",
+        "is-string": "^1.0.7",
+        "is-typed-array": "^1.1.13",
+        "is-weakref": "^1.0.2",
+        "object-inspect": "^1.13.1",
+        "object-keys": "^1.1.1",
+        "object.assign": "^4.1.5",
+        "regexp.prototype.flags": "^1.5.2",
+        "safe-array-concat": "^1.1.2",
+        "safe-regex-test": "^1.0.3",
+        "string.prototype.trim": "^1.2.9",
+        "string.prototype.trimend": "^1.0.8",
+        "string.prototype.trimstart": "^1.0.8",
+        "typed-array-buffer": "^1.0.2",
+        "typed-array-byte-length": "^1.0.1",
+        "typed-array-byte-offset": "^1.0.2",
+        "typed-array-length": "^1.0.6",
+        "unbox-primitive": "^1.0.2",
+        "which-typed-array": "^1.1.15"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/es-define-property": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.0.tgz",
+      "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
+      "dev": true,
+      "dependencies": {
+        "get-intrinsic": "^1.2.4"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-errors": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz",
+      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-object-atoms": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
+      "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
+      "dev": true,
+      "dependencies": {
+        "es-errors": "^1.3.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-set-tostringtag": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
+      "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
+      "dev": true,
+      "dependencies": {
+        "get-intrinsic": "^1.2.4",
+        "has-tostringtag": "^1.0.2",
+        "hasown": "^2.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-to-primitive": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+      "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+      "dev": true,
+      "dependencies": {
+        "is-callable": "^1.1.4",
+        "is-date-object": "^1.0.1",
+        "is-symbol": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "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,
+      "bin": {
+        "esbuild": "bin/esbuild"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "optionalDependencies": {
+        "@esbuild/aix-ppc64": "0.21.5",
+        "@esbuild/android-arm": "0.21.5",
+        "@esbuild/android-arm64": "0.21.5",
+        "@esbuild/android-x64": "0.21.5",
+        "@esbuild/darwin-arm64": "0.21.5",
+        "@esbuild/darwin-x64": "0.21.5",
+        "@esbuild/freebsd-arm64": "0.21.5",
+        "@esbuild/freebsd-x64": "0.21.5",
+        "@esbuild/linux-arm": "0.21.5",
+        "@esbuild/linux-arm64": "0.21.5",
+        "@esbuild/linux-ia32": "0.21.5",
+        "@esbuild/linux-loong64": "0.21.5",
+        "@esbuild/linux-mips64el": "0.21.5",
+        "@esbuild/linux-ppc64": "0.21.5",
+        "@esbuild/linux-riscv64": "0.21.5",
+        "@esbuild/linux-s390x": "0.21.5",
+        "@esbuild/linux-x64": "0.21.5",
+        "@esbuild/netbsd-x64": "0.21.5",
+        "@esbuild/openbsd-x64": "0.21.5",
+        "@esbuild/sunos-x64": "0.21.5",
+        "@esbuild/win32-arm64": "0.21.5",
+        "@esbuild/win32-ia32": "0.21.5",
+        "@esbuild/win32-x64": "0.21.5"
+      }
+    },
+    "node_modules/escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/estree-walker": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
+      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
+    },
+    "node_modules/etag": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz",
+      "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/expand-brackets": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmmirror.com/expand-brackets/-/expand-brackets-2.1.4.tgz",
+      "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==",
+      "dev": true,
+      "dependencies": {
+        "debug": "^2.3.3",
+        "define-property": "^0.2.5",
+        "extend-shallow": "^2.0.1",
+        "posix-character-classes": "^0.1.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/expand-brackets/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dev": true,
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/expand-brackets/node_modules/define-property": {
+      "version": "0.2.5",
+      "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz",
+      "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+      "dev": true,
+      "dependencies": {
+        "is-descriptor": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/expand-brackets/node_modules/is-descriptor": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz",
+      "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
+      "dev": true,
+      "dependencies": {
+        "is-accessor-descriptor": "^1.0.1",
+        "is-data-descriptor": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/expand-brackets/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+      "dev": true
+    },
+    "node_modules/extend-shallow": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz",
+      "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+      "dev": true,
+      "dependencies": {
+        "is-extendable": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/extglob": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmmirror.com/extglob/-/extglob-2.0.4.tgz",
+      "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+      "dev": true,
+      "dependencies": {
+        "array-unique": "^0.3.2",
+        "define-property": "^1.0.0",
+        "expand-brackets": "^2.1.4",
+        "extend-shallow": "^2.0.1",
+        "fragment-cache": "^0.2.1",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/fast-glob": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz",
+      "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+      "dev": true,
+      "dependencies": {
+        "@nodelib/fs.stat": "^2.0.2",
+        "@nodelib/fs.walk": "^1.2.3",
+        "glob-parent": "^5.1.2",
+        "merge2": "^1.3.0",
+        "micromatch": "^4.0.4"
+      },
+      "engines": {
+        "node": ">=8.6.0"
+      }
+    },
+    "node_modules/fastq": {
+      "version": "1.17.1",
+      "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.17.1.tgz",
+      "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
+      "dev": true,
+      "dependencies": {
+        "reusify": "^1.0.4"
+      }
+    },
+    "node_modules/file-saver": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmmirror.com/file-saver/-/file-saver-2.0.5.tgz",
+      "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA=="
+    },
+    "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,
+      "dependencies": {
+        "to-regex-range": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/follow-redirects": {
+      "version": "1.15.9",
+      "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.9.tgz",
+      "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://github.com/sponsors/RubenVerborgh"
+        }
+      ],
+      "engines": {
+        "node": ">=4.0"
+      },
+      "peerDependenciesMeta": {
+        "debug": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/for-each": {
+      "version": "0.3.3",
+      "resolved": "https://registry.npmmirror.com/for-each/-/for-each-0.3.3.tgz",
+      "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+      "dev": true,
+      "dependencies": {
+        "is-callable": "^1.1.3"
+      }
+    },
+    "node_modules/for-in": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/for-in/-/for-in-1.0.2.tgz",
+      "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/form-data": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.1.tgz",
+      "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
+      "dependencies": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.8",
+        "mime-types": "^2.1.12"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/frac": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz",
+      "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/fragment-cache": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmmirror.com/fragment-cache/-/fragment-cache-0.2.1.tgz",
+      "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==",
+      "dev": true,
+      "dependencies": {
+        "map-cache": "^0.2.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/fs-extra": {
+      "version": "10.1.0",
+      "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz",
+      "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+      "dev": true,
+      "dependencies": {
+        "graceful-fs": "^4.2.0",
+        "jsonfile": "^6.0.1",
+        "universalify": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "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,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+      }
+    },
+    "node_modules/function-bind": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz",
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/function.prototype.name": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
+      "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.2.0",
+        "es-abstract": "^1.22.1",
+        "functions-have-names": "^1.2.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/functions-have-names": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz",
+      "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/get-intrinsic": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
+      "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
+      "dev": true,
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
+        "has-proto": "^1.0.1",
+        "has-symbols": "^1.0.3",
+        "hasown": "^2.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/get-symbol-description": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz",
+      "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.5",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.4"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/get-value": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmmirror.com/get-value/-/get-value-2.0.6.tgz",
+      "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "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,
+      "dependencies": {
+        "is-glob": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/globalthis": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.4.tgz",
+      "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
+      "dev": true,
+      "dependencies": {
+        "define-properties": "^1.2.1",
+        "gopd": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/gopd": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz",
+      "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+      "dev": true,
+      "dependencies": {
+        "get-intrinsic": "^1.1.3"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/graceful-fs": {
+      "version": "4.2.11",
+      "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz",
+      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+      "devOptional": true
+    },
+    "node_modules/has-ansi": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/has-ansi/-/has-ansi-2.0.0.tgz",
+      "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==",
+      "dev": true,
+      "dependencies": {
+        "ansi-regex": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/has-bigints": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.0.2.tgz",
+      "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-flag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-1.0.0.tgz",
+      "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/has-property-descriptors": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+      "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+      "dev": true,
+      "dependencies": {
+        "es-define-property": "^1.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-proto": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.3.tgz",
+      "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-symbols": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz",
+      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-tostringtag": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+      "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+      "dev": true,
+      "dependencies": {
+        "has-symbols": "^1.0.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/has-value/-/has-value-1.0.0.tgz",
+      "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==",
+      "dev": true,
+      "dependencies": {
+        "get-value": "^2.0.6",
+        "has-values": "^1.0.0",
+        "isobject": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/has-value/node_modules/isobject": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz",
+      "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/has-values": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/has-values/-/has-values-1.0.0.tgz",
+      "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==",
+      "dev": true,
+      "dependencies": {
+        "is-number": "^3.0.0",
+        "kind-of": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/has-values/node_modules/is-number": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz",
+      "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==",
+      "dev": true,
+      "dependencies": {
+        "kind-of": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/has-values/node_modules/is-number/node_modules/kind-of": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+      "dev": true,
+      "dependencies": {
+        "is-buffer": "^1.1.5"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/has-values/node_modules/kind-of": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-4.0.0.tgz",
+      "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==",
+      "dev": true,
+      "dependencies": {
+        "is-buffer": "^1.1.5"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/hasown": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz",
+      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+      "dev": true,
+      "dependencies": {
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/he": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz",
+      "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+      "dev": true,
+      "bin": {
+        "he": "bin/he"
+      }
+    },
+    "node_modules/htmlparser2": {
+      "version": "3.10.1",
+      "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-3.10.1.tgz",
+      "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
+      "dev": true,
+      "dependencies": {
+        "domelementtype": "^1.3.1",
+        "domhandler": "^2.3.0",
+        "domutils": "^1.5.1",
+        "entities": "^1.1.1",
+        "inherits": "^2.0.1",
+        "readable-stream": "^3.1.1"
+      }
+    },
+    "node_modules/iconv-lite": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz",
+      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+      "optional": true,
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/image-size": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz",
+      "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==",
+      "devOptional": true,
+      "bin": {
+        "image-size": "bin/image-size.js"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "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
+    },
+    "node_modules/internal-slot": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.0.7.tgz",
+      "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==",
+      "dev": true,
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "hasown": "^2.0.0",
+        "side-channel": "^1.0.4"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/is-accessor-descriptor": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz",
+      "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==",
+      "dev": true,
+      "dependencies": {
+        "hasown": "^2.0.0"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/is-array-buffer": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
+      "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "get-intrinsic": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-arrayish": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.3.2.tgz",
+      "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
+    },
+    "node_modules/is-bigint": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.0.4.tgz",
+      "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+      "dev": true,
+      "dependencies": {
+        "has-bigints": "^1.0.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-boolean-object": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
+      "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "has-tostringtag": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-buffer": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz",
+      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+      "dev": true
+    },
+    "node_modules/is-callable": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz",
+      "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-data-descriptor": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz",
+      "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==",
+      "dev": true,
+      "dependencies": {
+        "hasown": "^2.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/is-data-view": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/is-data-view/-/is-data-view-1.0.1.tgz",
+      "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==",
+      "dev": true,
+      "dependencies": {
+        "is-typed-array": "^1.1.13"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-date-object": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz",
+      "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+      "dev": true,
+      "dependencies": {
+        "has-tostringtag": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-descriptor": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-1.0.3.tgz",
+      "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==",
+      "dev": true,
+      "dependencies": {
+        "is-accessor-descriptor": "^1.0.1",
+        "is-data-descriptor": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/is-extendable": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz",
+      "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "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,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "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,
+      "dependencies": {
+        "is-extglob": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-negative-zero": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
+      "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "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,
+      "engines": {
+        "node": ">=0.12.0"
+      }
+    },
+    "node_modules/is-number-object": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmmirror.com/is-number-object/-/is-number-object-1.0.7.tgz",
+      "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+      "dev": true,
+      "dependencies": {
+        "has-tostringtag": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-plain-obj": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+      "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-plain-object": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+      "dev": true,
+      "dependencies": {
+        "isobject": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-plain-object/node_modules/isobject": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz",
+      "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-regex": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz",
+      "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "has-tostringtag": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-shared-array-buffer": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz",
+      "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.7"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-string": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmmirror.com/is-string/-/is-string-1.0.7.tgz",
+      "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+      "dev": true,
+      "dependencies": {
+        "has-tostringtag": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-symbol": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.0.4.tgz",
+      "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+      "dev": true,
+      "dependencies": {
+        "has-symbols": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-typed-array": {
+      "version": "1.1.13",
+      "resolved": "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.13.tgz",
+      "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
+      "dev": true,
+      "dependencies": {
+        "which-typed-array": "^1.1.14"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-weakref": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.0.2.tgz",
+      "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.2"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-what": {
+      "version": "3.14.1",
+      "resolved": "https://registry.npmmirror.com/is-what/-/is-what-3.14.1.tgz",
+      "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA=="
+    },
+    "node_modules/is-windows": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/is-windows/-/is-windows-1.0.2.tgz",
+      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+      "dev": true
+    },
+    "node_modules/isobject": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/isobject/-/isobject-2.1.0.tgz",
+      "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==",
+      "dev": true,
+      "dependencies": {
+        "isarray": "1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/js-base64": {
+      "version": "2.6.4",
+      "resolved": "https://registry.npmmirror.com/js-base64/-/js-base64-2.6.4.tgz",
+      "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==",
+      "dev": true
+    },
+    "node_modules/json5": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.2.tgz",
+      "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+      "dev": true,
+      "dependencies": {
+        "minimist": "^1.2.0"
+      },
+      "bin": {
+        "json5": "lib/cli.js"
+      }
+    },
+    "node_modules/jsonfile": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz",
+      "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+      "dev": true,
+      "dependencies": {
+        "universalify": "^2.0.0"
+      },
+      "optionalDependencies": {
+        "graceful-fs": "^4.1.6"
+      }
+    },
+    "node_modules/kind-of": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-5.1.0.tgz",
+      "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/less": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmmirror.com/less/-/less-4.2.0.tgz",
+      "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==",
+      "dependencies": {
+        "copy-anything": "^2.0.1",
+        "parse-node-version": "^1.0.1",
+        "tslib": "^2.3.0"
+      },
+      "bin": {
+        "lessc": "bin/lessc"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "optionalDependencies": {
+        "errno": "^0.1.1",
+        "graceful-fs": "^4.1.2",
+        "image-size": "~0.5.0",
+        "make-dir": "^2.1.0",
+        "mime": "^1.4.1",
+        "needle": "^3.1.0",
+        "source-map": "~0.6.0"
+      }
+    },
+    "node_modules/less-loader": {
+      "version": "12.2.0",
+      "resolved": "https://registry.npmmirror.com/less-loader/-/less-loader-12.2.0.tgz",
+      "integrity": "sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg==",
+      "engines": {
+        "node": ">= 18.12.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependencies": {
+        "@rspack/core": "0.x || 1.x",
+        "less": "^3.5.0 || ^4.0.0",
+        "webpack": "^5.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@rspack/core": {
+          "optional": true
+        },
+        "webpack": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/loader-utils": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.2.tgz",
+      "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
+      "dev": true,
+      "dependencies": {
+        "big.js": "^5.2.2",
+        "emojis-list": "^3.0.0",
+        "json5": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/lodash": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+    },
+    "node_modules/magic-string": {
+      "version": "0.30.12",
+      "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.12.tgz",
+      "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==",
+      "dependencies": {
+        "@jridgewell/sourcemap-codec": "^1.5.0"
+      }
+    },
+    "node_modules/make-dir": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz",
+      "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+      "optional": true,
+      "dependencies": {
+        "pify": "^4.0.1",
+        "semver": "^5.6.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/map-cache": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmmirror.com/map-cache/-/map-cache-0.2.2.tgz",
+      "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/map-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/map-visit/-/map-visit-1.0.0.tgz",
+      "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==",
+      "dev": true,
+      "dependencies": {
+        "object-visit": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/mdn-data": {
+      "version": "2.0.14",
+      "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.14.tgz",
+      "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
+      "dev": true
+    },
+    "node_modules/merge-options": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/merge-options/-/merge-options-1.0.1.tgz",
+      "integrity": "sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==",
+      "dev": true,
+      "dependencies": {
+        "is-plain-obj": "^1.1"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "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,
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "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,
+      "dependencies": {
+        "braces": "^3.0.3",
+        "picomatch": "^2.3.1"
+      },
+      "engines": {
+        "node": ">=8.6"
+      }
+    },
+    "node_modules/mime": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz",
+      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+      "optional": true,
+      "bin": {
+        "mime": "cli.js"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/mime-db": {
+      "version": "1.52.0",
+      "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mime-types": {
+      "version": "2.1.35",
+      "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
+      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+      "dependencies": {
+        "mime-db": "1.52.0"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/minimist": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz",
+      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/mixin-deep": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmmirror.com/mixin-deep/-/mixin-deep-1.3.2.tgz",
+      "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
+      "dev": true,
+      "dependencies": {
+        "for-in": "^1.0.2",
+        "is-extendable": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/mixin-deep/node_modules/is-extendable": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz",
+      "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+      "dev": true,
+      "dependencies": {
+        "is-plain-object": "^2.0.4"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/monaco-editor": {
+      "version": "0.52.0",
+      "resolved": "https://registry.npmmirror.com/monaco-editor/-/monaco-editor-0.52.0.tgz",
+      "integrity": "sha512-OeWhNpABLCeTqubfqLMXGsqf6OmPU6pHM85kF3dhy6kq5hnhuVS1p3VrEW/XhWHc71P2tHyS5JFySD8mgs1crw=="
+    },
+    "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
+    },
+    "node_modules/nanoid": {
+      "version": "3.3.7",
+      "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz",
+      "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "bin": {
+        "nanoid": "bin/nanoid.cjs"
+      },
+      "engines": {
+        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+      }
+    },
+    "node_modules/nanomatch": {
+      "version": "1.2.13",
+      "resolved": "https://registry.npmmirror.com/nanomatch/-/nanomatch-1.2.13.tgz",
+      "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+      "dev": true,
+      "dependencies": {
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "fragment-cache": "^0.2.1",
+        "is-windows": "^1.0.2",
+        "kind-of": "^6.0.2",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/nanomatch/node_modules/define-property": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/define-property/-/define-property-2.0.2.tgz",
+      "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+      "dev": true,
+      "dependencies": {
+        "is-descriptor": "^1.0.2",
+        "isobject": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/nanomatch/node_modules/extend-shallow": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz",
+      "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==",
+      "dev": true,
+      "dependencies": {
+        "assign-symbols": "^1.0.0",
+        "is-extendable": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/nanomatch/node_modules/is-extendable": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz",
+      "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+      "dev": true,
+      "dependencies": {
+        "is-plain-object": "^2.0.4"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/nanomatch/node_modules/isobject": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz",
+      "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/nanomatch/node_modules/kind-of": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz",
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/needle": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmmirror.com/needle/-/needle-3.3.1.tgz",
+      "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==",
+      "optional": true,
+      "dependencies": {
+        "iconv-lite": "^0.6.3",
+        "sax": "^1.2.4"
+      },
+      "bin": {
+        "needle": "bin/needle"
+      },
+      "engines": {
+        "node": ">= 4.4.x"
+      }
+    },
+    "node_modules/nth-check": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz",
+      "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+      "dev": true,
+      "dependencies": {
+        "boolbase": "^1.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/nth-check?sponsor=1"
+      }
+    },
+    "node_modules/number-precision": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmmirror.com/number-precision/-/number-precision-1.6.0.tgz",
+      "integrity": "sha512-05OLPgbgmnixJw+VvEh18yNPUo3iyp4BEWJcrLu4X9W05KmMifN7Mu5exYvQXqxxeNWhvIF+j3Rij+HmddM/hQ=="
+    },
+    "node_modules/object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/object-copy": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmmirror.com/object-copy/-/object-copy-0.1.0.tgz",
+      "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==",
+      "dev": true,
+      "dependencies": {
+        "copy-descriptor": "^0.1.0",
+        "define-property": "^0.2.5",
+        "kind-of": "^3.0.3"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/object-copy/node_modules/define-property": {
+      "version": "0.2.5",
+      "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz",
+      "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+      "dev": true,
+      "dependencies": {
+        "is-descriptor": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/object-copy/node_modules/is-descriptor": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz",
+      "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
+      "dev": true,
+      "dependencies": {
+        "is-accessor-descriptor": "^1.0.1",
+        "is-data-descriptor": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/object-copy/node_modules/kind-of": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+      "dev": true,
+      "dependencies": {
+        "is-buffer": "^1.1.5"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/object-inspect": {
+      "version": "1.13.2",
+      "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.2.tgz",
+      "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/object-keys": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz",
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/object-visit": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/object-visit/-/object-visit-1.0.1.tgz",
+      "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==",
+      "dev": true,
+      "dependencies": {
+        "isobject": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/object-visit/node_modules/isobject": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz",
+      "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/object.assign": {
+      "version": "4.1.5",
+      "resolved": "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.5.tgz",
+      "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.5",
+        "define-properties": "^1.2.1",
+        "has-symbols": "^1.0.3",
+        "object-keys": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/object.pick": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/object.pick/-/object.pick-1.3.0.tgz",
+      "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==",
+      "dev": true,
+      "dependencies": {
+        "isobject": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/object.pick/node_modules/isobject": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz",
+      "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/parse-node-version": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/parse-node-version/-/parse-node-version-1.0.1.tgz",
+      "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/pascalcase": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmmirror.com/pascalcase/-/pascalcase-0.1.1.tgz",
+      "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/pathe": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmmirror.com/pathe/-/pathe-0.2.0.tgz",
+      "integrity": "sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==",
+      "dev": true
+    },
+    "node_modules/picocolors": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
+      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
+    },
+    "node_modules/picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+      "dev": true,
+      "engines": {
+        "node": ">=8.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/pify": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz",
+      "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+      "optional": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/pinia": {
+      "version": "2.2.6",
+      "resolved": "https://registry.npmmirror.com/pinia/-/pinia-2.2.6.tgz",
+      "integrity": "sha512-vIsR8JkDN5Ga2vAxqOE2cJj4VtsHnzpR1Fz30kClxlh0yCHfec6uoMeM3e/ddqmwFUejK3NlrcQa/shnpyT4hA==",
+      "dependencies": {
+        "@vue/devtools-api": "^6.6.3",
+        "vue-demi": "^0.14.10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/posva"
+      },
+      "peerDependencies": {
+        "@vue/composition-api": "^1.4.0",
+        "typescript": ">=4.4.4",
+        "vue": "^2.6.14 || ^3.5.11"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        },
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/pinia/node_modules/vue-demi": {
+      "version": "0.14.10",
+      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
+      "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
+      "hasInstallScript": true,
+      "bin": {
+        "vue-demi-fix": "bin/vue-demi-fix.js",
+        "vue-demi-switch": "bin/vue-demi-switch.js"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "@vue/composition-api": "^1.0.0-rc.1",
+        "vue": "^3.0.0-0 || ^2.6.0"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/posix-character-classes": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmmirror.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+      "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/possible-typed-array-names": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
+      "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/postcss": {
+      "version": "8.4.47",
+      "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.47.tgz",
+      "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/postcss"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "dependencies": {
+        "nanoid": "^3.3.7",
+        "picocolors": "^1.1.0",
+        "source-map-js": "^1.2.1"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      }
+    },
+    "node_modules/postcss-prefix-selector": {
+      "version": "1.16.1",
+      "resolved": "https://registry.npmmirror.com/postcss-prefix-selector/-/postcss-prefix-selector-1.16.1.tgz",
+      "integrity": "sha512-Umxu+FvKMwlY6TyDzGFoSUnzW+NOfMBLyC1tAkIjgX+Z/qGspJeRjVC903D7mx7TuBpJlwti2ibXtWuA7fKMeQ==",
+      "dev": true,
+      "peerDependencies": {
+        "postcss": ">4 <9"
+      }
+    },
+    "node_modules/posthtml": {
+      "version": "0.9.2",
+      "resolved": "https://registry.npmmirror.com/posthtml/-/posthtml-0.9.2.tgz",
+      "integrity": "sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==",
+      "dev": true,
+      "dependencies": {
+        "posthtml-parser": "^0.2.0",
+        "posthtml-render": "^1.0.5"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/posthtml-parser": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmmirror.com/posthtml-parser/-/posthtml-parser-0.2.1.tgz",
+      "integrity": "sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==",
+      "dev": true,
+      "dependencies": {
+        "htmlparser2": "^3.8.3",
+        "isobject": "^2.1.0"
+      }
+    },
+    "node_modules/posthtml-rename-id": {
+      "version": "1.0.12",
+      "resolved": "https://registry.npmmirror.com/posthtml-rename-id/-/posthtml-rename-id-1.0.12.tgz",
+      "integrity": "sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==",
+      "dev": true,
+      "dependencies": {
+        "escape-string-regexp": "1.0.5"
+      }
+    },
+    "node_modules/posthtml-render": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmmirror.com/posthtml-render/-/posthtml-render-1.4.0.tgz",
+      "integrity": "sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/posthtml-svg-mode": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/posthtml-svg-mode/-/posthtml-svg-mode-1.0.3.tgz",
+      "integrity": "sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==",
+      "dev": true,
+      "dependencies": {
+        "merge-options": "1.0.1",
+        "posthtml": "^0.9.2",
+        "posthtml-parser": "^0.2.1",
+        "posthtml-render": "^1.0.6"
+      }
+    },
+    "node_modules/proxy-from-env": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+    },
+    "node_modules/prr": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz",
+      "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
+      "optional": true
+    },
+    "node_modules/qrcode.vue": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmmirror.com/qrcode.vue/-/qrcode.vue-3.6.0.tgz",
+      "integrity": "sha512-vQcl2fyHYHMjDO1GguCldJxepq2izQjBkDEEu9NENgfVKP6mv/e2SU62WbqYHGwTgWXLhxZ1NCD1dAZKHQq1fg==",
+      "peerDependencies": {
+        "vue": "^3.0.0"
+      }
+    },
+    "node_modules/query-string": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmmirror.com/query-string/-/query-string-4.3.4.tgz",
+      "integrity": "sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==",
+      "dev": true,
+      "dependencies": {
+        "object-assign": "^4.1.0",
+        "strict-uri-encode": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "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": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
+    "node_modules/readable-stream": {
+      "version": "3.6.2",
+      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz",
+      "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+      "dev": true,
+      "dependencies": {
+        "inherits": "^2.0.3",
+        "string_decoder": "^1.1.1",
+        "util-deprecate": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/regex-not": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/regex-not/-/regex-not-1.0.2.tgz",
+      "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+      "dev": true,
+      "dependencies": {
+        "extend-shallow": "^3.0.2",
+        "safe-regex": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/regex-not/node_modules/extend-shallow": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz",
+      "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==",
+      "dev": true,
+      "dependencies": {
+        "assign-symbols": "^1.0.0",
+        "is-extendable": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/regex-not/node_modules/is-extendable": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz",
+      "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+      "dev": true,
+      "dependencies": {
+        "is-plain-object": "^2.0.4"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/regexp.prototype.flags": {
+      "version": "1.5.3",
+      "resolved": "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz",
+      "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-errors": "^1.3.0",
+        "set-function-name": "^2.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/repeat-element": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/repeat-element/-/repeat-element-1.1.4.tgz",
+      "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/repeat-string": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmmirror.com/repeat-string/-/repeat-string-1.6.1.tgz",
+      "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.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=="
+    },
+    "node_modules/resolve-url": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmmirror.com/resolve-url/-/resolve-url-0.2.1.tgz",
+      "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==",
+      "deprecated": "https://github.com/lydell/resolve-url#deprecated",
+      "dev": true
+    },
+    "node_modules/ret": {
+      "version": "0.1.15",
+      "resolved": "https://registry.npmmirror.com/ret/-/ret-0.1.15.tgz",
+      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.12"
+      }
+    },
+    "node_modules/reusify": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz",
+      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+      "dev": true,
+      "engines": {
+        "iojs": ">=1.0.0",
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/rollup": {
+      "version": "4.24.4",
+      "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.24.4.tgz",
+      "integrity": "sha512-vGorVWIsWfX3xbcyAS+I047kFKapHYivmkaT63Smj77XwvLSJos6M1xGqZnBPFQFBRZDOcG1QnYEIxAvTr/HjA==",
+      "dev": true,
+      "dependencies": {
+        "@types/estree": "1.0.6"
+      },
+      "bin": {
+        "rollup": "dist/bin/rollup"
+      },
+      "engines": {
+        "node": ">=18.0.0",
+        "npm": ">=8.0.0"
+      },
+      "optionalDependencies": {
+        "@rollup/rollup-android-arm-eabi": "4.24.4",
+        "@rollup/rollup-android-arm64": "4.24.4",
+        "@rollup/rollup-darwin-arm64": "4.24.4",
+        "@rollup/rollup-darwin-x64": "4.24.4",
+        "@rollup/rollup-freebsd-arm64": "4.24.4",
+        "@rollup/rollup-freebsd-x64": "4.24.4",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.24.4",
+        "@rollup/rollup-linux-arm-musleabihf": "4.24.4",
+        "@rollup/rollup-linux-arm64-gnu": "4.24.4",
+        "@rollup/rollup-linux-arm64-musl": "4.24.4",
+        "@rollup/rollup-linux-powerpc64le-gnu": "4.24.4",
+        "@rollup/rollup-linux-riscv64-gnu": "4.24.4",
+        "@rollup/rollup-linux-s390x-gnu": "4.24.4",
+        "@rollup/rollup-linux-x64-gnu": "4.24.4",
+        "@rollup/rollup-linux-x64-musl": "4.24.4",
+        "@rollup/rollup-win32-arm64-msvc": "4.24.4",
+        "@rollup/rollup-win32-ia32-msvc": "4.24.4",
+        "@rollup/rollup-win32-x64-msvc": "4.24.4",
+        "fsevents": "~2.3.2"
+      }
+    },
+    "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": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "dependencies": {
+        "queue-microtask": "^1.2.2"
+      }
+    },
+    "node_modules/safe-array-concat": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz",
+      "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "get-intrinsic": "^1.2.4",
+        "has-symbols": "^1.0.3",
+        "isarray": "^2.0.5"
+      },
+      "engines": {
+        "node": ">=0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/safe-array-concat/node_modules/isarray": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz",
+      "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+      "dev": true
+    },
+    "node_modules/safe-buffer": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
+    "node_modules/safe-regex": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/safe-regex/-/safe-regex-1.1.0.tgz",
+      "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==",
+      "dev": true,
+      "dependencies": {
+        "ret": "~0.1.10"
+      }
+    },
+    "node_modules/safe-regex-test": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz",
+      "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.6",
+        "es-errors": "^1.3.0",
+        "is-regex": "^1.1.4"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+      "optional": true
+    },
+    "node_modules/sax": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmmirror.com/sax/-/sax-1.4.1.tgz",
+      "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==",
+      "optional": true
+    },
+    "node_modules/scroll-into-view-if-needed": {
+      "version": "2.2.31",
+      "resolved": "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz",
+      "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==",
+      "dependencies": {
+        "compute-scroll-into-view": "^1.0.20"
+      }
+    },
+    "node_modules/semver": {
+      "version": "5.7.2",
+      "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz",
+      "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+      "optional": true,
+      "bin": {
+        "semver": "bin/semver"
+      }
+    },
+    "node_modules/set-function-length": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz",
+      "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+      "dev": true,
+      "dependencies": {
+        "define-data-property": "^1.1.4",
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
+        "get-intrinsic": "^1.2.4",
+        "gopd": "^1.0.1",
+        "has-property-descriptors": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/set-function-name": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/set-function-name/-/set-function-name-2.0.2.tgz",
+      "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
+      "dev": true,
+      "dependencies": {
+        "define-data-property": "^1.1.4",
+        "es-errors": "^1.3.0",
+        "functions-have-names": "^1.2.3",
+        "has-property-descriptors": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/set-value": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/set-value/-/set-value-2.0.1.tgz",
+      "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
+      "dev": true,
+      "dependencies": {
+        "extend-shallow": "^2.0.1",
+        "is-extendable": "^0.1.1",
+        "is-plain-object": "^2.0.3",
+        "split-string": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/side-channel": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.6.tgz",
+      "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.4",
+        "object-inspect": "^1.13.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/simple-swizzle": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmmirror.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+      "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
+      "dependencies": {
+        "is-arrayish": "^0.3.1"
+      }
+    },
+    "node_modules/snapdragon": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmmirror.com/snapdragon/-/snapdragon-0.8.2.tgz",
+      "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+      "dev": true,
+      "dependencies": {
+        "base": "^0.11.1",
+        "debug": "^2.2.0",
+        "define-property": "^0.2.5",
+        "extend-shallow": "^2.0.1",
+        "map-cache": "^0.2.2",
+        "source-map": "^0.5.6",
+        "source-map-resolve": "^0.5.0",
+        "use": "^3.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/snapdragon-node": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+      "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+      "dev": true,
+      "dependencies": {
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.0",
+        "snapdragon-util": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/snapdragon-node/node_modules/isobject": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz",
+      "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/snapdragon-util": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+      "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+      "dev": true,
+      "dependencies": {
+        "kind-of": "^3.2.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/snapdragon-util/node_modules/kind-of": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+      "dev": true,
+      "dependencies": {
+        "is-buffer": "^1.1.5"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/snapdragon/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dev": true,
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/snapdragon/node_modules/define-property": {
+      "version": "0.2.5",
+      "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz",
+      "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+      "dev": true,
+      "dependencies": {
+        "is-descriptor": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/snapdragon/node_modules/is-descriptor": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz",
+      "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
+      "dev": true,
+      "dependencies": {
+        "is-accessor-descriptor": "^1.0.1",
+        "is-data-descriptor": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/snapdragon/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+      "dev": true
+    },
+    "node_modules/snapdragon/node_modules/source-map": {
+      "version": "0.5.7",
+      "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz",
+      "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+      "devOptional": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "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==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/source-map-resolve": {
+      "version": "0.5.3",
+      "resolved": "https://registry.npmmirror.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
+      "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
+      "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated",
+      "dev": true,
+      "dependencies": {
+        "atob": "^2.1.2",
+        "decode-uri-component": "^0.2.0",
+        "resolve-url": "^0.2.1",
+        "source-map-url": "^0.4.0",
+        "urix": "^0.1.0"
+      }
+    },
+    "node_modules/source-map-url": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmmirror.com/source-map-url/-/source-map-url-0.4.1.tgz",
+      "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==",
+      "deprecated": "See https://github.com/lydell/source-map-url#deprecated",
+      "dev": true
+    },
+    "node_modules/split-string": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/split-string/-/split-string-3.1.0.tgz",
+      "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+      "dev": true,
+      "dependencies": {
+        "extend-shallow": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/split-string/node_modules/extend-shallow": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz",
+      "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==",
+      "dev": true,
+      "dependencies": {
+        "assign-symbols": "^1.0.0",
+        "is-extendable": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/split-string/node_modules/is-extendable": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz",
+      "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+      "dev": true,
+      "dependencies": {
+        "is-plain-object": "^2.0.4"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/ssf": {
+      "version": "0.11.2",
+      "resolved": "https://registry.npmmirror.com/ssf/-/ssf-0.11.2.tgz",
+      "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
+      "dependencies": {
+        "frac": "~1.1.2"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/stable": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmmirror.com/stable/-/stable-0.1.8.tgz",
+      "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
+      "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility",
+      "dev": true
+    },
+    "node_modules/static-extend": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmmirror.com/static-extend/-/static-extend-0.1.2.tgz",
+      "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==",
+      "dev": true,
+      "dependencies": {
+        "define-property": "^0.2.5",
+        "object-copy": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/static-extend/node_modules/define-property": {
+      "version": "0.2.5",
+      "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz",
+      "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+      "dev": true,
+      "dependencies": {
+        "is-descriptor": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/static-extend/node_modules/is-descriptor": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz",
+      "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
+      "dev": true,
+      "dependencies": {
+        "is-accessor-descriptor": "^1.0.1",
+        "is-data-descriptor": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/strict-uri-encode": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
+      "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/string_decoder": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz",
+      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+      "dev": true,
+      "dependencies": {
+        "safe-buffer": "~5.2.0"
+      }
+    },
+    "node_modules/string.prototype.trim": {
+      "version": "1.2.9",
+      "resolved": "https://registry.npmmirror.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz",
+      "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.0",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/string.prototype.trimend": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz",
+      "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-object-atoms": "^1.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/string.prototype.trimstart": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
+      "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/strip-ansi": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-3.0.1.tgz",
+      "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
+      "dev": true,
+      "dependencies": {
+        "ansi-regex": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/supports-color": {
+      "version": "3.2.3",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-3.2.3.tgz",
+      "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==",
+      "dev": true,
+      "dependencies": {
+        "has-flag": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/svg-baker": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmmirror.com/svg-baker/-/svg-baker-1.7.0.tgz",
+      "integrity": "sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==",
+      "dev": true,
+      "dependencies": {
+        "bluebird": "^3.5.0",
+        "clone": "^2.1.1",
+        "he": "^1.1.1",
+        "image-size": "^0.5.1",
+        "loader-utils": "^1.1.0",
+        "merge-options": "1.0.1",
+        "micromatch": "3.1.0",
+        "postcss": "^5.2.17",
+        "postcss-prefix-selector": "^1.6.0",
+        "posthtml-rename-id": "^1.0",
+        "posthtml-svg-mode": "^1.0.3",
+        "query-string": "^4.3.2",
+        "traverse": "^0.6.6"
+      }
+    },
+    "node_modules/svg-baker/node_modules/braces": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmmirror.com/braces/-/braces-2.3.2.tgz",
+      "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+      "dev": true,
+      "dependencies": {
+        "arr-flatten": "^1.1.0",
+        "array-unique": "^0.3.2",
+        "extend-shallow": "^2.0.1",
+        "fill-range": "^4.0.0",
+        "isobject": "^3.0.1",
+        "repeat-element": "^1.1.2",
+        "snapdragon": "^0.8.1",
+        "snapdragon-node": "^2.0.1",
+        "split-string": "^3.0.2",
+        "to-regex": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/svg-baker/node_modules/fill-range": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-4.0.0.tgz",
+      "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==",
+      "dev": true,
+      "dependencies": {
+        "extend-shallow": "^2.0.1",
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1",
+        "to-regex-range": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/svg-baker/node_modules/is-number": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz",
+      "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==",
+      "dev": true,
+      "dependencies": {
+        "kind-of": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/svg-baker/node_modules/is-number/node_modules/kind-of": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+      "dev": true,
+      "dependencies": {
+        "is-buffer": "^1.1.5"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/svg-baker/node_modules/isobject": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz",
+      "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/svg-baker/node_modules/micromatch": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-3.1.0.tgz",
+      "integrity": "sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==",
+      "dev": true,
+      "dependencies": {
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "braces": "^2.2.2",
+        "define-property": "^1.0.0",
+        "extend-shallow": "^2.0.1",
+        "extglob": "^2.0.2",
+        "fragment-cache": "^0.2.1",
+        "kind-of": "^5.0.2",
+        "nanomatch": "^1.2.1",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/svg-baker/node_modules/postcss": {
+      "version": "5.2.18",
+      "resolved": "https://registry.npmmirror.com/postcss/-/postcss-5.2.18.tgz",
+      "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+      "dev": true,
+      "dependencies": {
+        "chalk": "^1.1.3",
+        "js-base64": "^2.1.9",
+        "source-map": "^0.5.6",
+        "supports-color": "^3.2.3"
+      },
+      "engines": {
+        "node": ">=0.12"
+      }
+    },
+    "node_modules/svg-baker/node_modules/source-map": {
+      "version": "0.5.7",
+      "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz",
+      "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/svg-baker/node_modules/to-regex-range": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-2.1.1.tgz",
+      "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==",
+      "dev": true,
+      "dependencies": {
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/svgo": {
+      "version": "2.8.0",
+      "resolved": "https://registry.npmmirror.com/svgo/-/svgo-2.8.0.tgz",
+      "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==",
+      "dev": true,
+      "dependencies": {
+        "@trysound/sax": "0.2.0",
+        "commander": "^7.2.0",
+        "css-select": "^4.1.3",
+        "css-tree": "^1.1.3",
+        "csso": "^4.2.0",
+        "picocolors": "^1.0.0",
+        "stable": "^0.1.8"
+      },
+      "bin": {
+        "svgo": "bin/svgo"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
+    "node_modules/to-object-path": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmmirror.com/to-object-path/-/to-object-path-0.3.0.tgz",
+      "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==",
+      "dev": true,
+      "dependencies": {
+        "kind-of": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/to-object-path/node_modules/kind-of": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+      "dev": true,
+      "dependencies": {
+        "is-buffer": "^1.1.5"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/to-regex": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmmirror.com/to-regex/-/to-regex-3.0.2.tgz",
+      "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+      "dev": true,
+      "dependencies": {
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "regex-not": "^1.0.2",
+        "safe-regex": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "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,
+      "dependencies": {
+        "is-number": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=8.0"
+      }
+    },
+    "node_modules/to-regex/node_modules/define-property": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/define-property/-/define-property-2.0.2.tgz",
+      "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+      "dev": true,
+      "dependencies": {
+        "is-descriptor": "^1.0.2",
+        "isobject": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/to-regex/node_modules/extend-shallow": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz",
+      "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==",
+      "dev": true,
+      "dependencies": {
+        "assign-symbols": "^1.0.0",
+        "is-extendable": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/to-regex/node_modules/is-extendable": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz",
+      "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+      "dev": true,
+      "dependencies": {
+        "is-plain-object": "^2.0.4"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/to-regex/node_modules/isobject": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz",
+      "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/traverse": {
+      "version": "0.6.10",
+      "resolved": "https://registry.npmmirror.com/traverse/-/traverse-0.6.10.tgz",
+      "integrity": "sha512-hN4uFRxbK+PX56DxYiGHsTn2dME3TVr9vbNqlQGcGcPhJAn+tdP126iA+TArMpI4YSgnTkMWyoLl5bf81Hi5TA==",
+      "dev": true,
+      "dependencies": {
+        "gopd": "^1.0.1",
+        "typedarray.prototype.slice": "^1.0.3",
+        "which-typed-array": "^1.1.15"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/tslib": {
+      "version": "2.8.1",
+      "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz",
+      "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
+    },
+    "node_modules/typed-array-buffer": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz",
+      "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "es-errors": "^1.3.0",
+        "is-typed-array": "^1.1.13"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/typed-array-byte-length": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz",
+      "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "for-each": "^0.3.3",
+        "gopd": "^1.0.1",
+        "has-proto": "^1.0.3",
+        "is-typed-array": "^1.1.13"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/typed-array-byte-offset": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz",
+      "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==",
+      "dev": true,
+      "dependencies": {
+        "available-typed-arrays": "^1.0.7",
+        "call-bind": "^1.0.7",
+        "for-each": "^0.3.3",
+        "gopd": "^1.0.1",
+        "has-proto": "^1.0.3",
+        "is-typed-array": "^1.1.13"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/typed-array-length": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmmirror.com/typed-array-length/-/typed-array-length-1.0.6.tgz",
+      "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "for-each": "^0.3.3",
+        "gopd": "^1.0.1",
+        "has-proto": "^1.0.3",
+        "is-typed-array": "^1.1.13",
+        "possible-typed-array-names": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/typedarray.prototype.slice": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.3.tgz",
+      "integrity": "sha512-8WbVAQAUlENo1q3c3zZYuy5k9VzBQvp8AX9WOtbvyWlLM1v5JaSRmjubLjzHF4JFtptjH/5c/i95yaElvcjC0A==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.0",
+        "es-errors": "^1.3.0",
+        "typed-array-buffer": "^1.0.2",
+        "typed-array-byte-offset": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/unbox-primitive": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
+      "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "has-bigints": "^1.0.2",
+        "has-symbols": "^1.0.3",
+        "which-boxed-primitive": "^1.0.2"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/undici-types": {
+      "version": "6.19.8",
+      "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-6.19.8.tgz",
+      "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
+      "dev": true
+    },
+    "node_modules/union-value": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/union-value/-/union-value-1.0.1.tgz",
+      "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
+      "dev": true,
+      "dependencies": {
+        "arr-union": "^3.1.0",
+        "get-value": "^2.0.6",
+        "is-extendable": "^0.1.1",
+        "set-value": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/universalify": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz",
+      "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+      "dev": true,
+      "engines": {
+        "node": ">= 10.0.0"
+      }
+    },
+    "node_modules/unset-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/unset-value/-/unset-value-1.0.0.tgz",
+      "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==",
+      "dev": true,
+      "dependencies": {
+        "has-value": "^0.3.1",
+        "isobject": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/unset-value/node_modules/has-value": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmmirror.com/has-value/-/has-value-0.3.1.tgz",
+      "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==",
+      "dev": true,
+      "dependencies": {
+        "get-value": "^2.0.3",
+        "has-values": "^0.1.4",
+        "isobject": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/unset-value/node_modules/has-value/node_modules/isobject": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/isobject/-/isobject-2.1.0.tgz",
+      "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==",
+      "dev": true,
+      "dependencies": {
+        "isarray": "1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/unset-value/node_modules/has-values": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmmirror.com/has-values/-/has-values-0.1.4.tgz",
+      "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/unset-value/node_modules/isobject": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz",
+      "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/urix": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmmirror.com/urix/-/urix-0.1.0.tgz",
+      "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==",
+      "deprecated": "Please see https://github.com/lydell/urix#deprecated",
+      "dev": true
+    },
+    "node_modules/use": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmmirror.com/use/-/use-3.1.1.tgz",
+      "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+      "dev": true
+    },
+    "node_modules/vary": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz",
+      "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/vite": {
+      "version": "5.4.10",
+      "resolved": "https://registry.npmmirror.com/vite/-/vite-5.4.10.tgz",
+      "integrity": "sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==",
+      "dev": true,
+      "dependencies": {
+        "esbuild": "^0.21.3",
+        "postcss": "^8.4.43",
+        "rollup": "^4.20.0"
+      },
+      "bin": {
+        "vite": "bin/vite.js"
+      },
+      "engines": {
+        "node": "^18.0.0 || >=20.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/vitejs/vite?sponsor=1"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.3"
+      },
+      "peerDependencies": {
+        "@types/node": "^18.0.0 || >=20.0.0",
+        "less": "*",
+        "lightningcss": "^1.21.0",
+        "sass": "*",
+        "sass-embedded": "*",
+        "stylus": "*",
+        "sugarss": "*",
+        "terser": "^5.4.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/node": {
+          "optional": true
+        },
+        "less": {
+          "optional": true
+        },
+        "lightningcss": {
+          "optional": true
+        },
+        "sass": {
+          "optional": true
+        },
+        "sass-embedded": {
+          "optional": true
+        },
+        "stylus": {
+          "optional": true
+        },
+        "sugarss": {
+          "optional": true
+        },
+        "terser": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vite-plugin-svg-icons": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/vite-plugin-svg-icons/-/vite-plugin-svg-icons-2.0.1.tgz",
+      "integrity": "sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==",
+      "dev": true,
+      "dependencies": {
+        "@types/svgo": "^2.6.1",
+        "cors": "^2.8.5",
+        "debug": "^4.3.3",
+        "etag": "^1.8.1",
+        "fs-extra": "^10.0.0",
+        "pathe": "^0.2.0",
+        "svg-baker": "1.7.0",
+        "svgo": "^2.8.0"
+      },
+      "peerDependencies": {
+        "vite": ">=2.0.0"
+      }
+    },
+    "node_modules/vue": {
+      "version": "3.5.12",
+      "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.12.tgz",
+      "integrity": "sha512-CLVZtXtn2ItBIi/zHZ0Sg1Xkb7+PU32bJJ8Bmy7ts3jxXTcbfsEfBivFYYWz1Hur+lalqGAh65Coin0r+HRUfg==",
+      "dependencies": {
+        "@vue/compiler-dom": "3.5.12",
+        "@vue/compiler-sfc": "3.5.12",
+        "@vue/runtime-dom": "3.5.12",
+        "@vue/server-renderer": "3.5.12",
+        "@vue/shared": "3.5.12"
+      },
+      "peerDependencies": {
+        "typescript": "*"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vue-demi": {
+      "version": "0.13.11",
+      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.11.tgz",
+      "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==",
+      "hasInstallScript": true,
+      "bin": {
+        "vue-demi-fix": "bin/vue-demi-fix.js",
+        "vue-demi-switch": "bin/vue-demi-switch.js"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "@vue/composition-api": "^1.0.0-rc.1",
+        "vue": "^3.0.0-0 || ^2.6.0"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vue-echarts": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmmirror.com/vue-echarts/-/vue-echarts-7.0.3.tgz",
+      "integrity": "sha512-/jSxNwOsw5+dYAUcwSfkLwKPuzTQ0Cepz1LxCOpj2QcHrrmUa/Ql0eQqMmc1rTPQVrh2JQ29n2dhq75ZcHvRDw==",
+      "dependencies": {
+        "vue-demi": "^0.13.11"
+      },
+      "peerDependencies": {
+        "@vue/runtime-core": "^3.0.0",
+        "echarts": "^5.5.1",
+        "vue": "^2.7.0 || ^3.1.1"
+      },
+      "peerDependenciesMeta": {
+        "@vue/runtime-core": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vue-i18n": {
+      "version": "10.0.4",
+      "resolved": "https://registry.npmmirror.com/vue-i18n/-/vue-i18n-10.0.4.tgz",
+      "integrity": "sha512-1xkzVxqBLk2ZFOmeI+B5r1J7aD/WtNJ4j9k2mcFcQo5BnOmHBmD7z4/oZohh96AAaRZ4Q7mNQvxc9h+aT+Md3w==",
+      "dependencies": {
+        "@intlify/core-base": "10.0.4",
+        "@intlify/shared": "10.0.4",
+        "@vue/devtools-api": "^6.5.0"
+      },
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/kazupon"
+      },
+      "peerDependencies": {
+        "vue": "^3.0.0"
+      }
+    },
+    "node_modules/vue-router": {
+      "version": "4.4.5",
+      "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.4.5.tgz",
+      "integrity": "sha512-4fKZygS8cH1yCyuabAXGUAsyi1b2/o/OKgu/RUb+znIYOxPRxdkytJEx+0wGcpBE1pX6vUgh5jwWOKRGvuA/7Q==",
+      "dependencies": {
+        "@vue/devtools-api": "^6.6.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/posva"
+      },
+      "peerDependencies": {
+        "vue": "^3.2.0"
+      }
+    },
+    "node_modules/which-boxed-primitive": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+      "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+      "dev": true,
+      "dependencies": {
+        "is-bigint": "^1.0.1",
+        "is-boolean-object": "^1.1.0",
+        "is-number-object": "^1.0.4",
+        "is-string": "^1.0.5",
+        "is-symbol": "^1.0.3"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/which-typed-array": {
+      "version": "1.1.15",
+      "resolved": "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.15.tgz",
+      "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==",
+      "dev": true,
+      "dependencies": {
+        "available-typed-arrays": "^1.0.7",
+        "call-bind": "^1.0.7",
+        "for-each": "^0.3.3",
+        "gopd": "^1.0.1",
+        "has-tostringtag": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/wmf": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz",
+      "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/word": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmmirror.com/word/-/word-0.3.0.tgz",
+      "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/xlsx": {
+      "version": "0.18.5",
+      "resolved": "https://registry.npmmirror.com/xlsx/-/xlsx-0.18.5.tgz",
+      "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==",
+      "dependencies": {
+        "adler-32": "~1.3.0",
+        "cfb": "~1.2.1",
+        "codepage": "~1.15.0",
+        "crc-32": "~1.2.1",
+        "ssf": "~0.11.2",
+        "wmf": "~1.0.1",
+        "word": "~0.3.0"
+      },
+      "bin": {
+        "xlsx": "bin/xlsx.njs"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/zrender": {
+      "version": "5.6.0",
+      "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.6.0.tgz",
+      "integrity": "sha512-uzgraf4njmmHAbEUxMJ8Oxg+P3fT04O+9p7gY+wJRVxo8Ge+KmYv0WJev945EH4wFuc4OY2NLXz46FZrWS9xJg==",
+      "dependencies": {
+        "tslib": "2.3.0"
+      }
+    },
+    "node_modules/zrender/node_modules/tslib": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
+      "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
+    }
+  }
+}

+ 36 - 0
package.json

@@ -0,0 +1,36 @@
+{
+  "name": "admin-web",
+  "private": true,
+  "version": "0.0.0",
+  "type": "module",
+  "scripts": {
+    "dev": "vite",
+    "build": "vite build",
+    "preview": "vite preview"
+  },
+  "dependencies": {
+    "@arco-design/web-vue": "^2.55.3",
+    "axios": "^1.7.2",
+    "crypto-js": "^4.2.0",
+    "dayjs": "^1.11.11",
+    "echarts": "^5.5.1",
+    "file-saver": "^2.0.5",
+    "less": "^4.2.0",
+    "less-loader": "^12.2.0",
+    "lodash": "^4.17.21",
+    "monaco-editor": "^0.52.0",
+    "pinia": "^2.1.7",
+    "qrcode.vue": "^3.6.0",
+    "vue": "^3.4.21",
+    "vue-echarts": "^7.0.3",
+    "vue-i18n": "^10.0.1",
+    "vue-router": "^4.3.2",
+    "xlsx": "^0.18.5"
+  },
+  "devDependencies": {
+    "@vitejs/plugin-vue": "^5.0.4",
+    "fast-glob": "^3.3.2",
+    "vite": "^5.2.0",
+    "vite-plugin-svg-icons": "^2.0.1"
+  }
+}

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 396 - 0
public/cdn/es-module-shims.wasm.js


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 6 - 0
public/cdn/runtime-dom.esm-browser.js


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 6 - 0
public/cdn/server-renderer.esm-browser.js


+ 1 - 0
public/vite.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>

+ 105 - 0
src/App.vue

@@ -0,0 +1,105 @@
+<template>
+  <a-config-provider :locale="locale">
+    <div class="public_local_loading" :class="{ 'hidden-loading': !systemStore.getLocalLoading }">
+      <div class="public_local_loading_bg">
+        <a-spin class="public_local_loading_logo" dot />
+      </div>
+    </div>
+    <router-view v-if="isRouterActive" />
+  </a-config-provider>
+</template>
+
+<script setup>
+import { ref, onMounted, nextTick, provide } from "vue"
+import { useDarkThemeHook, useLang } from '@/hooks'
+import { useSystemStore } from '@/store/modules/systemStore'
+
+
+const isRouterActive = ref(true)
+// 全局语言
+const { locale } = useLang()
+const systemStore = useSystemStore()
+
+// 暗黑主题
+useDarkThemeHook()
+
+provide('reloadRoutePage', () => {
+  isRouterActive.value = false
+  nextTick(() => {
+    isRouterActive.value = true
+  })
+})
+
+
+onMounted(async () => {
+  const getLoadingNode = document.getElementById('Loading')
+  const { body } = document
+  if (getLoadingNode) {
+    body.removeChild(getLoadingNode)
+  }
+
+  console.log(import.meta.env.VITE_API_URL);
+})
+</script>
+
+<style lang="less">
+body {
+  overflow: hidden;
+}
+
+// 加载loading css
+.public_local_loading {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  z-index: 2000;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+
+  .public_local_loading_bg {
+    width: 12rem;
+    height: 12rem;
+    position: sticky;
+    left: 50%;
+    top: 50%;
+    transform: translate3d(-50%, -50%, 0);
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+  }
+
+  .public_local_loading_logo {
+    font-size: 2rem;
+    user-select: none;
+  }
+}
+
+.hidden-loading.public_local_loading {
+  opacity: 0;
+  z-index: -10 !important;
+  cursor: auto !important;
+}
+
+@keyframes r-loading {
+  0% {
+    transform: rotate(0deg);
+  }
+
+  100% {
+    transform: rotate(360deg);
+  }
+}
+
+// 文字主题色加重色
+.boldTxt {
+  color: rgb(@blue_0);
+}
+
+.txtPointer {
+  cursor: pointer;
+}
+</style>

+ 54 - 0
src/api/customer.js

@@ -0,0 +1,54 @@
+import service from '../utils/axios'
+
+export function getCustomerList(data) {
+    return service({
+        url: '/app/user/getCustomerList',
+        method: 'post',
+        data
+    })
+}
+
+export function addCustomer(data) {
+    return service({
+        url: 'admin/platform/addCustomer',
+        method: 'post',
+        data
+    })
+}
+
+export function updateCustomer(data) {
+    return service({
+        url: "admin/platform/updateCustomer",
+        method: "post",
+        data,
+    });
+}
+
+export function deleteCustomer(data) {
+    return service({
+        url: '/customer/delete',
+        method: 'post',
+        data
+    })
+}
+
+export function getCustomer(data) {
+    return service({
+        url: "/app/user/getCustomer",
+        method: "post",
+        data,
+    });
+}
+
+// 获取客户列表
+export  function  getMessUserList(data){
+    return service({
+        url: 'admin/platform/customerList',
+        method: 'post',
+        data
+    })
+}
+// 客户详情
+export  function  deleteMessUser(params){
+    return service.get('admin/platform/customerInfo', {params})
+}

+ 12 - 0
src/api/path/component.api.js

@@ -0,0 +1,12 @@
+
+import service from '../../utils/axios'
+
+// 保存物料
+export function componentSave(param) {
+  return service.post('/admin/component/save', param)
+}
+
+// 获取物料
+export function componentList(param) {
+  return service.post('/admin/component/list', param)
+}

+ 31 - 0
src/api/path/dict.js

@@ -0,0 +1,31 @@
+import service from '../../utils/axios'
+
+// 字典列表
+export function dictionaryList(param) {
+    return service.post('admin/system/dicList', param)
+}
+
+// 获取字典
+export function dictionaryDetail(params) {
+    return service.get('/admin/system/getEnu', { params })
+}
+
+// 添加字典
+export function dictionaryAdd(param) {
+    return service.post('/admin/system/addDic', param)
+}
+
+// 更新字典
+export function dictionaryUpdate(param) {
+    return service.post('/admin/system/updateDic', param)
+}
+
+// 删除字典
+export function dictionaryDelete(params) {
+    return service.get('/admin/system/deleteDic', { params })
+}
+
+// 获取下级分类
+export function dictionaryDeleteAll(params) {
+    return service.get('/admin/system/getEnu', { params })
+}

+ 34 - 0
src/api/path/dictionary.js

@@ -0,0 +1,34 @@
+import service from '../../utils/axios'
+
+// 获取字典列表
+export function getDictionaryList(param) {
+  return service.post('/admin/dic/list', param)
+}
+
+export const getDictionaryById = async (id) => {
+  // 模拟 API 调用延迟
+  await new Promise(resolve => setTimeout(resolve, 500));
+  return {
+    id,
+    label: `Dictionary ${id}`,
+    value: `Value ${id}`,
+    typeLabel: 'Type Label',
+    typeId: 'Type ID',
+    description: 'Description',
+    sortNo: 1,
+  };
+};
+
+export const addDictionary = async (data) => {
+  // 模拟 API 调用延迟
+  await new Promise(resolve => setTimeout(resolve, 500));
+  console.log('API: Adding dictionary item', data);
+  return { ...data, id: Date.now() };
+};
+
+export const updateDictionary = async (data) => {
+  // 模拟 API 调用延迟
+  await new Promise(resolve => setTimeout(resolve, 500));
+  console.log('API: Updating dictionary item', data);
+  return data;
+};

+ 65 - 0
src/api/path/finance.js

@@ -0,0 +1,65 @@
+import service from '../../utils/axios'
+
+// 查询充值记录
+export function getTopUpRecordList(data) {
+    return service({
+        url: '/admin/platform/topUpRecord',
+        method: 'post',
+        data
+    })
+}
+// 充值
+export function topUpAs(data) {
+    return service({
+        url: '/admin/platform/topUp',
+        method: 'post',
+        data
+    })
+}
+// 获取客户列表
+export function getCustomerList(data) {
+    return service({
+        url: '/admin/platform/customerList',
+        method: 'post',
+        data
+    })
+}
+// 客户流量消耗明细
+export function getSimConsumptionDetailsList(data) {
+    return service({
+        url: '/admin/platform/simConsumptionDetails',
+        method: 'post',
+        data
+    })
+}
+// 客户流量消耗明细-详情
+export function getUserSimInfo(params) {
+    return service({
+        url: '/admin/platform/userSimInfo',
+        method: 'get',
+        params
+    })
+}
+// 客户端-账户余额卡片
+export function getWalletCard(params) {
+    return service({
+        url: '/admin/client/walletCard',
+        method: 'get',
+        params
+    })
+}
+
+// 客户详情
+export  function  deleteMessUser(params){
+    return service.get('admin/platform/customerInfo', {params})
+}
+
+
+// H5充值记录
+export function getAdiroePuyList(data) {
+  return service({
+    url: '/admin/sim/payOrders',
+    method: 'post',
+    data
+  })
+}

+ 50 - 0
src/api/path/flowPool.api.js

@@ -0,0 +1,50 @@
+
+import service from '../../utils/axios'
+
+// 分销商
+// 新增
+export function addTrafficPool(param) {
+    return service.post('/admin/platform/addTrafficPool', param)
+}
+// list
+export function trafficPoolList(param) {
+    return service.post('/admin/platform/tariffList', param)
+}
+// 编辑
+export function updateTrafficPool(param) {
+    return service.post('/admin/platform/updateTrafficPool', param)
+}
+// 删除
+export function deleteTrafficPool(params) {
+    return service.get('/admin/platform/deleteTrafficPool', { params })
+}
+
+// 卡信息列表
+export  function  getCardList (data) {
+    return service.post('admin/sim/cardInfoList',data)
+}
+
+// 获取资费下卡列表
+export  function  updateCardList (params) {
+    return service.get('admin/platform/getTariffCard',{params})
+}
+
+// 流量池接口
+export function lotCatdList(data){
+    return service.post('/admin/platform/trafficPoolList', data)
+}
+
+// 创建预警
+export  function  createWarning(data){
+    return service.post('/admin/alert/warningCreate',data)
+}
+
+// 修改预警
+export  function  updateWarning(data){
+    return service.post('/admin/alert/warningUpdate',data)
+}
+
+// 流量池操作记录
+export function updateFlowPoolData(data){
+    return service.post('/admin/platform/trafficPoolListRecord',data)
+}

+ 11 - 0
src/api/path/login.api.js

@@ -0,0 +1,11 @@
+
+import service from '../../utils/axios'
+
+// * 登录
+export function loginApi(data) {
+  return service({
+    url: '/admin/system/login',
+    method: 'post',
+    data
+  })
+}

+ 94 - 0
src/api/path/lotCard.api.js

@@ -0,0 +1,94 @@
+import service from "../../utils/axios";
+
+
+// ----------------------------流量管理---------------------------------
+// 流量列表
+export function dataPlanList(param) {
+    return service.post("/admin/sim/dataPlanList", param);
+}
+
+// ----------------------------卡管理---------------------------------
+// 卡信息列表
+export function cardInfoList(param) {
+    return service.post("/admin/sim/cardInfoList", param);
+}
+
+// 卡信息导入
+export function cardInfoImport(param) {
+    return service.post("/admin/sim/cardInfoImport", param);
+}
+
+// 卡-下发用户
+export function cardIssue(param) {
+    return service.post("/admin/sim/cardIssue", param);
+}
+
+// ----------------------------订单管理---------------------------------
+// 订单管理
+export function orderList(param) {
+    return service.post("/admin/sim/cardInfoUpdate", param);
+}
+
+
+// 订购生成订单
+export function setOrderDataPlan(param) {
+    return service.post("/admin/sim/setOrderDataPlan", param);
+}
+
+// 取消订单订单
+export function orderCancel(param) {
+    return service.post("/admin/sim/orderCancel", param);
+}
+
+// 取消订单订单
+export function orderFlowData(params) {
+    return service.get("/admin/sim/orderFlowData", { params });
+}
+
+// 查询订单日志
+export function getOrderLogsList(params) {
+    return service.post("/metadata/getOrderLogsList", params);
+}
+
+// 获取流量包数据
+export function getDataPlanList(params) {
+    return service.post("/metadata/getDataPlanList", params);
+}
+
+// CDR详单查询
+export function getDataCDR(params) {
+    return service.post("/admin/sim/newSimCDR", params);
+}
+
+
+//  CDR日期查询 
+
+export function getDataCDRDate(params) {
+    return service.post("/scc/v1/cdr-daily", params);
+}
+
+// 暂停SIM卡服务
+export function PauseSIMService(params) {
+    return service.post("/admin/sim/stopSim", params);
+}
+
+
+// 恢复SIM卡服务
+export function RecoverSIMService(data) {
+    return service.post("/admin/sim/runeSim", data);
+}
+
+// 关闭SIM
+export function OffSIMCard(data) {
+    return service.post("/admin/sim/closeSim", data);
+}
+
+// 操作日志
+export function OperationRecord(data) {
+    return service.post("/logs/logCardOperation", data);
+}
+
+// 查询当前卡下的充值记录
+export function getOrderCard(data){
+    return service.post("/admin/sim/payOrders", data);
+}

+ 56 - 0
src/api/path/order.js

@@ -0,0 +1,56 @@
+import service from "../../utils/axios";
+
+// 订单审核
+export function OrderCardStatus(data) {
+    return service.post("/admin/sim/applyAudit", data);
+}
+
+// 上传订单合同
+export function UploadOrderCardContract(data) {
+    return service.post("/admin/sim/uploadContract", data);
+}
+
+// 购卡
+export function CardPurchase(data) {
+    return service.post('/admin/sim/apply', data)
+}
+
+// 分配卡号
+export function DistributionCard(data) {
+    return service.post("/admin/sim/assignSim", data);
+}
+
+// 查看订单下的卡
+export function viewOrderCard(params) {
+    return service.get("/admin/sim/orderCard", { params });
+}
+
+// 获取资费
+export function AcquireOrdertariff(params) {
+    return service.get("/admin/platform/getTariffById", { params });
+}
+
+// 获取资费下的卡
+export function TariffOrderCard(params) {
+    return service.get("/admin/platform/getTariffCard", { params });
+}
+
+// 退卡
+export function ReturntheCard(data) {
+    return service.post("/admin/sim/returnCard", data);
+}
+
+// 获取购卡订单下的卡
+export function ReturntheOrderCard(params) {
+    return service.get('/admin/sim/orderCard', { params })
+}
+
+// 设置金额
+export function SettingPricing(data) {
+    return service.post('/admin/sim/setAmount', data)
+}
+
+// 获取导卡进度
+export function GuideCardProgress(params){
+    return service.get('/admin/sim/assignProgress', { params});
+}

+ 27 - 0
src/api/path/purchase.js

@@ -0,0 +1,27 @@
+import service from '../../utils/axios'
+
+// 采购订单分页查询
+export function purchaseOrderList(param) {
+    return service.post('/admin/sim/applyList', param)
+}
+
+// 订购生成订单
+export function addPurchaseOrder(param) {
+    return service.post('/admin/sim/createOrder', param)
+}
+
+// 订单订购状态修改-客户端
+export function adminUpdate(params) {
+    return service.get("/admin/sim/orderStatusUpdate", { params });
+}
+
+// 平台
+export function platformUpdate(params) {
+    return service.get("/admin/sim/orderModeration", { params });
+}
+
+
+// 退卡
+export function cancelOrderList(params) {
+    return service.post("/admin/sim/returnCardList", params);
+}

+ 6 - 0
src/api/path/renewalOrder.js

@@ -0,0 +1,6 @@
+import service from '../../utils/axios'
+
+// 续费订单信息
+export function RenewalOrderInformation(data) {
+    return service.post('/admin/platform/getTrafficOrderList', data)
+}

+ 20 - 0
src/api/path/star.api.js

@@ -0,0 +1,20 @@
+
+import service from '../../utils/axios'
+
+// 分销商
+// 新增
+export function distributorAdd(param) {
+  return service.post('/admin/star/setItem', param)
+}
+// list
+export function distributorList(param) {
+  return service.post('/admin/star/list', param)
+}
+// 编辑
+export function distributorEdit(param) {
+  return service.post('/admin/star/update', param)
+}
+// 删除
+export function distributorDelete(param) {
+  return service.post('/admin/star/delete', param)
+}

+ 85 - 0
src/api/path/system.api.js

@@ -0,0 +1,85 @@
+
+import service from '../../utils/axios'
+
+// 获取菜单
+
+export function systemUserInfoMenu(param) {
+  return service.get('/admin/system/userInfoMenu', param)
+}
+/**
+ * 新增用户
+ */
+export function userAdd(param) {
+  return service.post('/admin/system/user/register', param)
+}
+/**
+ * 用户列表
+ */
+export function userList(param) {
+  return service.post('/admin/system/user/list', param)
+}
+// 删除
+export function deleteUserItem(param) {
+  return service.post('/admin/system/user/deleteUser', param)
+} 
+// 更新
+export function updateUserItem(param) {
+  return service.post('/admin/system/user/updateUser', param)
+} 
+// 状态更新
+export function updateUserState(param){
+  return service.post('/admin/system/user/updateUserState', param) 
+}
+// menu
+// 菜单添加
+export function systemSetMenu(param) {
+  return service.post('/admin/system/setMenu', param)
+}
+// 菜单查询
+export function systemFinMenuAll(param) {
+  return service.post('/admin/system/finMenuAll', param)
+}
+// 删除菜单
+export function systemDeleteMenu(param) {
+  return service.post('/admin/system/deleteMenu', param)
+}
+// 更新菜单
+export function systemUpdateMenu(param) {
+  return service.post('/admin/system/updateMenu', param)
+}
+
+
+// role
+//插入role
+export function systemSetRole(param) {
+  return service.post('/admin/system/setRole', param)
+}
+// 获取
+export function systemFindRoleList(param) {
+  return service.post('/admin/system/findRoleList', param)
+}
+// 修改 
+export function systemUpdateRole(param) {
+  return service.post('/admin/system/updateRole', param)
+} 
+// 删除角色 
+export function systemDeleteRole(param) {
+  return service.post('/admin/system/deleteRole', param)
+} 
+// 查询角色下的账号
+export function systemFindRoleOrUser(param) {
+  return service.post('/admin/system/findRoleOrUser', param) 
+}
+// 解绑
+export function systemRelieveRoleUserById(param) {
+  return service.post('/admin/system/relieveRoleUserById', param) 
+}
+// * 获取云信息
+export function getSTSInfo(params) {
+  return service.get('/admin/system/getSTSInfo', params)
+}
+
+// 获取客户列表
+export function getSTSInfoList(params) {
+  return service.post('/admin/platform/customerList', params)
+}

+ 51 - 0
src/api/path/tariffManagement.api.js

@@ -0,0 +1,51 @@
+import service from '../../utils/axios'
+
+// 查询资费计划
+export function tariffList(param) {
+    return service.post('/admin/platform/tariffList', param)
+}
+
+// 添加资费计划
+export function addTariff(param) {
+    return service.post('/admin/platform/addTariff', param)
+}
+
+// 更新资费计划
+export function updateTariff(param) {
+    return service.post('/admin/platform/updateTariff', param)
+}
+
+// 删除资费计划
+export function deleteTariff(params) {
+    return service.get('/admin/platform/deleteTariff', { params })
+}
+
+// 添加资费套餐
+export function addTariffPackage(data) {
+    return service.post('/admin/platform/addTariffProduct', data)
+}
+
+// 查询资费商品
+export function CheckTariffPackages(params) {
+    return service.get('/admin/platform/tariffProductList', { params })
+}
+
+// 更新资费商品
+export function UpdateTariffTtems(data) {
+    return service.post('/admin/platform/updateTariffProduct', data)
+}
+
+// 删除资费商品
+export function DeleteTariffItems(params) {
+    return service.get('/admin/platform/deleteTariffProduct', { params })
+}
+
+// 查询客户下的流量池
+export function ExampleQueryTrafficPool() {
+    return service.get('/admin/platform/customerTrafficPool')
+}
+
+// 资费有效期
+export function tariiffManageDate(data) {
+    return service.post('/admin/platform/renewTariff', data)
+}

+ 46 - 0
src/assets/css/global.less

@@ -0,0 +1,46 @@
+.fn-headTitleDiv(@params: 16px) {
+  // 页面标题样式
+  width: 100%;
+  font-size: @params;
+  font-weight: bold;
+  color: @text_color_1;
+  background-color: @bg_color_4;
+  border-bottom: 1px solid @black_3;
+  display: flex;
+  align-items: center;
+  padding: 1rem 0;
+  position: sticky;
+  top: 0;
+  z-index: 11;
+
+  .tip {
+    font-weight: bold;
+    font-size: 12px;
+    color: #9696A0;
+    margin-left: 1rem;
+    margin-top: 5px;
+  }
+
+  .search-input {
+    width: 14rem;
+    margin-left: auto;
+  }
+}
+
+.container {
+ 
+  flex-direction: column;
+  .head-title {
+    margin-bottom: 1rem;
+    .fn-headTitleDiv();
+  }
+}
+
+a {
+  color: 	rgb(var(--arcoblue-4));
+  text-decoration: none;
+  &:hover {
+    color: rgb(var(--arcoblue-6));
+    cursor: pointer;
+  }
+}

+ 26 - 0
src/assets/css/theme.less

@@ -0,0 +1,26 @@
+@layout-header-height: #fff;
+// 背景 边框
+@layout-split-color: var(--color-neutral-2);
+// 背景
+@bg_color_1: var(--color-bg-1); // 整体背景色
+@bg_color_2: var(--color-bg-2); // 一级容器背景
+@bg_color_3: var(--color-bg-3); // 二级容器背景
+@bg_color_4: var(--color-bg-4); // 三级容器背景
+@bg_color_5: var(--color-bg-5); // 下拉弹出框、Tooltip 背景颜色
+@bg_color_6: var(--color-bg-white); // 白色背景
+// 主色
+@blue_0: var(--primary-6);
+@blue_1: var(--primary-5);
+@blue_2: var(--primary-4);
+
+// 边框
+@black_1: var(--color-neutral-1);
+@black_2: var(--color-neutral-2);
+@black_3: var(--color-neutral-3);
+
+// 字体颜色
+@text_color_1: var(--color-text-1); // 强调/正文标题
+@text_color_2: var(--color-text-2); // 次强调/正文标题
+@text_color_3: var(--color-text-3); // 次要信息
+@text_color_4: var(--color-text-4); // 置灰信息
+

+ 539 - 0
src/assets/iconsvg/demo.css

@@ -0,0 +1,539 @@
+/* Logo 字体 */
+@font-face {
+  font-family: "iconfont logo";
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
+}
+
+.logo {
+  font-family: "iconfont logo";
+  font-size: 160px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+/* tabs */
+.nav-tabs {
+  position: relative;
+}
+
+.nav-tabs .nav-more {
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  height: 42px;
+  line-height: 42px;
+  color: #666;
+}
+
+#tabs {
+  border-bottom: 1px solid #eee;
+}
+
+#tabs li {
+  cursor: pointer;
+  width: 100px;
+  height: 40px;
+  line-height: 40px;
+  text-align: center;
+  font-size: 16px;
+  border-bottom: 2px solid transparent;
+  position: relative;
+  z-index: 1;
+  margin-bottom: -1px;
+  color: #666;
+}
+
+
+#tabs .active {
+  border-bottom-color: #f00;
+  color: #222;
+}
+
+.tab-container .content {
+  display: none;
+}
+
+/* 页面布局 */
+.main {
+  padding: 30px 100px;
+  width: 960px;
+  margin: 0 auto;
+}
+
+.main .logo {
+  color: #333;
+  text-align: left;
+  margin-bottom: 30px;
+  line-height: 1;
+  height: 110px;
+  margin-top: -50px;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.main .logo a {
+  font-size: 160px;
+  color: #333;
+}
+
+.helps {
+  margin-top: 40px;
+}
+
+.helps pre {
+  padding: 20px;
+  margin: 10px 0;
+  border: solid 1px #e7e1cd;
+  background-color: #fffdef;
+  overflow: auto;
+}
+
+.icon_lists {
+  width: 100% !important;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.icon_lists li {
+  width: 100px;
+  margin-bottom: 10px;
+  margin-right: 20px;
+  text-align: center;
+  list-style: none !important;
+  cursor: default;
+}
+
+.icon_lists li .code-name {
+  line-height: 1.2;
+}
+
+.icon_lists .icon {
+  display: block;
+  height: 100px;
+  line-height: 100px;
+  font-size: 42px;
+  margin: 10px auto;
+  color: #333;
+  -webkit-transition: font-size 0.25s linear, width 0.25s linear;
+  -moz-transition: font-size 0.25s linear, width 0.25s linear;
+  transition: font-size 0.25s linear, width 0.25s linear;
+}
+
+.icon_lists .icon:hover {
+  font-size: 100px;
+}
+
+.icon_lists .svg-icon {
+  /* 通过设置 font-size 来改变图标大小 */
+  width: 1em;
+  /* 图标和文字相邻时,垂直对齐 */
+  vertical-align: -0.15em;
+  /* 通过设置 color 来改变 SVG 的颜色/fill */
+  fill: currentColor;
+  /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
+      normalize.css 中也包含这行 */
+  overflow: hidden;
+}
+
+.icon_lists li .name,
+.icon_lists li .code-name {
+  color: #666;
+}
+
+/* markdown 样式 */
+.markdown {
+  color: #666;
+  font-size: 14px;
+  line-height: 1.8;
+}
+
+.highlight {
+  line-height: 1.5;
+}
+
+.markdown img {
+  vertical-align: middle;
+  max-width: 100%;
+}
+
+.markdown h1 {
+  color: #404040;
+  font-weight: 500;
+  line-height: 40px;
+  margin-bottom: 24px;
+}
+
+.markdown h2,
+.markdown h3,
+.markdown h4,
+.markdown h5,
+.markdown h6 {
+  color: #404040;
+  margin: 1.6em 0 0.6em 0;
+  font-weight: 500;
+  clear: both;
+}
+
+.markdown h1 {
+  font-size: 28px;
+}
+
+.markdown h2 {
+  font-size: 22px;
+}
+
+.markdown h3 {
+  font-size: 16px;
+}
+
+.markdown h4 {
+  font-size: 14px;
+}
+
+.markdown h5 {
+  font-size: 12px;
+}
+
+.markdown h6 {
+  font-size: 12px;
+}
+
+.markdown hr {
+  height: 1px;
+  border: 0;
+  background: #e9e9e9;
+  margin: 16px 0;
+  clear: both;
+}
+
+.markdown p {
+  margin: 1em 0;
+}
+
+.markdown>p,
+.markdown>blockquote,
+.markdown>.highlight,
+.markdown>ol,
+.markdown>ul {
+  width: 80%;
+}
+
+.markdown ul>li {
+  list-style: circle;
+}
+
+.markdown>ul li,
+.markdown blockquote ul>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown>ul li p,
+.markdown>ol li p {
+  margin: 0.6em 0;
+}
+
+.markdown ol>li {
+  list-style: decimal;
+}
+
+.markdown>ol li,
+.markdown blockquote ol>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown code {
+  margin: 0 3px;
+  padding: 0 5px;
+  background: #eee;
+  border-radius: 3px;
+}
+
+.markdown strong,
+.markdown b {
+  font-weight: 600;
+}
+
+.markdown>table {
+  border-collapse: collapse;
+  border-spacing: 0px;
+  empty-cells: show;
+  border: 1px solid #e9e9e9;
+  width: 95%;
+  margin-bottom: 24px;
+}
+
+.markdown>table th {
+  white-space: nowrap;
+  color: #333;
+  font-weight: 600;
+}
+
+.markdown>table th,
+.markdown>table td {
+  border: 1px solid #e9e9e9;
+  padding: 8px 16px;
+  text-align: left;
+}
+
+.markdown>table th {
+  background: #F7F7F7;
+}
+
+.markdown blockquote {
+  font-size: 90%;
+  color: #999;
+  border-left: 4px solid #e9e9e9;
+  padding-left: 0.8em;
+  margin: 1em 0;
+}
+
+.markdown blockquote p {
+  margin: 0;
+}
+
+.markdown .anchor {
+  opacity: 0;
+  transition: opacity 0.3s ease;
+  margin-left: 8px;
+}
+
+.markdown .waiting {
+  color: #ccc;
+}
+
+.markdown h1:hover .anchor,
+.markdown h2:hover .anchor,
+.markdown h3:hover .anchor,
+.markdown h4:hover .anchor,
+.markdown h5:hover .anchor,
+.markdown h6:hover .anchor {
+  opacity: 1;
+  display: inline-block;
+}
+
+.markdown>br,
+.markdown>p>br {
+  clear: both;
+}
+
+
+.hljs {
+  display: block;
+  background: white;
+  padding: 0.5em;
+  color: #333333;
+  overflow-x: auto;
+}
+
+.hljs-comment,
+.hljs-meta {
+  color: #969896;
+}
+
+.hljs-string,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-strong,
+.hljs-emphasis,
+.hljs-quote {
+  color: #df5000;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-type {
+  color: #a71d5d;
+}
+
+.hljs-literal,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-attribute {
+  color: #0086b3;
+}
+
+.hljs-section,
+.hljs-name {
+  color: #63a35c;
+}
+
+.hljs-tag {
+  color: #333333;
+}
+
+.hljs-title,
+.hljs-attr,
+.hljs-selector-id,
+.hljs-selector-class,
+.hljs-selector-attr,
+.hljs-selector-pseudo {
+  color: #795da3;
+}
+
+.hljs-addition {
+  color: #55a532;
+  background-color: #eaffea;
+}
+
+.hljs-deletion {
+  color: #bd2c00;
+  background-color: #ffecec;
+}
+
+.hljs-link {
+  text-decoration: underline;
+}
+
+/* 代码高亮 */
+/* PrismJS 1.15.0
+https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+  color: black;
+  background: none;
+  text-shadow: 0 1px white;
+  font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+  text-align: left;
+  white-space: pre;
+  word-spacing: normal;
+  word-break: normal;
+  word-wrap: normal;
+  line-height: 1.5;
+
+  -moz-tab-size: 4;
+  -o-tab-size: 4;
+  tab-size: 4;
+
+  -webkit-hyphens: none;
+  -moz-hyphens: none;
+  -ms-hyphens: none;
+  hyphens: none;
+}
+
+pre[class*="language-"]::-moz-selection,
+pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection,
+code[class*="language-"] ::-moz-selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+pre[class*="language-"]::selection,
+pre[class*="language-"] ::selection,
+code[class*="language-"]::selection,
+code[class*="language-"] ::selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+@media print {
+
+  code[class*="language-"],
+  pre[class*="language-"] {
+    text-shadow: none;
+  }
+}
+
+/* Code blocks */
+pre[class*="language-"] {
+  padding: 1em;
+  margin: .5em 0;
+  overflow: auto;
+}
+
+:not(pre)>code[class*="language-"],
+pre[class*="language-"] {
+  background: #f5f2f0;
+}
+
+/* Inline code */
+:not(pre)>code[class*="language-"] {
+  padding: .1em;
+  border-radius: .3em;
+  white-space: normal;
+}
+
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+  color: slategray;
+}
+
+.token.punctuation {
+  color: #999;
+}
+
+.namespace {
+  opacity: .7;
+}
+
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+  color: #905;
+}
+
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+  color: #690;
+}
+
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+  color: #9a6e3a;
+  background: hsla(0, 0%, 100%, .5);
+}
+
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+  color: #07a;
+}
+
+.token.function,
+.token.class-name {
+  color: #DD4A68;
+}
+
+.token.regex,
+.token.important,
+.token.variable {
+  color: #e90;
+}
+
+.token.important,
+.token.bold {
+  font-weight: bold;
+}
+
+.token.italic {
+  font-style: italic;
+}
+
+.token.entity {
+  cursor: help;
+}

+ 2051 - 0
src/assets/iconsvg/demo_index.html

@@ -0,0 +1,2051 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8"/>
+  <title>iconfont Demo</title>
+  <link rel="shortcut icon" href="//img.alicdn.com/imgextra/i4/O1CN01Z5paLz1O0zuCC7osS_!!6000000001644-55-tps-83-82.svg" type="image/x-icon"/>
+  <link rel="icon" type="image/svg+xml" href="//img.alicdn.com/imgextra/i4/O1CN01Z5paLz1O0zuCC7osS_!!6000000001644-55-tps-83-82.svg"/>
+  <link rel="stylesheet" href="https://g.alicdn.com/thx/cube/1.3.2/cube.min.css">
+  <link rel="stylesheet" href="demo.css">
+  <link rel="stylesheet" href="iconfont.css">
+  <script src="iconfont.js"></script>
+  <!-- jQuery -->
+  <script src="https://a1.alicdn.com/oss/uploads/2018/12/26/7bfddb60-08e8-11e9-9b04-53e73bb6408b.js"></script>
+  <!-- 代码高亮 -->
+  <script src="https://a1.alicdn.com/oss/uploads/2018/12/26/a3f714d0-08e6-11e9-8a15-ebf944d7534c.js"></script>
+  <style>
+    .main .logo {
+      margin-top: 0;
+      height: auto;
+    }
+
+    .main .logo a {
+      display: flex;
+      align-items: center;
+    }
+
+    .main .logo .sub-title {
+      margin-left: 0.5em;
+      font-size: 22px;
+      color: #fff;
+      background: linear-gradient(-45deg, #3967FF, #B500FE);
+      -webkit-background-clip: text;
+      -webkit-text-fill-color: transparent;
+    }
+  </style>
+</head>
+<body>
+  <div class="main">
+    <h1 class="logo"><a href="https://www.iconfont.cn/" title="iconfont 首页" target="_blank">
+      <img width="200" src="https://img.alicdn.com/imgextra/i3/O1CN01Mn65HV1FfSEzR6DKv_!!6000000000514-55-tps-228-59.svg">
+      
+    </a></h1>
+    <div class="nav-tabs">
+      <ul id="tabs" class="dib-box">
+        <li class="dib active"><span>Unicode</span></li>
+        <li class="dib"><span>Font class</span></li>
+        <li class="dib"><span>Symbol</span></li>
+      </ul>
+      
+      <a href="https://www.iconfont.cn/manage/index?manage_type=myprojects&projectId=3361042" target="_blank" class="nav-more">查看项目</a>
+      
+    </div>
+    <div class="tab-container">
+      <div class="content unicode" style="display: block;">
+          <ul class="icon_lists dib-box">
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe657;</span>
+                <div class="name">办公1</div>
+                <div class="code-name">&amp;#xe657;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe658;</span>
+                <div class="name">单据流1</div>
+                <div class="code-name">&amp;#xe658;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe668;</span>
+                <div class="name">工具3</div>
+                <div class="code-name">&amp;#xe668;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe669;</span>
+                <div class="name">办公3</div>
+                <div class="code-name">&amp;#xe669;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe66a;</span>
+                <div class="name">考勤管理3</div>
+                <div class="code-name">&amp;#xe66a;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe66b;</span>
+                <div class="name">数据3</div>
+                <div class="code-name">&amp;#xe66b;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe66c;</span>
+                <div class="name">首页3</div>
+                <div class="code-name">&amp;#xe66c;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe66d;</span>
+                <div class="name">供应商3</div>
+                <div class="code-name">&amp;#xe66d;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe66e;</span>
+                <div class="name">人事3</div>
+                <div class="code-name">&amp;#xe66e;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe66f;</span>
+                <div class="name">组织3</div>
+                <div class="code-name">&amp;#xe66f;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe670;</span>
+                <div class="name">客户3</div>
+                <div class="code-name">&amp;#xe670;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe671;</span>
+                <div class="name">物料3</div>
+                <div class="code-name">&amp;#xe671;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe672;</span>
+                <div class="name">销售3</div>
+                <div class="code-name">&amp;#xe672;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe673;</span>
+                <div class="name">指标3</div>
+                <div class="code-name">&amp;#xe673;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe674;</span>
+                <div class="name">模版3</div>
+                <div class="code-name">&amp;#xe674;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe675;</span>
+                <div class="name">单据流3</div>
+                <div class="code-name">&amp;#xe675;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe676;</span>
+                <div class="name">项目3</div>
+                <div class="code-name">&amp;#xe676;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe678;</span>
+                <div class="name">业务3</div>
+                <div class="code-name">&amp;#xe678;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe679;</span>
+                <div class="name">模版</div>
+                <div class="code-name">&amp;#xe679;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe683;</span>
+                <div class="name">打印</div>
+                <div class="code-name">&amp;#xe683;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe684;</span>
+                <div class="name">出差</div>
+                <div class="code-name">&amp;#xe684;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe685;</span>
+                <div class="name">单据记录</div>
+                <div class="code-name">&amp;#xe685;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe686;</span>
+                <div class="name">岗位</div>
+                <div class="code-name">&amp;#xe686;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe687;</span>
+                <div class="name">发布</div>
+                <div class="code-name">&amp;#xe687;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe688;</span>
+                <div class="name">点赞</div>
+                <div class="code-name">&amp;#xe688;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe68c;</span>
+                <div class="name">合作</div>
+                <div class="code-name">&amp;#xe68c;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe68d;</span>
+                <div class="name">工具</div>
+                <div class="code-name">&amp;#xe68d;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe690;</span>
+                <div class="name">旗帜</div>
+                <div class="code-name">&amp;#xe690;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe693;</span>
+                <div class="name">人事记录</div>
+                <div class="code-name">&amp;#xe693;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe694;</span>
+                <div class="name">目标</div>
+                <div class="code-name">&amp;#xe694;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe695;</span>
+                <div class="name">时间</div>
+                <div class="code-name">&amp;#xe695;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe69a;</span>
+                <div class="name">销售冠军</div>
+                <div class="code-name">&amp;#xe69a;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe69b;</span>
+                <div class="name">物联网</div>
+                <div class="code-name">&amp;#xe69b;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe69c;</span>
+                <div class="name">物料</div>
+                <div class="code-name">&amp;#xe69c;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe69d;</span>
+                <div class="name">add-account</div>
+                <div class="code-name">&amp;#xe69d;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe69e;</span>
+                <div class="name">office-supplies-fill</div>
+                <div class="code-name">&amp;#xe69e;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe69f;</span>
+                <div class="name">下午茶、员工福利</div>
+                <div class="code-name">&amp;#xe69f;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe6a0;</span>
+                <div class="name">指标、计划、方向</div>
+                <div class="code-name">&amp;#xe6a0;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe6a1;</span>
+                <div class="name">指标</div>
+                <div class="code-name">&amp;#xe6a1;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe6a2;</span>
+                <div class="name">图钉</div>
+                <div class="code-name">&amp;#xe6a2;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe6a3;</span>
+                <div class="name">supplier-features-fill</div>
+                <div class="code-name">&amp;#xe6a3;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe6a4;</span>
+                <div class="name">模板</div>
+                <div class="code-name">&amp;#xe6a4;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe6a5;</span>
+                <div class="name">组织机构</div>
+                <div class="code-name">&amp;#xe6a5;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe6a6;</span>
+                <div class="name">资金</div>
+                <div class="code-name">&amp;#xe6a6;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe6a7;</span>
+                <div class="name">certified-supplier-fill</div>
+                <div class="code-name">&amp;#xe6a7;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe68f;</span>
+                <div class="name">新闻</div>
+                <div class="code-name">&amp;#xe68f;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe6e9;</span>
+                <div class="name">对象类型-客户2</div>
+                <div class="code-name">&amp;#xe6e9;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe70a;</span>
+                <div class="name">对象类型-指标群1</div>
+                <div class="code-name">&amp;#xe70a;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe607;</span>
+                <div class="name">水滴</div>
+                <div class="code-name">&amp;#xe607;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe623;</span>
+                <div class="name">下拉框</div>
+                <div class="code-name">&amp;#xe623;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe707;</span>
+                <div class="name">排行榜</div>
+                <div class="code-name">&amp;#xe707;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe7af;</span>
+                <div class="name">表格图表</div>
+                <div class="code-name">&amp;#xe7af;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe611;</span>
+                <div class="name">办公</div>
+                <div class="code-name">&amp;#xe611;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe619;</span>
+                <div class="name">组织</div>
+                <div class="code-name">&amp;#xe619;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe61c;</span>
+                <div class="name">客户</div>
+                <div class="code-name">&amp;#xe61c;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe61d;</span>
+                <div class="name">物料</div>
+                <div class="code-name">&amp;#xe61d;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe61e;</span>
+                <div class="name">项目</div>
+                <div class="code-name">&amp;#xe61e;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe621;</span>
+                <div class="name">指标</div>
+                <div class="code-name">&amp;#xe621;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe624;</span>
+                <div class="name">工具</div>
+                <div class="code-name">&amp;#xe624;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe626;</span>
+                <div class="name">考勤管理</div>
+                <div class="code-name">&amp;#xe626;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe65a;</span>
+                <div class="name">考勤管理1</div>
+                <div class="code-name">&amp;#xe65a;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe65e;</span>
+                <div class="name">工具1</div>
+                <div class="code-name">&amp;#xe65e;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe660;</span>
+                <div class="name">物料1</div>
+                <div class="code-name">&amp;#xe660;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe661;</span>
+                <div class="name">业务1</div>
+                <div class="code-name">&amp;#xe661;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe662;</span>
+                <div class="name">销售1</div>
+                <div class="code-name">&amp;#xe662;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe667;</span>
+                <div class="name">组织1</div>
+                <div class="code-name">&amp;#xe667;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe68a;</span>
+                <div class="name">金牌销售</div>
+                <div class="code-name">&amp;#xe68a;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe68b;</span>
+                <div class="name">供应商</div>
+                <div class="code-name">&amp;#xe68b;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe691;</span>
+                <div class="name">福利</div>
+                <div class="code-name">&amp;#xe691;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe697;</span>
+                <div class="name">品牌管理</div>
+                <div class="code-name">&amp;#xe697;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xf96a;</span>
+                <div class="name">时间</div>
+                <div class="code-name">&amp;#xf96a;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe618;</span>
+                <div class="name">折线面积图 </div>
+                <div class="code-name">&amp;#xe618;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe60a;</span>
+                <div class="name">统计图</div>
+                <div class="code-name">&amp;#xe60a;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe639;</span>
+                <div class="name">业绩面板</div>
+                <div class="code-name">&amp;#xe639;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe726;</span>
+                <div class="name">统计图</div>
+                <div class="code-name">&amp;#xe726;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xeba2;</span>
+                <div class="name">图钉</div>
+                <div class="code-name">&amp;#xeba2;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe6ca;</span>
+                <div class="name">图钉</div>
+                <div class="code-name">&amp;#xe6ca;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe605;</span>
+                <div class="name">palette</div>
+                <div class="code-name">&amp;#xe605;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe604;</span>
+                <div class="name">customer</div>
+                <div class="code-name">&amp;#xe604;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe603;</span>
+                <div class="name">dmp</div>
+                <div class="code-name">&amp;#xe603;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe602;</span>
+                <div class="name">role</div>
+                <div class="code-name">&amp;#xe602;</div>
+              </li>
+          
+          </ul>
+          <div class="article markdown">
+          <h2 id="unicode-">Unicode 引用</h2>
+          <hr>
+
+          <p>Unicode 是字体在网页端最原始的应用方式,特点是:</p>
+          <ul>
+            <li>支持按字体的方式去动态调整图标大小,颜色等等。</li>
+            <li>默认情况下不支持多色,直接添加多色图标会自动去色。</li>
+          </ul>
+          <blockquote>
+            <p>注意:新版 iconfont 支持两种方式引用多色图标:SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)</p>
+          </blockquote>
+          <p>Unicode 使用步骤如下:</p>
+          <h3 id="-font-face">第一步:拷贝项目下面生成的 <code>@font-face</code></h3>
+<pre><code class="language-css"
+>@font-face {
+  font-family: 'iconfont';
+  src: url('iconfont.woff2?t=1718608625611') format('woff2'),
+       url('iconfont.woff?t=1718608625611') format('woff'),
+       url('iconfont.ttf?t=1718608625611') format('truetype');
+}
+</code></pre>
+          <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
+<pre><code class="language-css"
+>.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+</code></pre>
+          <h3 id="-">第三步:挑选相应图标并获取字体编码,应用于页面</h3>
+<pre>
+<code class="language-html"
+>&lt;span class="iconfont"&gt;&amp;#x33;&lt;/span&gt;
+</code></pre>
+          <blockquote>
+            <p>"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
+          </blockquote>
+          </div>
+      </div>
+      <div class="content font-class">
+        <ul class="icon_lists dib-box">
+          
+          <li class="dib">
+            <span class="icon iconfont menu-bangong1"></span>
+            <div class="name">
+              办公1
+            </div>
+            <div class="code-name">.menu-bangong1
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont menu-danjuliu1"></span>
+            <div class="name">
+              单据流1
+            </div>
+            <div class="code-name">.menu-danjuliu1
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont menu-gongju3"></span>
+            <div class="name">
+              工具3
+            </div>
+            <div class="code-name">.menu-gongju3
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont menu-bangong3"></span>
+            <div class="name">
+              办公3
+            </div>
+            <div class="code-name">.menu-bangong3
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont menu-kaoqinguanli3"></span>
+            <div class="name">
+              考勤管理3
+            </div>
+            <div class="code-name">.menu-kaoqinguanli3
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-shuju3"></span>
+            <div class="name">
+              数据3
+            </div>
+            <div class="code-name">.Dh-shuju3
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-shouye3"></span>
+            <div class="name">
+              首页3
+            </div>
+            <div class="code-name">.Dh-shouye3
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-gongyingshang3"></span>
+            <div class="name">
+              供应商3
+            </div>
+            <div class="code-name">.Dh-gongyingshang3
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-renshi3"></span>
+            <div class="name">
+              人事3
+            </div>
+            <div class="code-name">.Dh-renshi3
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-zuzhi3"></span>
+            <div class="name">
+              组织3
+            </div>
+            <div class="code-name">.Dh-zuzhi3
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-kehu3"></span>
+            <div class="name">
+              客户3
+            </div>
+            <div class="code-name">.Dh-kehu3
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-wuliao3"></span>
+            <div class="name">
+              物料3
+            </div>
+            <div class="code-name">.Dh-wuliao3
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-xiaoshou3"></span>
+            <div class="name">
+              销售3
+            </div>
+            <div class="code-name">.Dh-xiaoshou3
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-zhibiao3"></span>
+            <div class="name">
+              指标3
+            </div>
+            <div class="code-name">.Dh-zhibiao3
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-moban3"></span>
+            <div class="name">
+              模版3
+            </div>
+            <div class="code-name">.Dh-moban3
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-danjuliu3"></span>
+            <div class="name">
+              单据流3
+            </div>
+            <div class="code-name">.Dh-danjuliu3
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-xiangmu3"></span>
+            <div class="name">
+              项目3
+            </div>
+            <div class="code-name">.Dh-xiangmu3
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-yewu3"></span>
+            <div class="name">
+              业务3
+            </div>
+            <div class="code-name">.Dh-yewu3
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-moban"></span>
+            <div class="name">
+              模版
+            </div>
+            <div class="code-name">.Dh-moban
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-dayin"></span>
+            <div class="name">
+              打印
+            </div>
+            <div class="code-name">.Dh-dayin
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-chucha"></span>
+            <div class="name">
+              出差
+            </div>
+            <div class="code-name">.Dh-chucha
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-danjujilu"></span>
+            <div class="name">
+              单据记录
+            </div>
+            <div class="code-name">.Dh-danjujilu
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-gangwei1"></span>
+            <div class="name">
+              岗位
+            </div>
+            <div class="code-name">.Dh-gangwei1
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-fabu"></span>
+            <div class="name">
+              发布
+            </div>
+            <div class="code-name">.Dh-fabu
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-dianzan"></span>
+            <div class="name">
+              点赞
+            </div>
+            <div class="code-name">.Dh-dianzan
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-hezuo"></span>
+            <div class="name">
+              合作
+            </div>
+            <div class="code-name">.Dh-hezuo
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-gongju2"></span>
+            <div class="name">
+              工具
+            </div>
+            <div class="code-name">.Dh-gongju2
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-qizhi"></span>
+            <div class="name">
+              旗帜
+            </div>
+            <div class="code-name">.Dh-qizhi
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-renshijilu"></span>
+            <div class="name">
+              人事记录
+            </div>
+            <div class="code-name">.Dh-renshijilu
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-mubiao"></span>
+            <div class="name">
+              目标
+            </div>
+            <div class="code-name">.Dh-mubiao
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-shijian"></span>
+            <div class="name">
+              时间
+            </div>
+            <div class="code-name">.Dh-shijian
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-xiaoshouguanjun"></span>
+            <div class="name">
+              销售冠军
+            </div>
+            <div class="code-name">.Dh-xiaoshouguanjun
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-wulianwang2"></span>
+            <div class="name">
+              物联网
+            </div>
+            <div class="code-name">.Dh-wulianwang2
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-wuliao2"></span>
+            <div class="name">
+              物料
+            </div>
+            <div class="code-name">.Dh-wuliao2
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-add"></span>
+            <div class="name">
+              add-account
+            </div>
+            <div class="code-name">.Dh-add
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-office-supplies"></span>
+            <div class="name">
+              office-supplies-fill
+            </div>
+            <div class="code-name">.Dh-office-supplies
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-xiawucha"></span>
+            <div class="name">
+              下午茶、员工福利
+            </div>
+            <div class="code-name">.Dh-xiawucha
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-zhibiao2"></span>
+            <div class="name">
+              指标、计划、方向
+            </div>
+            <div class="code-name">.Dh-zhibiao2
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-zhibiao4"></span>
+            <div class="name">
+              指标
+            </div>
+            <div class="code-name">.Dh-zhibiao4
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-tuding"></span>
+            <div class="name">
+              图钉
+            </div>
+            <div class="code-name">.Dh-tuding
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-supplier-features"></span>
+            <div class="name">
+              supplier-features-fill
+            </div>
+            <div class="code-name">.Dh-supplier-features
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-moban2"></span>
+            <div class="name">
+              模板
+            </div>
+            <div class="code-name">.Dh-moban2
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-zuzhijigou"></span>
+            <div class="name">
+              组织机构
+            </div>
+            <div class="code-name">.Dh-zuzhijigou
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-zijin"></span>
+            <div class="name">
+              资金
+            </div>
+            <div class="code-name">.Dh-zijin
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-certified-supplier"></span>
+            <div class="name">
+              certified-supplier-fill
+            </div>
+            <div class="code-name">.Dh-certified-supplier
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont Dh-xinwen"></span>
+            <div class="name">
+              新闻
+            </div>
+            <div class="code-name">.Dh-xinwen
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont duixiangleixing-kehu2"></span>
+            <div class="name">
+              对象类型-客户2
+            </div>
+            <div class="code-name">.duixiangleixing-kehu2
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont duixiangleixing-zhibiaoqun1"></span>
+            <div class="name">
+              对象类型-指标群1
+            </div>
+            <div class="code-name">.duixiangleixing-zhibiaoqun1
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont shuidi"></span>
+            <div class="name">
+              水滴
+            </div>
+            <div class="code-name">.shuidi
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont xialakuang"></span>
+            <div class="name">
+              下拉框
+            </div>
+            <div class="code-name">.xialakuang
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont dmp-ranking"></span>
+            <div class="name">
+              排行榜
+            </div>
+            <div class="code-name">.dmp-ranking
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont dmp-table"></span>
+            <div class="name">
+              表格图表
+            </div>
+            <div class="code-name">.dmp-table
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont menu-bangong"></span>
+            <div class="name">
+              办公
+            </div>
+            <div class="code-name">.menu-bangong
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont menu-zuzhi"></span>
+            <div class="name">
+              组织
+            </div>
+            <div class="code-name">.menu-zuzhi
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont menu-kehu"></span>
+            <div class="name">
+              客户
+            </div>
+            <div class="code-name">.menu-kehu
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont menu-wuliao"></span>
+            <div class="name">
+              物料
+            </div>
+            <div class="code-name">.menu-wuliao
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont menu-xiangmu"></span>
+            <div class="name">
+              项目
+            </div>
+            <div class="code-name">.menu-xiangmu
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont menu-zhibiao"></span>
+            <div class="name">
+              指标
+            </div>
+            <div class="code-name">.menu-zhibiao
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont menu-gongju"></span>
+            <div class="name">
+              工具
+            </div>
+            <div class="code-name">.menu-gongju
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont menu-kaoqinguanli"></span>
+            <div class="name">
+              考勤管理
+            </div>
+            <div class="code-name">.menu-kaoqinguanli
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont menu-kaoqinguanli1"></span>
+            <div class="name">
+              考勤管理1
+            </div>
+            <div class="code-name">.menu-kaoqinguanli1
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont menu-gongju1"></span>
+            <div class="name">
+              工具1
+            </div>
+            <div class="code-name">.menu-gongju1
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont menu-wuliao1"></span>
+            <div class="name">
+              物料1
+            </div>
+            <div class="code-name">.menu-wuliao1
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont menu-yewu1"></span>
+            <div class="name">
+              业务1
+            </div>
+            <div class="code-name">.menu-yewu1
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont menu-xiaoshou1"></span>
+            <div class="name">
+              销售1
+            </div>
+            <div class="code-name">.menu-xiaoshou1
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont menu-zuzhi1"></span>
+            <div class="name">
+              组织1
+            </div>
+            <div class="code-name">.menu-zuzhi1
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont menu-jinpaixiaoshou"></span>
+            <div class="name">
+              金牌销售
+            </div>
+            <div class="code-name">.menu-jinpaixiaoshou
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont menu-gongyingshang2"></span>
+            <div class="name">
+              供应商
+            </div>
+            <div class="code-name">.menu-gongyingshang2
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont menu-fuli"></span>
+            <div class="name">
+              福利
+            </div>
+            <div class="code-name">.menu-fuli
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont menu-pinpaiguanli"></span>
+            <div class="name">
+              品牌管理
+            </div>
+            <div class="code-name">.menu-pinpaiguanli
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont dmp-time"></span>
+            <div class="name">
+              时间
+            </div>
+            <div class="code-name">.dmp-time
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont dmp-lin"></span>
+            <div class="name">
+              折线面积图 
+            </div>
+            <div class="code-name">.dmp-lin
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont dmp-bar"></span>
+            <div class="name">
+              统计图
+            </div>
+            <div class="code-name">.dmp-bar
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont dmp-card"></span>
+            <div class="name">
+              业绩面板
+            </div>
+            <div class="code-name">.dmp-card
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont dmp-pie"></span>
+            <div class="name">
+              统计图
+            </div>
+            <div class="code-name">.dmp-pie
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont pushpin-fill"></span>
+            <div class="name">
+              图钉
+            </div>
+            <div class="code-name">.pushpin-fill
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont tuding"></span>
+            <div class="name">
+              图钉
+            </div>
+            <div class="code-name">.tuding
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont menu-palette"></span>
+            <div class="name">
+              palette
+            </div>
+            <div class="code-name">.menu-palette
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont menu-customer"></span>
+            <div class="name">
+              customer
+            </div>
+            <div class="code-name">.menu-customer
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont menu-dmp"></span>
+            <div class="name">
+              dmp
+            </div>
+            <div class="code-name">.menu-dmp
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont role"></span>
+            <div class="name">
+              role
+            </div>
+            <div class="code-name">.role
+            </div>
+          </li>
+          
+        </ul>
+        <div class="article markdown">
+        <h2 id="font-class-">font-class 引用</h2>
+        <hr>
+
+        <p>font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。</p>
+        <p>与 Unicode 使用方式相比,具有如下特点:</p>
+        <ul>
+          <li>相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。</li>
+          <li>因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。</li>
+        </ul>
+        <p>使用步骤如下:</p>
+        <h3 id="-fontclass-">第一步:引入项目下面生成的 fontclass 代码:</h3>
+<pre><code class="language-html">&lt;link rel="stylesheet" href="./iconfont.css"&gt;
+</code></pre>
+        <h3 id="-">第二步:挑选相应图标并获取类名,应用于页面:</h3>
+<pre><code class="language-html">&lt;span class="iconfont xxx"&gt;&lt;/span&gt;
+</code></pre>
+        <blockquote>
+          <p>"
+            iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
+        </blockquote>
+      </div>
+      </div>
+      <div class="content symbol">
+          <ul class="icon_lists dib-box">
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#menu-bangong1"></use>
+                </svg>
+                <div class="name">办公1</div>
+                <div class="code-name">#menu-bangong1</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#menu-danjuliu1"></use>
+                </svg>
+                <div class="name">单据流1</div>
+                <div class="code-name">#menu-danjuliu1</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#menu-gongju3"></use>
+                </svg>
+                <div class="name">工具3</div>
+                <div class="code-name">#menu-gongju3</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#menu-bangong3"></use>
+                </svg>
+                <div class="name">办公3</div>
+                <div class="code-name">#menu-bangong3</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#menu-kaoqinguanli3"></use>
+                </svg>
+                <div class="name">考勤管理3</div>
+                <div class="code-name">#menu-kaoqinguanli3</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-shuju3"></use>
+                </svg>
+                <div class="name">数据3</div>
+                <div class="code-name">#Dh-shuju3</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-shouye3"></use>
+                </svg>
+                <div class="name">首页3</div>
+                <div class="code-name">#Dh-shouye3</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-gongyingshang3"></use>
+                </svg>
+                <div class="name">供应商3</div>
+                <div class="code-name">#Dh-gongyingshang3</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-renshi3"></use>
+                </svg>
+                <div class="name">人事3</div>
+                <div class="code-name">#Dh-renshi3</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-zuzhi3"></use>
+                </svg>
+                <div class="name">组织3</div>
+                <div class="code-name">#Dh-zuzhi3</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-kehu3"></use>
+                </svg>
+                <div class="name">客户3</div>
+                <div class="code-name">#Dh-kehu3</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-wuliao3"></use>
+                </svg>
+                <div class="name">物料3</div>
+                <div class="code-name">#Dh-wuliao3</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-xiaoshou3"></use>
+                </svg>
+                <div class="name">销售3</div>
+                <div class="code-name">#Dh-xiaoshou3</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-zhibiao3"></use>
+                </svg>
+                <div class="name">指标3</div>
+                <div class="code-name">#Dh-zhibiao3</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-moban3"></use>
+                </svg>
+                <div class="name">模版3</div>
+                <div class="code-name">#Dh-moban3</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-danjuliu3"></use>
+                </svg>
+                <div class="name">单据流3</div>
+                <div class="code-name">#Dh-danjuliu3</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-xiangmu3"></use>
+                </svg>
+                <div class="name">项目3</div>
+                <div class="code-name">#Dh-xiangmu3</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-yewu3"></use>
+                </svg>
+                <div class="name">业务3</div>
+                <div class="code-name">#Dh-yewu3</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-moban"></use>
+                </svg>
+                <div class="name">模版</div>
+                <div class="code-name">#Dh-moban</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-dayin"></use>
+                </svg>
+                <div class="name">打印</div>
+                <div class="code-name">#Dh-dayin</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-chucha"></use>
+                </svg>
+                <div class="name">出差</div>
+                <div class="code-name">#Dh-chucha</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-danjujilu"></use>
+                </svg>
+                <div class="name">单据记录</div>
+                <div class="code-name">#Dh-danjujilu</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-gangwei1"></use>
+                </svg>
+                <div class="name">岗位</div>
+                <div class="code-name">#Dh-gangwei1</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-fabu"></use>
+                </svg>
+                <div class="name">发布</div>
+                <div class="code-name">#Dh-fabu</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-dianzan"></use>
+                </svg>
+                <div class="name">点赞</div>
+                <div class="code-name">#Dh-dianzan</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-hezuo"></use>
+                </svg>
+                <div class="name">合作</div>
+                <div class="code-name">#Dh-hezuo</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-gongju2"></use>
+                </svg>
+                <div class="name">工具</div>
+                <div class="code-name">#Dh-gongju2</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-qizhi"></use>
+                </svg>
+                <div class="name">旗帜</div>
+                <div class="code-name">#Dh-qizhi</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-renshijilu"></use>
+                </svg>
+                <div class="name">人事记录</div>
+                <div class="code-name">#Dh-renshijilu</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-mubiao"></use>
+                </svg>
+                <div class="name">目标</div>
+                <div class="code-name">#Dh-mubiao</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-shijian"></use>
+                </svg>
+                <div class="name">时间</div>
+                <div class="code-name">#Dh-shijian</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-xiaoshouguanjun"></use>
+                </svg>
+                <div class="name">销售冠军</div>
+                <div class="code-name">#Dh-xiaoshouguanjun</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-wulianwang2"></use>
+                </svg>
+                <div class="name">物联网</div>
+                <div class="code-name">#Dh-wulianwang2</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-wuliao2"></use>
+                </svg>
+                <div class="name">物料</div>
+                <div class="code-name">#Dh-wuliao2</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-add"></use>
+                </svg>
+                <div class="name">add-account</div>
+                <div class="code-name">#Dh-add</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-office-supplies"></use>
+                </svg>
+                <div class="name">office-supplies-fill</div>
+                <div class="code-name">#Dh-office-supplies</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-xiawucha"></use>
+                </svg>
+                <div class="name">下午茶、员工福利</div>
+                <div class="code-name">#Dh-xiawucha</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-zhibiao2"></use>
+                </svg>
+                <div class="name">指标、计划、方向</div>
+                <div class="code-name">#Dh-zhibiao2</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-zhibiao4"></use>
+                </svg>
+                <div class="name">指标</div>
+                <div class="code-name">#Dh-zhibiao4</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-tuding"></use>
+                </svg>
+                <div class="name">图钉</div>
+                <div class="code-name">#Dh-tuding</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-supplier-features"></use>
+                </svg>
+                <div class="name">supplier-features-fill</div>
+                <div class="code-name">#Dh-supplier-features</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-moban2"></use>
+                </svg>
+                <div class="name">模板</div>
+                <div class="code-name">#Dh-moban2</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-zuzhijigou"></use>
+                </svg>
+                <div class="name">组织机构</div>
+                <div class="code-name">#Dh-zuzhijigou</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-zijin"></use>
+                </svg>
+                <div class="name">资金</div>
+                <div class="code-name">#Dh-zijin</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-certified-supplier"></use>
+                </svg>
+                <div class="name">certified-supplier-fill</div>
+                <div class="code-name">#Dh-certified-supplier</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#Dh-xinwen"></use>
+                </svg>
+                <div class="name">新闻</div>
+                <div class="code-name">#Dh-xinwen</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#duixiangleixing-kehu2"></use>
+                </svg>
+                <div class="name">对象类型-客户2</div>
+                <div class="code-name">#duixiangleixing-kehu2</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#duixiangleixing-zhibiaoqun1"></use>
+                </svg>
+                <div class="name">对象类型-指标群1</div>
+                <div class="code-name">#duixiangleixing-zhibiaoqun1</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#shuidi"></use>
+                </svg>
+                <div class="name">水滴</div>
+                <div class="code-name">#shuidi</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#xialakuang"></use>
+                </svg>
+                <div class="name">下拉框</div>
+                <div class="code-name">#xialakuang</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#dmp-ranking"></use>
+                </svg>
+                <div class="name">排行榜</div>
+                <div class="code-name">#dmp-ranking</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#dmp-table"></use>
+                </svg>
+                <div class="name">表格图表</div>
+                <div class="code-name">#dmp-table</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#menu-bangong"></use>
+                </svg>
+                <div class="name">办公</div>
+                <div class="code-name">#menu-bangong</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#menu-zuzhi"></use>
+                </svg>
+                <div class="name">组织</div>
+                <div class="code-name">#menu-zuzhi</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#menu-kehu"></use>
+                </svg>
+                <div class="name">客户</div>
+                <div class="code-name">#menu-kehu</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#menu-wuliao"></use>
+                </svg>
+                <div class="name">物料</div>
+                <div class="code-name">#menu-wuliao</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#menu-xiangmu"></use>
+                </svg>
+                <div class="name">项目</div>
+                <div class="code-name">#menu-xiangmu</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#menu-zhibiao"></use>
+                </svg>
+                <div class="name">指标</div>
+                <div class="code-name">#menu-zhibiao</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#menu-gongju"></use>
+                </svg>
+                <div class="name">工具</div>
+                <div class="code-name">#menu-gongju</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#menu-kaoqinguanli"></use>
+                </svg>
+                <div class="name">考勤管理</div>
+                <div class="code-name">#menu-kaoqinguanli</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#menu-kaoqinguanli1"></use>
+                </svg>
+                <div class="name">考勤管理1</div>
+                <div class="code-name">#menu-kaoqinguanli1</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#menu-gongju1"></use>
+                </svg>
+                <div class="name">工具1</div>
+                <div class="code-name">#menu-gongju1</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#menu-wuliao1"></use>
+                </svg>
+                <div class="name">物料1</div>
+                <div class="code-name">#menu-wuliao1</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#menu-yewu1"></use>
+                </svg>
+                <div class="name">业务1</div>
+                <div class="code-name">#menu-yewu1</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#menu-xiaoshou1"></use>
+                </svg>
+                <div class="name">销售1</div>
+                <div class="code-name">#menu-xiaoshou1</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#menu-zuzhi1"></use>
+                </svg>
+                <div class="name">组织1</div>
+                <div class="code-name">#menu-zuzhi1</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#menu-jinpaixiaoshou"></use>
+                </svg>
+                <div class="name">金牌销售</div>
+                <div class="code-name">#menu-jinpaixiaoshou</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#menu-gongyingshang2"></use>
+                </svg>
+                <div class="name">供应商</div>
+                <div class="code-name">#menu-gongyingshang2</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#menu-fuli"></use>
+                </svg>
+                <div class="name">福利</div>
+                <div class="code-name">#menu-fuli</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#menu-pinpaiguanli"></use>
+                </svg>
+                <div class="name">品牌管理</div>
+                <div class="code-name">#menu-pinpaiguanli</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#dmp-time"></use>
+                </svg>
+                <div class="name">时间</div>
+                <div class="code-name">#dmp-time</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#dmp-lin"></use>
+                </svg>
+                <div class="name">折线面积图 </div>
+                <div class="code-name">#dmp-lin</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#dmp-bar"></use>
+                </svg>
+                <div class="name">统计图</div>
+                <div class="code-name">#dmp-bar</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#dmp-card"></use>
+                </svg>
+                <div class="name">业绩面板</div>
+                <div class="code-name">#dmp-card</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#dmp-pie"></use>
+                </svg>
+                <div class="name">统计图</div>
+                <div class="code-name">#dmp-pie</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#pushpin-fill"></use>
+                </svg>
+                <div class="name">图钉</div>
+                <div class="code-name">#pushpin-fill</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#tuding"></use>
+                </svg>
+                <div class="name">图钉</div>
+                <div class="code-name">#tuding</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#menu-palette"></use>
+                </svg>
+                <div class="name">palette</div>
+                <div class="code-name">#menu-palette</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#menu-customer"></use>
+                </svg>
+                <div class="name">customer</div>
+                <div class="code-name">#menu-customer</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#menu-dmp"></use>
+                </svg>
+                <div class="name">dmp</div>
+                <div class="code-name">#menu-dmp</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#role"></use>
+                </svg>
+                <div class="name">role</div>
+                <div class="code-name">#role</div>
+            </li>
+          
+          </ul>
+          <div class="article markdown">
+          <h2 id="symbol-">Symbol 引用</h2>
+          <hr>
+
+          <p>这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇<a href="">文章</a>
+            这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:</p>
+          <ul>
+            <li>支持多色图标了,不再受单色限制。</li>
+            <li>通过一些技巧,支持像字体那样,通过 <code>font-size</code>, <code>color</code> 来调整样式。</li>
+            <li>兼容性较差,支持 IE9+,及现代浏览器。</li>
+            <li>浏览器渲染 SVG 的性能一般,还不如 png。</li>
+          </ul>
+          <p>使用步骤如下:</p>
+          <h3 id="-symbol-">第一步:引入项目下面生成的 symbol 代码:</h3>
+<pre><code class="language-html">&lt;script src="./iconfont.js"&gt;&lt;/script&gt;
+</code></pre>
+          <h3 id="-css-">第二步:加入通用 CSS 代码(引入一次就行):</h3>
+<pre><code class="language-html">&lt;style&gt;
+.icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+&lt;/style&gt;
+</code></pre>
+          <h3 id="-">第三步:挑选相应图标并获取类名,应用于页面:</h3>
+<pre><code class="language-html">&lt;svg class="icon" aria-hidden="true"&gt;
+  &lt;use xlink:href="#icon-xxx"&gt;&lt;/use&gt;
+&lt;/svg&gt;
+</code></pre>
+          </div>
+      </div>
+
+    </div>
+  </div>
+  <script>
+  $(document).ready(function () {
+      $('.tab-container .content:first').show()
+
+      $('#tabs li').click(function (e) {
+        var tabContent = $('.tab-container .content')
+        var index = $(this).index()
+
+        if ($(this).hasClass('active')) {
+          return
+        } else {
+          $('#tabs li').removeClass('active')
+          $(this).addClass('active')
+
+          tabContent.hide().eq(index).fadeIn()
+        }
+      })
+    })
+  </script>
+</body>
+</html>

+ 339 - 0
src/assets/iconsvg/iconfont.css

@@ -0,0 +1,339 @@
+@font-face {
+  font-family: "iconfont"; /* Project id 3361042 */
+  src: url('iconfont.woff2?t=1718608625611') format('woff2'),
+       url('iconfont.woff?t=1718608625611') format('woff'),
+       url('iconfont.ttf?t=1718608625611') format('truetype');
+}
+
+.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.menu-bangong1:before {
+  content: "\e657";
+}
+
+.menu-danjuliu1:before {
+  content: "\e658";
+}
+
+.menu-gongju3:before {
+  content: "\e668";
+}
+
+.menu-bangong3:before {
+  content: "\e669";
+}
+
+.menu-kaoqinguanli3:before {
+  content: "\e66a";
+}
+
+.Dh-shuju3:before {
+  content: "\e66b";
+}
+
+.Dh-shouye3:before {
+  content: "\e66c";
+}
+
+.Dh-gongyingshang3:before {
+  content: "\e66d";
+}
+
+.Dh-renshi3:before {
+  content: "\e66e";
+}
+
+.Dh-zuzhi3:before {
+  content: "\e66f";
+}
+
+.Dh-kehu3:before {
+  content: "\e670";
+}
+
+.Dh-wuliao3:before {
+  content: "\e671";
+}
+
+.Dh-xiaoshou3:before {
+  content: "\e672";
+}
+
+.Dh-zhibiao3:before {
+  content: "\e673";
+}
+
+.Dh-moban3:before {
+  content: "\e674";
+}
+
+.Dh-danjuliu3:before {
+  content: "\e675";
+}
+
+.Dh-xiangmu3:before {
+  content: "\e676";
+}
+
+.Dh-yewu3:before {
+  content: "\e678";
+}
+
+.Dh-moban:before {
+  content: "\e679";
+}
+
+.Dh-dayin:before {
+  content: "\e683";
+}
+
+.Dh-chucha:before {
+  content: "\e684";
+}
+
+.Dh-danjujilu:before {
+  content: "\e685";
+}
+
+.Dh-gangwei1:before {
+  content: "\e686";
+}
+
+.Dh-fabu:before {
+  content: "\e687";
+}
+
+.Dh-dianzan:before {
+  content: "\e688";
+}
+
+.Dh-hezuo:before {
+  content: "\e68c";
+}
+
+.Dh-gongju2:before {
+  content: "\e68d";
+}
+
+.Dh-qizhi:before {
+  content: "\e690";
+}
+
+.Dh-renshijilu:before {
+  content: "\e693";
+}
+
+.Dh-mubiao:before {
+  content: "\e694";
+}
+
+.Dh-shijian:before {
+  content: "\e695";
+}
+
+.Dh-xiaoshouguanjun:before {
+  content: "\e69a";
+}
+
+.Dh-wulianwang2:before {
+  content: "\e69b";
+}
+
+.Dh-wuliao2:before {
+  content: "\e69c";
+}
+
+.Dh-add:before {
+  content: "\e69d";
+}
+
+.Dh-office-supplies:before {
+  content: "\e69e";
+}
+
+.Dh-xiawucha:before {
+  content: "\e69f";
+}
+
+.Dh-zhibiao2:before {
+  content: "\e6a0";
+}
+
+.Dh-zhibiao4:before {
+  content: "\e6a1";
+}
+
+.Dh-tuding:before {
+  content: "\e6a2";
+}
+
+.Dh-supplier-features:before {
+  content: "\e6a3";
+}
+
+.Dh-moban2:before {
+  content: "\e6a4";
+}
+
+.Dh-zuzhijigou:before {
+  content: "\e6a5";
+}
+
+.Dh-zijin:before {
+  content: "\e6a6";
+}
+
+.Dh-certified-supplier:before {
+  content: "\e6a7";
+}
+
+.Dh-xinwen:before {
+  content: "\e68f";
+}
+
+.duixiangleixing-kehu2:before {
+  content: "\e6e9";
+}
+
+.duixiangleixing-zhibiaoqun1:before {
+  content: "\e70a";
+}
+
+.shuidi:before {
+  content: "\e607";
+}
+
+.xialakuang:before {
+  content: "\e623";
+}
+
+.dmp-ranking:before {
+  content: "\e707";
+}
+
+.dmp-table:before {
+  content: "\e7af";
+}
+
+.menu-bangong:before {
+  content: "\e611";
+}
+
+.menu-zuzhi:before {
+  content: "\e619";
+}
+
+.menu-kehu:before {
+  content: "\e61c";
+}
+
+.menu-wuliao:before {
+  content: "\e61d";
+}
+
+.menu-xiangmu:before {
+  content: "\e61e";
+}
+
+.menu-zhibiao:before {
+  content: "\e621";
+}
+
+.menu-gongju:before {
+  content: "\e624";
+}
+
+.menu-kaoqinguanli:before {
+  content: "\e626";
+}
+
+.menu-kaoqinguanli1:before {
+  content: "\e65a";
+}
+
+.menu-gongju1:before {
+  content: "\e65e";
+}
+
+.menu-wuliao1:before {
+  content: "\e660";
+}
+
+.menu-yewu1:before {
+  content: "\e661";
+}
+
+.menu-xiaoshou1:before {
+  content: "\e662";
+}
+
+.menu-zuzhi1:before {
+  content: "\e667";
+}
+
+.menu-jinpaixiaoshou:before {
+  content: "\e68a";
+}
+
+.menu-gongyingshang2:before {
+  content: "\e68b";
+}
+
+.menu-fuli:before {
+  content: "\e691";
+}
+
+.menu-pinpaiguanli:before {
+  content: "\e697";
+}
+
+.dmp-time:before {
+  content: "\f96a";
+}
+
+.dmp-lin:before {
+  content: "\e618";
+}
+
+.dmp-bar:before {
+  content: "\e60a";
+}
+
+.dmp-card:before {
+  content: "\e639";
+}
+
+.dmp-pie:before {
+  content: "\e726";
+}
+
+.pushpin-fill:before {
+  content: "\eba2";
+}
+
+.tuding:before {
+  content: "\e6ca";
+}
+
+.menu-palette:before {
+  content: "\e605";
+}
+
+.menu-customer:before {
+  content: "\e604";
+}
+
+.menu-dmp:before {
+  content: "\e603";
+}
+
+.role:before {
+  content: "\e602";
+}
+

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
src/assets/iconsvg/iconfont.js


+ 576 - 0
src/assets/iconsvg/iconfont.json

@@ -0,0 +1,576 @@
+{
+  "id": "3361042",
+  "name": "DMP",
+  "font_family": "iconfont",
+  "css_prefix_text": "",
+  "description": "",
+  "glyphs": [
+    {
+      "icon_id": "22485477",
+      "name": "办公1",
+      "font_class": "menu-bangong1",
+      "unicode": "e657",
+      "unicode_decimal": 58967
+    },
+    {
+      "icon_id": "22485478",
+      "name": "单据流1",
+      "font_class": "menu-danjuliu1",
+      "unicode": "e658",
+      "unicode_decimal": 58968
+    },
+    {
+      "icon_id": "22485623",
+      "name": "工具3",
+      "font_class": "menu-gongju3",
+      "unicode": "e668",
+      "unicode_decimal": 58984
+    },
+    {
+      "icon_id": "22485624",
+      "name": "办公3",
+      "font_class": "menu-bangong3",
+      "unicode": "e669",
+      "unicode_decimal": 58985
+    },
+    {
+      "icon_id": "22485625",
+      "name": "考勤管理3",
+      "font_class": "menu-kaoqinguanli3",
+      "unicode": "e66a",
+      "unicode_decimal": 58986
+    },
+    {
+      "icon_id": "22485626",
+      "name": "数据3",
+      "font_class": "Dh-shuju3",
+      "unicode": "e66b",
+      "unicode_decimal": 58987
+    },
+    {
+      "icon_id": "22485627",
+      "name": "首页3",
+      "font_class": "Dh-shouye3",
+      "unicode": "e66c",
+      "unicode_decimal": 58988
+    },
+    {
+      "icon_id": "22485628",
+      "name": "供应商3",
+      "font_class": "Dh-gongyingshang3",
+      "unicode": "e66d",
+      "unicode_decimal": 58989
+    },
+    {
+      "icon_id": "22485629",
+      "name": "人事3",
+      "font_class": "Dh-renshi3",
+      "unicode": "e66e",
+      "unicode_decimal": 58990
+    },
+    {
+      "icon_id": "22485630",
+      "name": "组织3",
+      "font_class": "Dh-zuzhi3",
+      "unicode": "e66f",
+      "unicode_decimal": 58991
+    },
+    {
+      "icon_id": "22485631",
+      "name": "客户3",
+      "font_class": "Dh-kehu3",
+      "unicode": "e670",
+      "unicode_decimal": 58992
+    },
+    {
+      "icon_id": "22485632",
+      "name": "物料3",
+      "font_class": "Dh-wuliao3",
+      "unicode": "e671",
+      "unicode_decimal": 58993
+    },
+    {
+      "icon_id": "22485633",
+      "name": "销售3",
+      "font_class": "Dh-xiaoshou3",
+      "unicode": "e672",
+      "unicode_decimal": 58994
+    },
+    {
+      "icon_id": "22485634",
+      "name": "指标3",
+      "font_class": "Dh-zhibiao3",
+      "unicode": "e673",
+      "unicode_decimal": 58995
+    },
+    {
+      "icon_id": "22485635",
+      "name": "模版3",
+      "font_class": "Dh-moban3",
+      "unicode": "e674",
+      "unicode_decimal": 58996
+    },
+    {
+      "icon_id": "22485636",
+      "name": "单据流3",
+      "font_class": "Dh-danjuliu3",
+      "unicode": "e675",
+      "unicode_decimal": 58997
+    },
+    {
+      "icon_id": "22485637",
+      "name": "项目3",
+      "font_class": "Dh-xiangmu3",
+      "unicode": "e676",
+      "unicode_decimal": 58998
+    },
+    {
+      "icon_id": "22485640",
+      "name": "业务3",
+      "font_class": "Dh-yewu3",
+      "unicode": "e678",
+      "unicode_decimal": 59000
+    },
+    {
+      "icon_id": "22890968",
+      "name": "模版",
+      "font_class": "Dh-moban",
+      "unicode": "e679",
+      "unicode_decimal": 59001
+    },
+    {
+      "icon_id": "23343182",
+      "name": "打印",
+      "font_class": "Dh-dayin",
+      "unicode": "e683",
+      "unicode_decimal": 59011
+    },
+    {
+      "icon_id": "23343183",
+      "name": "出差",
+      "font_class": "Dh-chucha",
+      "unicode": "e684",
+      "unicode_decimal": 59012
+    },
+    {
+      "icon_id": "23343184",
+      "name": "单据记录",
+      "font_class": "Dh-danjujilu",
+      "unicode": "e685",
+      "unicode_decimal": 59013
+    },
+    {
+      "icon_id": "23343185",
+      "name": "岗位",
+      "font_class": "Dh-gangwei1",
+      "unicode": "e686",
+      "unicode_decimal": 59014
+    },
+    {
+      "icon_id": "23343186",
+      "name": "发布",
+      "font_class": "Dh-fabu",
+      "unicode": "e687",
+      "unicode_decimal": 59015
+    },
+    {
+      "icon_id": "23343187",
+      "name": "点赞",
+      "font_class": "Dh-dianzan",
+      "unicode": "e688",
+      "unicode_decimal": 59016
+    },
+    {
+      "icon_id": "23343191",
+      "name": "合作",
+      "font_class": "Dh-hezuo",
+      "unicode": "e68c",
+      "unicode_decimal": 59020
+    },
+    {
+      "icon_id": "23343192",
+      "name": "工具",
+      "font_class": "Dh-gongju2",
+      "unicode": "e68d",
+      "unicode_decimal": 59021
+    },
+    {
+      "icon_id": "23343195",
+      "name": "旗帜",
+      "font_class": "Dh-qizhi",
+      "unicode": "e690",
+      "unicode_decimal": 59024
+    },
+    {
+      "icon_id": "23343198",
+      "name": "人事记录",
+      "font_class": "Dh-renshijilu",
+      "unicode": "e693",
+      "unicode_decimal": 59027
+    },
+    {
+      "icon_id": "23343199",
+      "name": "目标",
+      "font_class": "Dh-mubiao",
+      "unicode": "e694",
+      "unicode_decimal": 59028
+    },
+    {
+      "icon_id": "23343200",
+      "name": "时间",
+      "font_class": "Dh-shijian",
+      "unicode": "e695",
+      "unicode_decimal": 59029
+    },
+    {
+      "icon_id": "23343205",
+      "name": "销售冠军",
+      "font_class": "Dh-xiaoshouguanjun",
+      "unicode": "e69a",
+      "unicode_decimal": 59034
+    },
+    {
+      "icon_id": "23343206",
+      "name": "物联网",
+      "font_class": "Dh-wulianwang2",
+      "unicode": "e69b",
+      "unicode_decimal": 59035
+    },
+    {
+      "icon_id": "23343207",
+      "name": "物料",
+      "font_class": "Dh-wuliao2",
+      "unicode": "e69c",
+      "unicode_decimal": 59036
+    },
+    {
+      "icon_id": "23343208",
+      "name": "add-account",
+      "font_class": "Dh-add",
+      "unicode": "e69d",
+      "unicode_decimal": 59037
+    },
+    {
+      "icon_id": "23343209",
+      "name": "office-supplies-fill",
+      "font_class": "Dh-office-supplies",
+      "unicode": "e69e",
+      "unicode_decimal": 59038
+    },
+    {
+      "icon_id": "23343210",
+      "name": "下午茶、员工福利",
+      "font_class": "Dh-xiawucha",
+      "unicode": "e69f",
+      "unicode_decimal": 59039
+    },
+    {
+      "icon_id": "23343211",
+      "name": "指标、计划、方向",
+      "font_class": "Dh-zhibiao2",
+      "unicode": "e6a0",
+      "unicode_decimal": 59040
+    },
+    {
+      "icon_id": "23343212",
+      "name": "指标",
+      "font_class": "Dh-zhibiao4",
+      "unicode": "e6a1",
+      "unicode_decimal": 59041
+    },
+    {
+      "icon_id": "23343213",
+      "name": "图钉",
+      "font_class": "Dh-tuding",
+      "unicode": "e6a2",
+      "unicode_decimal": 59042
+    },
+    {
+      "icon_id": "23343214",
+      "name": "supplier-features-fill",
+      "font_class": "Dh-supplier-features",
+      "unicode": "e6a3",
+      "unicode_decimal": 59043
+    },
+    {
+      "icon_id": "23343215",
+      "name": "模板",
+      "font_class": "Dh-moban2",
+      "unicode": "e6a4",
+      "unicode_decimal": 59044
+    },
+    {
+      "icon_id": "23343216",
+      "name": "组织机构",
+      "font_class": "Dh-zuzhijigou",
+      "unicode": "e6a5",
+      "unicode_decimal": 59045
+    },
+    {
+      "icon_id": "23343217",
+      "name": "资金",
+      "font_class": "Dh-zijin",
+      "unicode": "e6a6",
+      "unicode_decimal": 59046
+    },
+    {
+      "icon_id": "23343218",
+      "name": "certified-supplier-fill",
+      "font_class": "Dh-certified-supplier",
+      "unicode": "e6a7",
+      "unicode_decimal": 59047
+    },
+    {
+      "icon_id": "23581915",
+      "name": "新闻",
+      "font_class": "Dh-xinwen",
+      "unicode": "e68f",
+      "unicode_decimal": 59023
+    },
+    {
+      "icon_id": "24323199",
+      "name": "对象类型-客户2",
+      "font_class": "duixiangleixing-kehu2",
+      "unicode": "e6e9",
+      "unicode_decimal": 59113
+    },
+    {
+      "icon_id": "24323233",
+      "name": "对象类型-指标群1",
+      "font_class": "duixiangleixing-zhibiaoqun1",
+      "unicode": "e70a",
+      "unicode_decimal": 59146
+    },
+    {
+      "icon_id": "3718747",
+      "name": "水滴",
+      "font_class": "shuidi",
+      "unicode": "e607",
+      "unicode_decimal": 58887
+    },
+    {
+      "icon_id": "15989504",
+      "name": "下拉框",
+      "font_class": "xialakuang",
+      "unicode": "e623",
+      "unicode_decimal": 58915
+    },
+    {
+      "icon_id": "29602546",
+      "name": "排行榜",
+      "font_class": "dmp-ranking",
+      "unicode": "e707",
+      "unicode_decimal": 59143
+    },
+    {
+      "icon_id": "23043840",
+      "name": "表格图表",
+      "font_class": "dmp-table",
+      "unicode": "e7af",
+      "unicode_decimal": 59311
+    },
+    {
+      "icon_id": "21208318",
+      "name": "办公",
+      "font_class": "menu-bangong",
+      "unicode": "e611",
+      "unicode_decimal": 58897
+    },
+    {
+      "icon_id": "21209884",
+      "name": "组织",
+      "font_class": "menu-zuzhi",
+      "unicode": "e619",
+      "unicode_decimal": 58905
+    },
+    {
+      "icon_id": "21466771",
+      "name": "客户",
+      "font_class": "menu-kehu",
+      "unicode": "e61c",
+      "unicode_decimal": 58908
+    },
+    {
+      "icon_id": "21466795",
+      "name": "物料",
+      "font_class": "menu-wuliao",
+      "unicode": "e61d",
+      "unicode_decimal": 58909
+    },
+    {
+      "icon_id": "21469438",
+      "name": "项目",
+      "font_class": "menu-xiangmu",
+      "unicode": "e61e",
+      "unicode_decimal": 58910
+    },
+    {
+      "icon_id": "21506935",
+      "name": "指标",
+      "font_class": "menu-zhibiao",
+      "unicode": "e621",
+      "unicode_decimal": 58913
+    },
+    {
+      "icon_id": "21553038",
+      "name": "工具",
+      "font_class": "menu-gongju",
+      "unicode": "e624",
+      "unicode_decimal": 58916
+    },
+    {
+      "icon_id": "21738654",
+      "name": "考勤管理",
+      "font_class": "menu-kaoqinguanli",
+      "unicode": "e626",
+      "unicode_decimal": 58918
+    },
+    {
+      "icon_id": "22485480",
+      "name": "考勤管理1",
+      "font_class": "menu-kaoqinguanli1",
+      "unicode": "e65a",
+      "unicode_decimal": 58970
+    },
+    {
+      "icon_id": "22485484",
+      "name": "工具1",
+      "font_class": "menu-gongju1",
+      "unicode": "e65e",
+      "unicode_decimal": 58974
+    },
+    {
+      "icon_id": "22485486",
+      "name": "物料1",
+      "font_class": "menu-wuliao1",
+      "unicode": "e660",
+      "unicode_decimal": 58976
+    },
+    {
+      "icon_id": "22485487",
+      "name": "业务1",
+      "font_class": "menu-yewu1",
+      "unicode": "e661",
+      "unicode_decimal": 58977
+    },
+    {
+      "icon_id": "22485488",
+      "name": "销售1",
+      "font_class": "menu-xiaoshou1",
+      "unicode": "e662",
+      "unicode_decimal": 58978
+    },
+    {
+      "icon_id": "22485493",
+      "name": "组织1",
+      "font_class": "menu-zuzhi1",
+      "unicode": "e667",
+      "unicode_decimal": 58983
+    },
+    {
+      "icon_id": "23343189",
+      "name": "金牌销售",
+      "font_class": "menu-jinpaixiaoshou",
+      "unicode": "e68a",
+      "unicode_decimal": 59018
+    },
+    {
+      "icon_id": "23343190",
+      "name": "供应商",
+      "font_class": "menu-gongyingshang2",
+      "unicode": "e68b",
+      "unicode_decimal": 59019
+    },
+    {
+      "icon_id": "23343196",
+      "name": "福利",
+      "font_class": "menu-fuli",
+      "unicode": "e691",
+      "unicode_decimal": 59025
+    },
+    {
+      "icon_id": "23343202",
+      "name": "品牌管理",
+      "font_class": "menu-pinpaiguanli",
+      "unicode": "e697",
+      "unicode_decimal": 59031
+    },
+    {
+      "icon_id": "23943134",
+      "name": "时间",
+      "font_class": "dmp-time",
+      "unicode": "f96a",
+      "unicode_decimal": 63850
+    },
+    {
+      "icon_id": "3862612",
+      "name": "折线面积图 ",
+      "font_class": "dmp-lin",
+      "unicode": "e618",
+      "unicode_decimal": 58904
+    },
+    {
+      "icon_id": "7587752",
+      "name": "统计图",
+      "font_class": "dmp-bar",
+      "unicode": "e60a",
+      "unicode_decimal": 58890
+    },
+    {
+      "icon_id": "14146193",
+      "name": "业绩面板",
+      "font_class": "dmp-card",
+      "unicode": "e639",
+      "unicode_decimal": 58937
+    },
+    {
+      "icon_id": "16656969",
+      "name": "统计图",
+      "font_class": "dmp-pie",
+      "unicode": "e726",
+      "unicode_decimal": 59174
+    },
+    {
+      "icon_id": "19701146",
+      "name": "图钉",
+      "font_class": "pushpin-fill",
+      "unicode": "eba2",
+      "unicode_decimal": 60322
+    },
+    {
+      "icon_id": "15644380",
+      "name": "图钉",
+      "font_class": "tuding",
+      "unicode": "e6ca",
+      "unicode_decimal": 59082
+    },
+    {
+      "icon_id": "29322330",
+      "name": "palette",
+      "font_class": "menu-palette",
+      "unicode": "e605",
+      "unicode_decimal": 58885
+    },
+    {
+      "icon_id": "29322328",
+      "name": "customer",
+      "font_class": "menu-customer",
+      "unicode": "e604",
+      "unicode_decimal": 58884
+    },
+    {
+      "icon_id": "29322327",
+      "name": "dmp",
+      "font_class": "menu-dmp",
+      "unicode": "e603",
+      "unicode_decimal": 58883
+    },
+    {
+      "icon_id": "29322300",
+      "name": "role",
+      "font_class": "role",
+      "unicode": "e602",
+      "unicode_decimal": 58882
+    }
+  ]
+}

BIN
src/assets/iconsvg/iconfont.ttf


BIN
src/assets/iconsvg/iconfont.woff


BIN
src/assets/iconsvg/iconfont.woff2


BIN
src/assets/images/error-image.png


BIN
src/assets/images/login-banner.png


BIN
src/assets/images/logo.png


+ 1 - 0
src/assets/vite.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>

+ 1 - 0
src/assets/vue.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="37.07" height="36" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 198"><path fill="#41B883" d="M204.8 0H256L128 220.8L0 0h97.92L128 51.2L157.44 0h47.36Z"></path><path fill="#41B883" d="m0 0l128 220.8L256 0h-51.2L128 132.48L50.56 0H0Z"></path><path fill="#35495E" d="M50.56 0L128 133.12L204.8 0h-47.36L128 51.2L97.92 0H50.56Z"></path></svg>

+ 176 - 0
src/components/FindHead/index.vue

@@ -0,0 +1,176 @@
+<template>
+  <div class="filter-box"  @keydown="handleKeyDown">
+    <div class="slot-header">
+      <slot name="header"></slot>
+    </div>
+    <div v-for="item in props.list" :key="item.key" class="filter-box-row">
+      <div :class="item.label?'filter-box-label':'filter-box-label-null'">{{ item.label }}</div>
+      <a-input
+        v-if="item.type == 'input'"
+        v-model="refData.findData[item.key]"
+        class="filter-box-input"
+        :placeholder="item.placeholder"
+        @input="(e) => onChangeFilterNumber(e, item)"
+      />
+
+      <a-select
+        v-if="item.type == 'select'"
+        v-model="refData.findData[item.key]"
+        class="filter-box-input"
+        style="width: 240px"
+        clearable
+        :placeholder="item.placeholder"
+        :default-value="item.defaultValue"
+        :multiple="item.multiple"
+        allow-clear
+      >
+      
+        <a-option
+          v-for="cItem in item.options"
+          :key="cItem[item?.keys?.key || 'key']"
+          :label="cItem[item?.keys.label || 'label']"
+          :value="cItem[item?.keys.key || 'key']"
+        />
+      </a-select>
+      <a-radio-group
+        v-if="item.type == 'radio'"
+        v-model="refData.findData[item.key]"
+        style="width: 280px"
+        @change="changeEvent(item.hasEvent)"
+      >
+        <a-radio v-for="cItem in item.options" :key="cItem.value" :value="cItem[item.value]">{{
+          cItem[item.label]
+        }}</a-radio>
+      </a-radio-group>
+
+      <a-range-picker
+        v-if="item.type == 'date-picker'"
+        v-model="refData.findData[item.key]"
+        class="filter-box-input"
+        style="max-width: 240px"
+        :show-time="!item.showTime"
+        :time-picker-props="{ defaultValue: ['00:00:00', '23:59:59'] }"
+        :format="item.showTime ? 'YYYY-MM-DD' : ' YYYY-MM-DD HH:mm:ss'"
+        @change="
+          (e) => {
+            evPicker(e, item.keys)
+          }
+        "
+      />
+    </div>
+    <div class="filter-box-row">
+      <a-button class="btn-open" type="primary" size="mini" @click="evInit">查询</a-button>
+      <a-button class="btn-open" size="mini" @click="evReset">重置</a-button>
+      <slot name="footer"></slot>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { onMounted, reactive } from 'vue'
+
+const props = defineProps({
+  list: {
+    type: Array,
+    required: true,
+  },
+})
+
+const emit = defineEmits(['onSearch'])
+const refData = reactive({
+  findData: {},
+})
+
+const evInit = () => {
+  emit('onSearch', refData.findData)
+}
+const handleKeyDown = (event)  =>{
+  if (event.code === 'Enter' || event.keyCode === 13) {
+    emit('onSearch', refData.findData)
+  }
+}
+
+const changeEvent = (hasEvent) => {
+  if (hasEvent) evInit()
+}
+const initDefault = () => {
+  props.list.forEach((item) => {
+    if (item?.defaultValue?.length > 0) {
+      refData.findData[item.key] = item?.defaultValue
+    }
+  })
+}
+const onChangeFilterNumber = (value, item) => {
+  if (item.verification && item.verification === 'number') {
+    refData.findData[item.key] = value.replace(/[^0-9,]/gi, '')
+  }
+}
+const evReset = () => {
+  refData.findData = {}
+  initDefault()
+  evInit()
+}
+const evPicker = (dateString, keys) => { 
+  refData.findData[keys[0]] = dateString[0]
+  refData.findData[keys[1]] = dateString[1]
+}
+onMounted(() => {
+  initDefault()
+})
+</script>
+
+<style lang="less" scoped>
+.filter-box {
+  display: flex;
+  flex-wrap: wrap;
+  padding: 0.8rem 0;
+  margin: 0.8rem 0;
+  background-color: @black_2;
+
+  &:last-of-type {
+    margin-bottom: 0;
+  }
+
+  .filter-box-row {
+    display: flex;
+    align-items: center;
+    margin: 0.2rem 0;
+  }
+
+  .filter-box-label {
+    text-align: right;
+    min-width: 0;
+    max-width: 6rem;
+    margin:0 1rem;
+  }
+  .filter-box-label-null{
+    text-align: right;
+    min-width: 0rem;
+    max-width: 0rem;
+    margin-right: 0.5rem;
+  }
+
+  .filter-box-input {
+    min-width: 240px;
+    max-width: 240px;
+  }
+  .btn-open {
+    margin-left: 1rem;
+  }
+}
+.slot-header {
+  width: 100%;
+}
+:deep(.arco-input-wrapper) {
+  background-color: @bg_color_2;
+}
+:deep(.arco-select-view-single) {
+  background-color: @bg_color_2;
+}
+:deep(.arco-picker) {
+  background-color: @bg_color_2;
+}
+:deep(.arco-select-view-multiple.arco-select-view-size-medium) {
+  background-color: @bg_color_2;
+}
+</style>

+ 30 - 0
src/components/Layout/Layout.vue

@@ -0,0 +1,30 @@
+<template>
+  <div class="app-container-layout">
+    <Layout />
+  </div>
+</template>
+
+<script setup>
+import { onMounted, computed } from "vue"
+import LayoutComponents from "./components"
+import { useSystemStore } from '@/store/modules/systemStore'
+
+const systemStore = useSystemStore()
+
+const Layout = computed(()=>{
+  return LayoutComponents[systemStore.getLayout]
+})
+
+</script>
+
+<style scoped lang="less">
+.app-container-layout {
+	width: 100%;
+	height: 100vh;
+  margin: 0;
+	max-height: 100vh;
+	display: flex;
+	flex-direction: row;
+  overflow: hidden;
+}
+</style>

+ 6 - 0
src/components/Layout/components/index.js

@@ -0,0 +1,6 @@
+import menu from './layout/menu.vue'
+
+
+export default {
+  menu
+}

+ 295 - 0
src/components/Layout/components/layout/menu.vue

@@ -0,0 +1,295 @@
+<template>
+  <a-layout style="min-height: 100vh">
+    <a-layout-sider theme="dark" :width="160" :collapsed-width="50" collapsible :trigger="null"
+      @collapse="evMenuSecondLongShow" v-model:collapsed="menuSecondLongShow">
+      <div class="logo-layout">
+        <div class="logo">
+          <img src="@/assets/images/logo.png" style="height: 26px; width: 26px;" />
+          <h3 v-if="!menuSecondLongShow" style="margin-left: 10px;"> Easy life</h3>
+        </div>
+      </div>
+
+      <a-menu v-model:selectedKeys="menuTabSate" theme="dark" mode="inline" @mouseleave="evMouseleaveMenu">
+        <a-menu-item v-for="routeItem in routesData" :key="routeItem.name"
+          @mouseenter="evMenuGetFn(routeItem, 'mouseenter')" @click="changeRoutesItems(routeItem)">
+          <template #icon>
+            <svg-icon :icon="routeItem.meta.icon"></svg-icon>
+          </template>
+          <span>{{ routeItem.meta.title }}</span>
+        </a-menu-item>
+      </a-menu>
+    </a-layout-sider>
+
+    <a-layout>
+      <a-layout-header class="layout-header">
+        <LayoutHeader />
+      </a-layout-header>
+      <a-layout>
+        <a-layout-sider id="layout-sider" :collapsed="false" :width="menuSecondData &&
+          menuSecondData.children &&
+          menuSecondData.children.length > 0
+          ? 160
+          : 0
+          " @mouseleave="evMouseLeavesSubMenu">
+          <a-menu :selectedKeys="routeItemSelectedKeys" id="layout-sider" theme="light" mode="vertical"
+            :collapsed="false" :auto-open="true">
+            <template v-for="routeItem in menuSecondData?.children || []">
+              <a-menu-item v-if="!routeItem.children || routeItem.children.length === 0"
+                :key="routeItem.name?.toString()" @click="evGoPage(routeItem)">
+                <span class="menu-level-font">{{ routeItem.meta.title }}</span>
+              </a-menu-item>
+
+              <template v-else-if="routeItem.children && routeItem.children.length > 0">
+                <sub-menu :key="routeItem.name" :menu-info="routeItem" @go="evGoPage" />
+              </template>
+            </template>
+          </a-menu>
+        </a-layout-sider>
+
+        <main class="layout-content-main">
+          <router-view v-slot="{ Component }" class="layout-content-router">
+            <component :is="Component" key="Layout" />
+          </router-view>
+        </main>
+      </a-layout>
+    </a-layout>
+  </a-layout>
+</template>
+<script setup>
+import { ref, computed, h, reactive, onMounted, watch, nextTick } from "vue";
+import { useRoute, useRouter } from "vue-router";
+import { useSystemStore } from "@/store/modules/systemStore";
+import LayoutHeader from "@/components/Layout/components/layoutHeader/index.vue";
+import subMenu from "@/components/Layout/components/subMenu/index.vue";
+import { RouterTagData } from '@/store/modules/routerTag.js'
+
+// 标签页仓库
+const settingStore = RouterTagData()
+
+const systemStore = useSystemStore();
+
+const route = useRoute();
+const router = useRouter();
+
+const menuSecondLongShow = ref(systemStore.menuSecondLongShow);
+// 主菜单
+const routesData = router.options.routes[0]?.children || [];
+
+const menuTabSate = ref([systemStore.getMenuTabSate || routesData[0].name]);
+//子菜单
+const menuSecondData = ref(systemStore.getRouteItem);
+// 选中的状态路由列表
+const menuSecondSelectedStatusData = ref(systemStore.getRouteItem);
+const routeItemSelectedKeys = ref();
+
+const evMenuSecondLongShow = () => {
+  systemStore.setStateValue({
+    key: "menuSecondLongShow",
+    value: menuSecondLongShow.value ? 1 : 0,
+    localStorage: true,
+  });
+};
+const evMouseleaveMenu = (e) => {
+  if (
+    e.relatedTarget?.offsetParent?.id &&
+    e.relatedTarget?.offsetParent?.id == "layout-sider"
+  )
+    return;
+  menuSecondData.value = menuSecondSelectedStatusData.value;
+};
+// 子菜单
+const evMouseLeavesSubMenu = () => {
+  menuSecondData.value = menuSecondSelectedStatusData.value;
+};
+// 鼠标滑动上去更新菜单栏 目前先屏蔽
+const evMenuGetFn = (routeItem, type) => {
+  if (menuSecondLongShow.value) {
+    menuSecondData.value = routeItem;
+  }
+};
+
+// 查找最下级
+const findPath = (data) => {
+  if (data.children && data.children.length > 0) {
+    return findPath(data.children[0]);
+  } else {
+    return data;
+  }
+};
+
+// 主路由 状态
+const changeRoutesItems = (e) => {
+  const item = findPath(e);
+  evGoPage(item);
+};
+
+// 跳转路由
+const evGoPage = async (routeItem) => {
+  // settingStore.tagsPushData(routeItem);
+  await router.push({
+    name: routeItem.name,
+  });
+  menuTabSate.value = [route.matched[1].name];
+  systemStore.setStateValue({
+    key: "menuTabSate",
+    value: menuTabSate.value[0] || "",
+    localStorage: true,
+  });
+
+  menuSecondSelectedStatusData.value = routesData.find(
+    (item) => item.name == menuTabSate.value
+  );
+  menuSecondData.value = menuSecondSelectedStatusData.value;
+  systemStore.setStateValue({
+    key: "routeItem",
+    value: JSON.stringify(menuSecondData.value),
+    localStorage: true,
+  });
+};
+
+watch(
+  route,
+  (val) => {
+    if (val.name) {
+      routeItemSelectedKeys.value = [val.name];
+    }
+  },
+  { immediate: true }
+);
+</script>
+<style scoped lang="less">
+.layout-header {
+  height: 48px;
+  background: @bg_color_2;
+  // padding-inline: 10px;
+  box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);
+  z-index: 9;
+}
+
+.ant-layout-content {
+  height: auto;
+  min-height: auto;
+  overflow-y: auto;
+  padding: 0 20px;
+}
+
+.layout-content-main {
+  flex: 1;
+  padding: 0 1.2rem 1.6rem 1.2rem;
+  margin: 1.1rem 0 0rem 0;
+  overflow-y: auto;
+  overflow: overlay;
+  height: 95%;
+  display: flex;
+  flex-wrap: wrap;
+}
+
+.logo-layout {
+  height: 64px;
+  color: #fff;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+
+  .logo {
+    width: 100%;
+    height: 32px;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+
+    h3 {
+      white-space: nowrap;
+    }
+  }
+}
+
+.arco-layout {
+  color: @text_color_1;
+  background: @layout-split-color !important;
+  overflow: hidden;
+}
+
+:deep(.arco-menu-light) {
+  background-color: @bg_color_3;
+
+  .arco-menu-item {
+    background-color: @bg_color_3;
+  }
+}
+
+:deep(.arco-layout-sider-light) {
+  background-color: @bg_color_3;
+}
+
+:deep(.arco-menu-inline-header) {
+  font-weight: 600;
+  color: @text_color_1;
+  background-color: @bg_color_3;
+}
+
+:deep(.layout-content-router) {
+  padding: 0 1rem 1rem 1rem;
+  background-color: @bg_color_4;
+  box-sizing: border-box;
+  width: 100%;
+}
+
+:deep(.arco-menu-inline-content) {
+  .arco-menu-selected {
+    color: @text_color_1;
+    background-color: @black_3;
+
+    &:after {
+      content: none;
+    }
+  }
+}
+
+#layout-sider {
+  :deep(.arco-menu-selected) {
+    color: @text_color_1 !important;
+    font-weight: bold;
+    background-color: @black_3;
+
+    .arco-icon {
+      color: @text_color_1 !important;
+    }
+
+    &:hover {
+      background-color: rgba(235, 19, 19, 0.1) !important;
+    }
+  }
+
+  :deep(.arco-menu-inline) {
+    .arco-menu-inline-header {
+      background-color: @bg_color_3;
+      padding-left: 20px;
+      left: 5px;
+
+      svg {
+        color: @text_color_1 !important;
+        font-size: 14px;
+      }
+
+      .arco-menu-icon-suffix {
+        color: @text_color_1 !important;
+        left: 0px !important;
+        right: auto;
+      }
+
+      &:hover {
+        background-color: rgba(255, 255, 255, 0) !important;
+      }
+    }
+
+    .arco-menu-item {
+      padding: 0 5px;
+    }
+  }
+
+  :deep(.arco-menu-item) {
+    padding-left: 24px;
+  }
+}
+</style>

+ 188 - 0
src/components/Layout/components/layoutHeader/index.vue

@@ -0,0 +1,188 @@
+<template>
+  <div class="header" >
+    <div class="layout_header">
+      <!-- 面包屑 -->
+      <div class="flex_item_bread">
+        <a-breadcrumb >
+          <a-breadcrumb-item v-for="(item, index) in itemBreabucm" :key="index">{{ item }}</a-breadcrumb-item>
+        </a-breadcrumb>
+      </div>
+      <!--    个人信息和操作-->
+      <div class="flex-right-user">
+        <a-select :style="{ width: '100px' }" v-model="langStore.lang" :bordered="false" @change="toggleLang">
+          <a-option v-for="item in langList" :key="item.key" :value="item.key">{{ item.label }}</a-option>
+        </a-select>
+
+        <div class="toggle-theme-box">
+          <icon-sun-fill v-if="designStore.getDarkTheme" @click="toggleTheme(false)" :size="18" />
+          <icon-moon-fill v-else @click="toggleTheme(true)" :size="18" />
+        </div>
+
+        <a-dropdown trigger="click">
+          <div class="userInform">
+            <a-avatar :size="38" class="avatar-body">
+              <img class="avatar-image" alt="avatar" src="https://avatars.githubusercontent.com/u/39849555?v=4" />
+            </a-avatar>
+            <div class="userName">{{ userInfor?.username }}</div>
+          </div>
+          <template #content>
+            <a-doption>
+              <a-space @click="evHandleLogout">
+                <icon-export />
+                <span>{{ $t('global.logOut') }}</span>
+              </a-space>
+            </a-doption>
+          </template>
+        </a-dropdown>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { ref, inject, onMounted, watch, reactive, defineEmits } from 'vue'
+import { useRouter, useRoute } from 'vue-router'
+import { useSystemStore } from '@/store/modules/systemStore'
+import { Notification } from '@arco-design/web-vue'
+import { useDesignStore } from '@/store/modules/designStore'
+import { useLangStore } from '@/store/modules/langStore'
+import { useI18n } from 'vue-i18n'
+import { langList } from '@/i18n'
+import { fn_logout } from '@/utils'
+import { updateRouteByMenu } from "@/router/router.update.js"
+import { layoutSetting } from '@/store/modules/layoutSetting'
+import { RouterTagData } from '@/store/modules/routerTag.js'
+const LayoutStore = layoutSetting()
+const router = useRouter()
+const route = useRoute()
+const { locale } = useI18n()
+const systemStore = useSystemStore()
+const designStore = useDesignStore()
+const langStore = useLangStore()
+const userInfor = ref(null)
+const SettingVisible = ref(false)
+const routesData = router.options.routes[0]?.children || [];
+const itemBreabucm = ref([])
+const routerTagData = RouterTagData()
+const toggleTheme = (e) => {
+  designStore.changeTheme(e)
+}
+const toggleLang = async (e) => {
+  langStore.changeLang(e)
+  locale.value = langStore.lang
+  await updateRouteByMenu(router, systemStore)
+  router.go(0)
+}
+const evHandleLogout = () => {
+  Notification.success({
+    content: '退出成功!',
+    duration: 1000,
+  })
+  // 清除缓存数据
+  fn_logout()
+  router.push({
+    name: "login",
+  })
+}
+
+// 获取当前路由菜单
+const AcquireRouterItem = (item) => {
+  itemBreabucm.value = [];
+  function recursiveFindRoute(routes, parentTitles = []) {
+    for (const route of routes) {
+      const currentTitles = [...parentTitles];
+      currentTitles.push(route.meta.title);
+      if (route.path === item) {
+        return currentTitles;
+      }
+      if (route.children && route.children.length > 0) {
+        const result = recursiveFindRoute(route.children, currentTitles);
+        if (result.length > 0) {
+          return result;
+        }
+      }
+    }
+    return [];
+  }
+
+  const result = recursiveFindRoute(routesData);
+  if (result.length > 0) {
+    itemBreabucm.value = result;
+  }
+};
+
+watch(route, val => {
+  AcquireRouterItem(val.path)
+}, { immediate: true })
+
+// watch(() => LayoutStore.setting.HeadNavigationBar, val => {
+//   if (val && routerTagData.tagData.length == 0) {
+//     routesData.forEach(res => {
+//       if (res.name == route.name) {
+//         routerTagData.tagData.push(res)
+//       } else {
+//         if (res.children && res.children.length !== 0) {
+//           res.children.forEach(child => {
+//             if (child.name == route.name) {
+//               routerTagData.tagData.push(child)
+//             }
+//           })
+//         }
+//       }
+//     })
+//   }
+// }, { immediate: true })
+
+onMounted(() => {
+  userInfor.value = JSON.parse(localStorage.getItem('user_login_information'))
+})
+
+</script>
+
+<style scoped lang="less">
+.userInform{
+  display: flex;
+  align-items: center;
+  cursor: pointer;
+}
+.layout_header {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding: 0 10px;
+  height: 50px;
+}
+
+.flex-right-user {
+  width: auto;
+  display: flex;
+  align-items: center;
+}
+
+.avatar-body {
+  :deep(.arco-avatar-image) {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+  }
+
+  .avatar-image {
+    border-radius: 50%;
+    width: 34px;
+    height: 34px;
+  }
+}
+
+.toggle-theme-box {
+  margin-right: 0.8rem;
+}
+
+:deep(.arco-select-view-suffix) {
+  padding: 0;
+}
+
+.userName {
+  margin-left: 10px;
+  font-size: 16px;
+}
+</style>

+ 254 - 0
src/components/Layout/components/setting/index.vue

@@ -0,0 +1,254 @@
+<template>
+    <a-drawer :width="320" :visible="visible" unmountOnClose @cancel="close" :footer="false">
+        <div>
+            <a-divider>布局样式</a-divider>
+            <div class="menu_item">
+                <div class="item_floter">
+                    <a-row :gutter="6" justify="space-around">
+                        <a-col :span="12">
+                            <div class="layout-drawer-content-item" @click="LayoutStore.handelLayoutStyle(0)" :style="{border:LayoutStore.setting.laoutStyle==0?'1px solid #0256FF':''}">
+                                <div class="menu"></div>
+                                <div class="layout">
+                                    <div class="header"></div>
+                                    <div class="main"></div>
+                                </div>
+                            </div>
+                        </a-col>
+                        <a-col :span="12">
+                            <div class="layout-drawer-content-item" @click="LayoutStore.handelLayoutStyle(1)" :style="{border:LayoutStore.setting.laoutStyle==1?'1px solid #0256FF':''}">
+                                <div class="menu mr5"></div>
+                                <div class="menu aside"></div>
+                                <div class="layout mr8">
+                                    <div class="header"></div>
+                                    <div class="main"></div>
+                                </div>
+                            </div>
+                        </a-col>
+                    </a-row>
+                </div>
+            </div>
+
+            <div class="Interface_setting">
+                <a-divider>界面设置</a-divider>
+
+                <a-row class="grid-demo" justify="space-between">
+                    <a-col :span="12">
+                        <div>主题</div>
+                    </a-col>
+                    <a-col :span="12">
+                        <div class="area">
+                            <a-select :style="{ width: 'auto' }" @change="SwitchTopic" v-model="theme">
+                                <a-option :value="false">暗黑</a-option>
+                                <a-option :value="true">白色</a-option>
+                            </a-select>
+                        </div>
+                    </a-col>
+                </a-row>
+                <a-row class="grid-demo" justify="space-between" align="">
+                    <a-col :span="12">
+                        <div>语言</div>
+                    </a-col>
+                    <a-col :span="12">
+                        <div class="area">
+                            <a-select :style="{ width: 'auto' }" v-model="langStore.lang" @change="toggleLang">
+                                <a-option v-for="item in langList" :key="item.key" :value="item.key">{{
+                                    item.label}}</a-option>
+                            </a-select>
+                        </div>
+                    </a-col>
+                </a-row>
+                <a-row class="grid-demo" justify="space-between" align="">
+                    <a-col :span="12">
+                        <div>面包屑</div>
+                    </a-col>
+                    <a-col :span="12">
+                        <div class="area">
+                            <a-switch v-model="crumbs" @change="LayoutStore.handelCrumbs" />
+                        </div>
+                    </a-col>
+                </a-row>
+                <!-- <a-row class="grid-demo" justify="space-between" align="">
+                    <a-col :span="12">
+                        <div>面包屑图标</div>
+                    </a-col>
+                    <a-col :span="12">
+                        <div class="area">
+                            <a-switch v-model="BreadcrumbIcon" @change="LayoutStore.handelBreadcrumbIcon"/>
+                        </div>
+                    </a-col>
+                </a-row> -->
+                <a-row class="grid-demo" justify="space-between" align="">
+                    <a-col :span="12">
+                        <div>侧边栏Logo</div>
+                    </a-col>
+                    <a-col :span="12">
+                        <div class="area">
+                            <a-switch v-model="SidebarLogo" @change="LayoutStore.handelSidebarLogo"/>
+                        </div>
+                    </a-col>
+                </a-row>
+                <a-row class="grid-demo" justify="space-between" align="">
+                    <a-col :span="12">
+                        <div>头部导航栏</div>
+                    </a-col>
+                    <a-col :span="12">
+                        <div class="area">
+                            <a-switch v-model="HeadNavigationBar" @change="LayoutStore.handelHeadNavigationBar"/>
+                        </div>
+                    </a-col>
+                </a-row>
+            </div>
+        </div>
+    </a-drawer>
+</template>
+
+<script setup>
+import { ref, onMounted, toRefs, defineProps, defineEmits } from 'vue';
+import { langList } from '@/i18n'
+import { useI18n } from 'vue-i18n'
+import { useRouter } from 'vue-router'
+import { useLangStore } from '@/store/modules/langStore'
+import { useDesignStore } from '@/store/modules/designStore'
+import { updateRouteByMenu } from "@/router/router.update.js"
+import { useSystemStore } from '@/store/modules/systemStore'
+import { layoutSetting } from '@/store/modules/layoutSetting'
+const LayoutStore = layoutSetting()
+const systemStore = useSystemStore()
+const { locale } = useI18n()
+const langStore = useLangStore()
+const designStore = useDesignStore()
+const router = useRouter()
+const props = defineProps({
+    visible: {
+        type: Boolean,
+        default: false,
+    },
+});
+
+const { visible } = toRefs(props)
+
+const emits = defineEmits(['update:visible']);
+
+const state = ref({
+    theme: designStore.getDarkTheme,// 主题色
+    crumbs: LayoutStore.getStore.crumbs,     //面包屑
+    BreadcrumbIcon: LayoutStore.getStore.BreadcrumbIcon, // 面包屑图标
+    SidebarLogo: LayoutStore.getStore.SidebarLogo, // 侧边栏Logo
+    HeadNavigationBar: LayoutStore.getStore.HeadNavigationBar, // 头部导航栏
+})
+
+const { theme, crumbs, BreadcrumbIcon, SidebarLogo, HeadNavigationBar } = toRefs(state.value)
+
+// 多语言切换
+const toggleLang = async (e) => {
+    langStore.changeLang(e)
+    locale.value = langStore.lang
+    await updateRouteByMenu(router, systemStore)
+    router.go(0)
+}
+
+// 切换主题
+const SwitchTopic = (e) => {
+    designStore.changeTheme(e)
+}
+
+
+//面包屑
+const changeCrumbs = (e) => {
+    LayoutStore.handelCrumbs(e)
+}
+
+const close = ()=>{
+    LayoutStore.saveLayoutDisposition()
+    emits('update:visible',false)
+}
+
+onMounted(() => {
+})
+
+</script>
+<style lang="less" scoped>
+h3 {
+    text-align: center;
+}
+
+.menu_item {
+
+    .layout-drawer-content-item {
+        box-shadow: 0 2px 5px 0 rgba(0, 0, 0, .08);
+        display: flex;
+        padding: 6px;
+        width: auto;
+        border-radius: 6px;
+        cursor: pointer;
+        border: 1px solid transparent;
+
+
+        &:hover {
+            border: 1px solid #0256FF;
+            transition: all 0.5s linear;
+        }
+
+        .menu {
+            background: #0256ff;
+            width: 17px;
+            height: auto;
+            border-radius: 2px;
+        }
+
+        .mr5 {
+            width: 10px;
+        }
+
+        .aside {
+            margin-left: 5px;
+            width: 17px;
+            background: #80aaff;
+        }
+
+        .layout {
+            margin-left: 5px;
+            width: 100%;
+
+            .header {
+                background: #b3c0d1;
+                width: 100%;
+                height: 14px;
+                border-radius: 2px;
+            }
+
+            .main {
+                width: 100%;
+                height: 39px;
+                background-color: #e9eef3;
+                border: 1px dashed #0256FF;
+                border-radius: 2px;
+                margin-top: 10px;
+            }
+        }
+
+        .mr8 {
+            .header {
+                width: auto;
+            }
+
+            .main {
+                width: auto;
+            }
+        }
+    }
+}
+
+.Interface_setting {
+    margin-top: 40px;
+
+    .area {
+        display: flex;
+        justify-content: flex-end;
+    }
+
+    .grid-demo {
+        margin-bottom: 20px;
+    }
+}
+</style>

+ 33 - 0
src/components/Layout/components/subMenu/index.vue

@@ -0,0 +1,33 @@
+<template>
+  <a-sub-menu>
+    <template #title>
+      <span>{{ props.menuInfo.meta.title }}</span>
+    </template>
+        <a-menu-item
+          v-for="item in props.menuInfo.children"
+          :key="item.name"
+          class="a-menu-item"
+          @click="evGoPage(item)"
+        >
+          <span>{{  item.meta.title }}</span>
+        </a-menu-item>
+  </a-sub-menu>
+</template>
+
+<script setup>
+const props = defineProps({
+  menuInfo: {
+    type: Object,
+    required: true,
+  },
+})
+
+const emit = defineEmits(['go'])
+
+const evGoPage = (data) => {
+  emit('go', data)
+}
+defineExpose({
+  evGoPage,
+})
+</script>

+ 113 - 0
src/components/MonacoEditor/index.vue

@@ -0,0 +1,113 @@
+<template>
+  <div ref="editorContainer" class="editor-container"></div>
+</template>
+
+<script setup>
+import * as monaco from "monaco-editor";
+import { ref, watch, onMounted, onBeforeUnmount } from "vue";
+
+import jsonWorker from "monaco-editor/esm/vs/language/json/json.worker?worker";
+import cssWorker from "monaco-editor/esm/vs/language/css/css.worker?worker";
+import htmlWorker from "monaco-editor/esm/vs/language/html/html.worker?worker";
+import tsWorker from "monaco-editor/esm/vs/language/typescript/ts.worker?worker";
+import EditorWorker from "monaco-editor/esm/vs/editor/editor.worker?worker";
+
+self.MonacoEnvironment = {
+  getWorker(_, label) {
+    if (label === "json") {
+      return new jsonWorker();
+    }
+    if (["css", "scss", "less"].includes(label)) {
+      return new cssWorker();
+    }
+    if (["html", "handlebars", "razor"].includes(label)) {
+      return new htmlWorker();
+    }
+    if (["typescript", "javascript"].includes(label)) {
+      return new tsWorker();
+    }
+    return new EditorWorker();
+  },
+};
+
+const props = defineProps({
+  language: {
+    type: String,
+    default: 'json'
+  },
+  modelValue: {
+    type: String,
+    default: ''
+  },
+});
+
+let editor;
+const editorContainer = ref(null);
+const emit = defineEmits(['update:modelValue']);
+
+watch(() => props.modelValue, (newValue) => {
+  if (editor) {
+    const value = editor.getValue();
+    if (newValue !== value) {
+        editor.setValue(newValue);
+      }
+    }
+  }
+);
+
+
+
+
+onMounted(() => {
+  editor = monaco.editor.create(editorContainer.value, {
+    value: props.modelValue,
+    language:  props.language,
+    theme: 'vs',
+    folding: true, // 是否折叠
+    foldingHighlight: true, // 折叠等高线
+    foldingStrategy: "indentation", // 折叠方式  auto | indentation
+    showFoldingControls: "always", // 是否一直显示折叠 always | mouseover
+    disableLayerHinting: true, // 等宽优化
+    emptySelectionClipboard: false, // 空选择剪切板
+    selectionClipboard: false, // 选择剪切板
+    automaticLayout: true, // 自动布局
+    codeLens: false, // 代码镜头
+    scrollBeyondLastLine: false, // 滚动完最后一行后再滚动一屏幕
+    colorDecorators: true, // 颜色装饰器
+    accessibilitySupport: "off", // 辅助功能支持  "auto" | "off" | "on"
+    lineNumbers: "on", // 行号 取值: "on" | "off" | "relative" | "interval" | function
+    lineNumbersMinChars: 5, // 行号最小字符   number
+    readOnly: false, //是否只读  取值 true | false
+    tabSize: 2,
+    roundedSelection: true,
+    // 滚动条
+    scrollbar: {
+      verticalScrollbarSize: 8,
+      horizontalScrollbarSize: 8,
+    },
+  });
+  // 监听值的变化
+  editor.onDidChangeModelContent(() => {
+    const value = editor.getValue() //给父组件实时返回最新文本
+    console.log(value)
+    emit('update:modelValue', value)
+    // emit('change', value)
+  })
+
+});
+
+onBeforeUnmount(() => {
+  // 卸载IDE
+  editor.dispose();
+});
+</script>
+
+<style lang="less" scoped>
+.editor-container {
+  height: 150px;
+  width: 100%;
+  border: 1px solid #cecece;
+  padding: 20px 10px;
+  box-sizing: border-box;
+}
+</style>

+ 161 - 0
src/components/Search/index.vue

@@ -0,0 +1,161 @@
+<template>
+    <div class="search">
+        <!-- 动态渲染表单项 -->
+        <div class="Form">
+            <a-form :model="formState" layout="inline">
+                <a-form-item v-for="(item, index) in showIcon ? data : InitialData" :key="index" :label="item.label"
+                    :field="item.field" :wrapper-col-style="{ marginBottom: '20px' }">
+                    <component :is="'a-' + item.type" v-model="formState[item.field]" item.Custom
+                        :placeholder="item.type == 'input' ? '请输入' : '请选择' + item.label" allow-clear
+                        :style="{ width: item.width ? item.width + 'px' : '' }">
+                        <template v-if="item.type == 'select'">
+                            <a-option v-for="option in item.options" :key="option.value" :value="option.value">
+                                {{ option.label }}
+                            </a-option>
+                        </template>
+                    </component>
+                </a-form-item>
+                <a-form-item>
+                    <a-button type="primary" @click="handleQuery">查询</a-button>
+                    <a-button @click="handleReset" style="margin-left: 10px;">重置</a-button>
+                    <div v-if="show" @click="showIcon = !showIcon" class="icon">
+                        {{ showIcon ? '折叠' : '展开' }} <icon-down :rotate="showIcon ? 180 : 0" />
+                    </div>
+                </a-form-item>
+            </a-form>
+        </div>
+    </div>
+</template>
+
+<script setup>
+import { ref, defineProps, toRefs, watch, defineEmits } from 'vue';
+import { Getdictionary } from "@/mixins/index.js";
+
+// 接收 props
+const props = defineProps({
+    SearchForm: {
+        type: Array,
+        default: () => [
+            {
+                type: 'input',
+                label: '字典名称',
+                field: 'source',
+                value: '',
+            },
+            {
+                type: 'input',
+                label: '资费ID',
+                field: 'trafficId',
+                value: '',
+            },
+            {
+                type: 'select',
+                label: '卡类型',
+                field: 'simType',
+                options: [],
+                dict: 'CardType',
+                value: '',
+                width: '200'
+            },
+        ],
+    },
+});
+
+const { SearchForm } = toRefs(props);
+
+// 用于存储原始SearchForm数据的副本
+const originalSearchForm = ref([]);
+// 分割完成的数据
+const InitialData = ref([]);
+const show = ref(false);
+const showIcon = ref(false);
+const formState = ref({});
+const data = ref([]);
+
+const emit = defineEmits(['query']);
+
+// 在组件创建时,拷贝原始SearchForm数据
+watch(() => props.SearchForm, () => {
+    originalSearchForm.value = JSON.parse(JSON.stringify(props.SearchForm));
+}, { immediate: true });
+
+SearchForm.value.forEach(item => {
+    formState.value[item.field] = item.value;
+});
+
+// 字典加载
+const loadedDicts = ref({});
+const loadDictOptions = async (index, dict) => {
+    if (loadedDicts.value[dict]) {
+        SearchForm.value[index].options = loadedDicts.value[dict];
+        return;
+    }
+    const dictionary = await Getdictionary(dict);
+    loadedDicts.value[dict] = dictionary || [];
+    SearchForm.value[index].options = loadedDicts.value[dict];
+    originalSearchForm.value[index].options = loadedDicts.value[dict];
+};
+
+watch(
+    () => SearchForm.value,
+    async () => {
+        for (let index = 0; index < SearchForm.value.length; index++) {
+            const item = SearchForm.value[index];
+            if (item.dict && !loadedDicts.value[item.dict]) {
+                await loadDictOptions(index, item.dict);
+            }
+        }
+        // 如果当前长度超过5条就需要折叠展开
+        if (SearchForm.value.length >6) {
+            show.value = true;
+        }
+        // 初始化切割数组,使用原始SearchForm数据的副本进行操作
+        InitialData.value = originalSearchForm.value.splice(0, 6);
+        data.value = [...InitialData.value, ...originalSearchForm.value];
+    },
+    { immediate: true }
+);
+
+// 查询操作
+const handleQuery = () => {
+    emit('query', formState.value);
+};
+
+const handleReset = () => {
+    const newFormState = {};
+    SearchForm.value.forEach(item => {
+        if (typeof item.value === 'string') {
+            newFormState[item.field] = '';
+        } else if (Array.isArray(item.value)) {
+            newFormState[item.field] = [];
+        } else if (typeof item.value === 'object') {
+            newFormState[item.field] = {};
+        }
+    });
+    formState.value = newFormState;
+    emit('reset', formState.value);
+};
+
+
+</script>
+
+<style lang="less" scoped>
+.search {
+    display: flex;
+    justify-content: space-between;
+}
+
+.Form {
+    width: 95%;
+}
+
+.icon {
+    display: flex;
+    // align-items: center;
+    color: #3491fa;
+    font-size: 15px;
+    cursor: pointer;
+    font-weight: 600;
+    margin-left: 15px;
+}
+</style>

+ 43 - 0
src/components/Svg-icon/SvgIcon.vue

@@ -0,0 +1,43 @@
+<template>
+  <svg :class="svgClass" :aria-hidden="true">
+    <use :xlink:href="iconName" />
+  </svg>
+</template>
+
+<script setup>
+import { computed } from 'vue'
+
+const props = defineProps({
+  iconClass: {
+    type: String,
+  },
+  icon: {
+    // iconfont 库
+    type: String,
+  },
+  className: {
+    type: String,
+    default: '',
+  },
+})
+
+const iconName = computed(() => {
+  return props.icon ? `#${props.icon}` : `#icon-${props.iconClass}`
+})
+const svgClass = computed(() => {
+  if (props.className) {
+    return `svg-icon${props.className}`
+  }
+  return 'svg-icon'
+})
+</script>
+
+<style scoped lang="less">
+.svg-icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+</style>

+ 88 - 0
src/components/XmSelect/index.vue

@@ -0,0 +1,88 @@
+<template>
+    <a-select :style="{ width: '320px' }" v-model="selectValue" :placeholder="placeholder" @change="selectChange">
+        <a-option v-for="item in selectList" :key="item.value" :value="item[selectOpiton.value]"
+            :label="item[selectOpiton.label]"></a-option>
+    </a-select>
+</template>
+<script setup>
+import { onMounted, ref, computed, watch, h } from "vue";
+import _ from 'lodash'
+
+const props = defineProps({
+    dataList: {
+        type: Array,
+
+    },
+    placeholder: {
+        type: String,
+        default: "请输入"
+    },
+    dictKey: {
+        type: String
+    },
+    modelValue: {
+        type: [String, Number],
+        default: ""
+    },
+    selectType: {
+        type: [String, Number],
+        default: 1
+    },
+    // 下拉框的label及value
+    selectOpiton: {
+        type: Object,
+        default: () => ({
+            label: 'label',
+            value: 'id'
+        })
+    },
+    listRequest: {
+        type: Function,
+    },
+
+});
+
+
+const emits = defineEmits(['update:modelValue', 'change'])
+
+const selectList = computed(() => {
+
+    if (props.selectType == 1) {
+        return props.dataList
+    }
+    if (props.selectType == 2) {
+        props.listRequest.then(res => {
+            const data = res.data
+
+            if (Array.isArray(data) && data.length > 0) {
+                return data
+            }
+            if (data.records && Array.isArray(data.records) && data.records.length > 0) {
+                return data.records
+            }
+        })
+        return []
+    }
+    return []
+
+})
+
+/**
+ * 双向绑定的值
+ */
+const selectValue = computed(() => {
+    return props.modelValue || ""
+})
+
+
+const selectChange = (data) => {
+    const val = props.selectOpiton.value
+    const item = _.find(selectList.value, [val, data])
+    if (val) {
+        emits('update:modelValue', item[val])
+    }
+
+    emits('change', item)
+}
+
+</script>

+ 159 - 0
src/components/upload/index.vue

@@ -0,0 +1,159 @@
+<template>
+  <a-upload :show-file-list="true" :custom-request="handelUpload == null ? customRequest : handelUpload"
+    :list-type="listType" :file-list="fileList" :limit="minx" @before-remove="beforeRemove" :show-remove-button="showRemoveButton" :show-cancel-button="false"
+    :image-preview="imagePreview" :accept="accept" @before-upload="beforeUpload" />
+</template>
+
+<script setup>
+import { toRef, ref, watch, watchEffect, onMounted } from 'vue';
+import { useSystemStore } from '@/store/modules/systemStore';
+import { Modal } from "@arco-design/web-vue";
+import { useI18n } from 'vue-i18n';
+import { Message } from "@arco-design/web-vue";
+
+const systemStore = useSystemStore();
+const { t } = useI18n();
+
+// 自定义请求:上传文件的处理逻辑
+const customRequest = async (option) => {
+  const { file } = option.fileItem;
+  const fileName = `thumbnail_${file.name}`;
+  const key = `test/${fileName}`;
+
+  // 获取上传客户端(假设 systemStore 已经定义了上传接口)
+  const client = await systemStore.getSTSClient();
+  const resClient = await client.putObject({
+    key: key,
+    body: file
+  });
+
+
+  // 上传成功后,更新 fileList 和 modelValue
+  if (resClient.statusCode === 200) {
+    const uploadedFileUrl = resClient.url;
+    fileList.value.push({ url: uploadedFileUrl, name: fileName, status: resClient.statusCode, uid: '0' });
+    // 更新父组件的 modelValue
+    if (minx.value === 1) {
+      emit('update:modelValue', uploadedFileUrl);
+    } else {
+      emit('update:modelValue', fileList.value.map(res => res.url).join(','));
+    }
+  }
+};
+// 接收外部传入的 props:modelValue 和 minx
+const props = defineProps({
+  modelValue: {
+    type: [String, Array],
+    default: "",
+  },
+  minx: {
+    type: Number,
+    default: 1
+  },
+  listType: {
+    type: String,
+    default: 'picture-card'
+  },// 上传样式
+  imagePreview: {
+    type: Boolean,
+    default: true
+  }, // 是否支持预览
+  accept: {
+    type: String,
+    default: ''
+  }, // 上传文件类型
+  handelUpload: {
+    type: Function,
+    default: null  // 外部传入的自定义上传方法
+  },
+  showRemoveButton:{
+    type: Boolean,
+    default: true  // 是否显示删除按钮
+  },
+  beforeUpload: {
+    type: Boolean,
+    default: false,
+  },
+});
+
+// 使用 toRef 确保对 props 的访问是响应式的
+const minx = toRef(props, 'minx');
+const modelValue = toRef(props, 'modelValue');
+const listType = toRef(props, 'listType');
+const imagePreview = toRef(props, 'imagePreview');
+const handelUpload = toRef(props, 'handelUpload');
+// 定义 emit,用于向外抛出事件
+const emit = defineEmits(["update:modelValue"]);
+
+// 用于存储文件列表,初始化时显示传递给子组件的值
+const fileList = ref([]);
+
+
+// 删除文件处理逻辑
+const beforeRemove = (file) => {
+  return new Promise((resolve, reject) => {
+    Modal.confirm({
+      title: $t("customer.confirmRemoveUpload"),
+      onOk: () => {
+        // 更新 fileList 和 modelValue,移除删除的文件
+        fileList.value = fileList.value.filter((item) => item.url !== file.url);
+        if (minx.value === 1) {
+          emit(
+            "update:modelValue",
+            fileList.value.length > 0 ? fileList.value[0].url : ""
+          );
+        } else {
+          emit(
+            "update:modelValue",
+            fileList.value.map((res) => res.url).join(",")
+          );
+        }
+        resolve(true); // 确认删除
+      },
+      onCancel: () => reject("cancel"), // 取消删除
+    });
+  });
+};
+
+watchEffect(() => {
+  if (modelValue.value) {
+    if (Array.isArray(modelValue.value)) {
+      // 如果传递的是数组,则直接使用
+      fileList.value = modelValue.value.map(item => ({ url: item, status: item.status, name: item.name }));
+    } else if (typeof modelValue.value === 'string') {
+      // 如果传递的是字符串,则将字符串按逗号分割成数组
+      const urlList = modelValue.value.split(',').map(url => ({ url: url.trim() }));
+      fileList.value = urlList;
+    }
+  } else {
+    fileList.value = [];
+  }
+
+})
+
+onMounted(() => {
+
+})
+
+// 上传前校验
+const beforeUpload = (rawFile) => {
+  if(!props.beforeUpload) return true
+  const isAllowType =
+    rawFile.type === "image/png" ||
+    rawFile.type === "image/jpg" ||
+    rawFile.type === "image/jpeg";
+  if (!isAllowType) {
+    Message.error("图片仅支持jpg或png");
+    return false;
+  } else if (rawFile.size / 1024 / 1024 > 2) {
+    Message.error("图片不能大于2M");
+    return false;
+  }
+  return true;
+};
+
+</script>
+
+<style scoped>
+/* 可自定义样式 */
+</style>

+ 28 - 0
src/hooks/enum.js

@@ -0,0 +1,28 @@
+// 字典类型枚举值
+export const enum_dict = {
+    TRAFFIC_PACKET_STATUS: "trafficPacketStatus", // 流量包状态
+    SUBSCRIPTION_RELATIONSHIP_STATUS: "subscriptionRelationshipStatus", // 订阅关系状态
+    MAIN_CARD_STATUS: "mainCardStatus", // 主卡状态
+    PACKAGE_TRIFF_PLAN_STATUS: "packageTariffPlanStatus", // 套餐资费计划判断状态
+    SUPPLIER_SOURCE: "supplierSource", // 来源(订单管理列表-运营商)
+    TRAFFI_CTYPE: "TrafficType", // 流量类型
+    SOURCE: "source", // 来源(资费列表)
+    CARD_TYPE: "cardType", // 卡类型
+    GROUP_POOL: "groupPool", // 组池
+    SILENCE: "silenceOf", // 沉默期
+    BILLING_CYCLE: "Billingcycle", // 计费周期
+    BILLING_TYPE: "BillingType", // 计费分类
+    BILLING_METHOD: "billingMethod", // 计费方式
+    SETTLEMENT_CYCLE: "settlementCycle", // 结算周期
+    TRAFFIC_POOL_TYPE: "trafficPoolType", // 流量池类型
+    TRAFFIC_USAGE_TYPE: "trafficUsageType", // 流量使用限制类型
+    CYCLE_TYPE: "cycleType", // 周期类型
+    ACTIVATION_PACKAGE: "activationPackageMethod", // 激活卡套餐方法
+    FLOW_PACKET_TYPE: "flowPacketType", // 流量包类型
+    DEDUCTION_MODEL: "deductionModel", // 套餐收费方式
+    FLOW_PERIOD: "flowPeriod", // 流量包套餐时长
+    ACTIVATE_METHOD: "activateMethod", // 激活方式-激活计费方式
+    ORDER_AUDIT_STATUS: "orderAuditStatus", // 订单审核状态
+    ORDER_TYPE: "orderType", // 订单状态
+    CURRENCY_TYPE:'currencyType', // 币种
+};

+ 2 - 0
src/hooks/index.js

@@ -0,0 +1,2 @@
+export * from '@/hooks/useLang.hook'
+export * from '@/hooks/useTheme.hook'

+ 26 - 0
src/hooks/useLang.hook.js

@@ -0,0 +1,26 @@
+import { computed } from 'vue'
+import { useLangStore } from '@/store/modules/langStore'
+
+
+import zhCN from '@arco-design/web-vue/es/locale/lang/zh-cn';
+import enUS from '@arco-design/web-vue/es/locale/lang/en-us';
+import thTH from '@arco-design/web-vue/es/locale/lang/th-th';
+
+const i18n = {
+  "zh-CN": zhCN,
+  "en-US": enUS,
+  "th-TH": thTH,
+}
+
+// 语言切换
+export const useLang = () => {
+  const lang = useLangStore()
+  
+  const locale = computed(() => {
+    return  i18n[lang.getLang]
+  })
+
+  return {
+    locale
+  }
+}

+ 12 - 0
src/hooks/useTheme.hook.js

@@ -0,0 +1,12 @@
+import { useDesignStore } from '@/store/modules/designStore'
+
+export const useDarkThemeHook = () => {
+  const designStore = useDesignStore()
+  if(designStore.getDarkTheme){
+    // 设置为暗黑主题
+    document.body.removeAttribute('arco-theme');
+  }else{
+    // 恢复亮色主题
+    document.body.setAttribute('arco-theme', 'dark')
+  }
+}

+ 55 - 0
src/i18n/en/dataPackage.js

@@ -0,0 +1,55 @@
+export default {
+    // Data package management
+    addDataPackage: 'Add Data Package',
+    editDataPackage: 'Edit Data Package',
+    packageName: 'Package Name',
+    enterPackageName: 'Please enter package name',
+    operatorType: 'Operator Type',
+    selectOperatorType: 'Please select operator type',
+    searchExecuted: 'Search executed',
+    searchReset: 'Search conditions have been reset',
+    selectStatus: 'Please select status',
+    statusName: 'Status',
+    
+    // Table columns
+    id: 'ID',
+    packageCode: 'Package Code',
+    operatorName: 'Operator Name',
+    packageSize: 'Package Size',
+    standardPrice: 'Standard Price',
+    status: 'Status',
+    
+    // Operation tips
+    packageDeleted: 'Data package {name} has been deleted',
+    packageUpdated: 'Data package {name} has been updated',
+    packageAdded: 'Data package {name} has been added',
+    
+    // Form fields
+    operatorPackageCode: 'Operator Package Code',
+    enterOperatorPackageCode: 'Please enter operator package code',
+    enterPackageSize: 'Please enter package size',
+    enterStandardPrice: 'Please enter standard price',
+    
+    // Status options
+    status: {
+      normal: 'Normal',
+      disabled: 'Disabled',
+      offline: 'Offline'
+    },
+    
+    // Operator type options
+    operatorTypes: {
+      chinamobile: 'China Mobile',
+      chinaunicom: 'China Unicom',
+      chinatelecom: 'China Telecom',
+      international: 'International',
+      foreign_local: 'Foreign Local'
+    },
+    
+    // Form validation messages
+    packageNameRequired: 'Please enter package name',
+    operatorTypeRequired: 'Please select operator type',
+    statusRequired: 'Please select status',
+    packageSizeRequired: 'Please enter package size',
+    standardPriceRequired: 'Please enter standard price'
+  };

+ 63 - 0
src/i18n/en/form.js

@@ -0,0 +1,63 @@
+export default {
+  "Key": "id",
+  "Id": "Operation",
+  "Delete": "Delete",
+  "DeleteConfirm": "Are you sure you want to delete this information?",
+  "Edit": "Edit",
+  "Add": "Add",
+  "Cancel": "Cancel",
+  "Confirm": "Confirm",
+  "Search": "Search",
+  "Reset": "Reset",
+  "Export": "Export",
+  "Import": "Import",
+  "Status": "Status",
+  "ExportSuccess": "Export successful",
+  "ImportSuccess": "Import successful",
+  "ExportFailed": "Export failed",
+  "ImportFailed": "Import failed",
+  "ExportConfirm": "Are you sure you want to export?",
+  "ImportConfirm": "Are you sure you want to import?",
+  "PleaseEnterThe": "Please enter",
+
+  "DBdistributorSource": "DB Source",
+
+  // Menu form
+  "Name": "Menu Name",
+  "Icon": "Icon",
+  "SortNumber": "Sort Number",
+  "Refresh": "Cache",
+  "Path": "Identifier",
+  "Url": "Route",
+
+  // Dictionary
+  "dictionaryName": "Dictionary Name",
+  "dictionaryType": "Dictionary Type",
+  "dictionaryValue": "Value",
+  "dictionarySortNumber": "Sort Number",
+  "dictionaryDescription": "Description",
+  "createUser": "Created By",
+  "updateUser": "Updated By",
+  "createTime": "Creation Time",
+  "updateTime": "Update Time",
+
+  // Distributor
+  "distributorName": "Distributor Name",
+  "distributorContact": "Contact Person",
+  "distributorPhone": "Contact Phone",
+
+  // Data pool form
+  "datapoolForm": {
+    "title": "Create SIM Card Pool",
+    "dealer": "Dealer",
+    "poolName": "Pool Name",
+    "operator": "Operator",
+    "planType": "Plan Type",
+    "displayFlow": "Display Flow",
+    "plan": "Plan",
+    "pleaseSelect": "Please select",
+    "pleaseEnter": "Please enter",
+    "submit": "Submit",
+    "cancel": "Cancel"
+  },
+}

+ 11 - 0
src/i18n/en/global.js

@@ -0,0 +1,11 @@
+export default {
+  "logOut": "log out",
+  "newMenu": "new menu",
+  common: {
+    search: 'Search',
+    reset: 'Reset',
+    edit: 'Edit',
+    delete: 'Delete',
+    operations: 'Operations'
+  }
+}

+ 15 - 0
src/i18n/en/index.js

@@ -0,0 +1,15 @@
+import login from './login'
+import global from './global'
+import form from './form'
+import supplier from './supplier'
+import plan from './plan'
+import dataPackage from './dataPackage'
+
+export default {
+  login,
+  global,
+  form,
+  supplier,
+  plan,
+  dataPackage
+}

+ 3 - 0
src/i18n/en/login.js

@@ -0,0 +1,3 @@
+export default {
+  'Welcome': 'Welcome',
+}

+ 54 - 0
src/i18n/en/plan.js

@@ -0,0 +1,54 @@
+export default {
+    feeName: 'Fee Name',
+    enterFeeName: 'Enter fee name or code',
+    operatorType: 'Operator Type',
+    selectOperatorType: 'Please select',
+    addFee: 'Add Fee',
+    editFee: 'Edit Fee',
+    id: 'ID',
+    feeCode: 'Fee Code',
+    supplierName: 'Supplier Name',
+    dataType: 'Data Type',
+    billingCategory: 'Billing Category',
+    billingCycle: 'Billing Cycle',
+    packageSize: 'Package Size',
+    standardPrice: 'Standard Price',
+    cycleLimitation: 'Cycle Limitation',
+    status: {
+      normal: 'Normal',
+      disabled: 'Disabled',
+      offline: 'Offline'
+    },
+    operatorTypes: {
+      general: 'General',
+      specific: 'Specific'
+    },
+    searchExecuted: 'Search executed',
+    feeDeleted: 'Fee {name} has been deleted',
+    feeUpdated: 'Fee {name} has been updated',
+    feeAdded: 'New fee {name} has been added',
+    basicInfo: 'Basic Information',
+    supplier: 'Supplier',
+    selectSupplier: 'Please select supplier',
+    supplier1: 'Supplier 1',
+    supplier2: 'Supplier 2',
+    general: 'General',
+    specific: 'Specific',
+    data: 'Data',
+    voice: 'Voice',
+    nb: 'NB',
+    sms: 'SMS',
+    billingInfo: 'Billing Information',
+    feeCodeRequired: 'Please enter fee code',
+    feeNameRequired: 'Please enter fee name',
+    supplierRequired: 'Please select supplier',
+    dataTypeRequired: 'Please select data type',
+    billingCategoryRequired: 'Please select billing category',
+    statusRequired: 'Please select status',
+    billingCycleRequired: 'Please select billing cycle',
+    packageSizeRequired: 'Please enter package size',
+    standardPriceRequired: 'Please enter standard price',
+    minPeriodRequired: 'Please enter minimum period',
+    maxPeriodRequired: 'Please enter maximum period',
+    fillRequiredFields: 'Please fill in all required fields'
+  }

+ 85 - 0
src/i18n/en/supplier.js

@@ -0,0 +1,85 @@
+export default {
+    addSupplier: 'Add Supplier',
+    editSupplier: 'Edit Supplier',
+    supplierName: 'Supplier Name',
+    enterSupplierName: 'Please enter supplier name',
+    operatorType: 'Operator Type',
+    selectOperatorType: 'Please select operator type',
+    id: 'ID',
+    operatorCode: 'Operator Code',
+    operatorName: 'Operator Name',
+    updateTime: 'Update Time',
+    searchExecuted: 'Search executed',
+    searchReset: 'Search conditions have been reset',
+    operatorTypes: {
+      foreign_local: 'Foreign Local',
+      international: 'International',
+      chinamobile: 'China Mobile',
+      chinaunicom: 'China Unicom',
+      chinatelecom: 'China Telecom'
+    },
+    basicInfo: 'Basic Information',
+    operatorApiConfig: 'Operator API Configuration',
+    advancedConfig: 'Advanced Configuration',
+    apiTemplate: 'API Template',
+    selectApiTemplate: 'Select API Template',
+    apiTemplates: {
+      telecom_CMP: 'Telecom CMP'
+    },
+    apiUrl: 'API URL',
+    enterApiUrl: 'Enter API URL',
+    realNameAuthUrl: 'Real-name Authentication URL',
+    enterRealNameAuthUrl: 'Enter real-name authentication URL',
+    realNameUrlParam: 'Real-name URL Parameter',
+    enterRealNameUrlParam: 'Enter real-name URL parameter',
+    appKey: 'App Key',
+    enterAppKey: 'Enter App Key',
+    apiSecret: 'API Secret',
+    enterApiSecret: 'Enter API Secret',
+    key: 'Key',
+    enterKey: 'Enter Key',
+    stopCardAction: 'Stop Card Action',
+    selectStopCardAction: 'Select stop card action',
+    stopCardActions: {
+      suspend: 'Suspend'
+    },
+    needManualRealName: 'Need Manual Real-name',
+    need: 'Need',
+    noNeed: 'No Need',
+    autoSyncUsage: 'Auto Sync Usage',
+    enable: 'Enable',
+    disable: 'Disable',
+    useOperatorApi: 'Use Operator API',
+    call: 'Call',
+    noCall: 'No Call',
+    setQuantityLimit: 'Set Quantity Limit',
+    quantityLimit: 'Quantity Limit',
+    noQuantityLimit: 'No Quantity Limit',
+    useOperatorDataPool: 'Use Operator Data Pool',
+    silentPeriod: 'Silent Period',
+    enterSilentPeriod: 'Enter silent period',
+    unusedSuspensionDays: 'Unused Suspension Days',
+    enterDays: 'Enter days',
+    maxWhitelistAdditions: 'Max Whitelist Additions',
+    enterTimes: 'Enter times',
+    totalActiveWhitelists: 'Total Active Whitelists',
+    enterCount: 'Enter count',
+    dailyWhitelistRemovals: 'Daily Whitelist Removals',
+    whitelistAddOrder: 'Whitelist Add Order',
+    selectOrder: 'Select order',
+    noWhitelist: 'No Whitelist',
+    numberGenerationRule: 'Number Generation Rule',
+    enterNumberGenerationRule: 'Enter number generation rule',
+    supplierNameRequired: 'Supplier name is required',
+    operatorTypeRequired: 'Operator type is required',
+    apiTemplateRequired: 'API template is required',
+    apiUrlRequired: 'API URL is required',
+    appKeyRequired: 'App Key is required',
+    apiSecretRequired: 'API Secret is required',
+    needManualRealNameRequired: 'Need manual real-name is required',
+    autoSyncUsageRequired: 'Auto sync usage is required',
+    useOperatorApiRequired: 'Use operator API is required',
+    useOperatorDataPoolRequired: 'Use operator data pool is required',
+    silentPeriodRequired: 'Silent period is required',
+    fillRequiredFields: 'Please fill in all required fields'
+  }

+ 36 - 0
src/i18n/index.js

@@ -0,0 +1,36 @@
+//语言
+import { lang } from '@/settings/designSetting'
+import { createI18n } from 'vue-i18n' //引入vue-i18n组件
+import { useLangStore } from '@/store/modules/langStore'
+import zh from './zh/index'
+import en from './en/index'
+import th from './th/index'
+
+
+
+const langStore = useLangStore()
+
+export const i18n = createI18n({
+    globalInjection: true,
+    locale: (langStore ?.lang) || lang,
+    messages: {
+        'zh-CN': zh,
+        'en-US': en,
+        'th-TH': th
+    }
+})
+
+// 语言数组
+export const langList = [{
+        label: '简体中文',
+        key: 'zh-CN'
+    },
+    {
+        label: 'English',
+        key: 'en-US'
+    },
+    {
+        label: 'แบบไทย',
+        key: 'th-TH'
+    }
+]

+ 55 - 0
src/i18n/th/dataPackage.js

@@ -0,0 +1,55 @@
+export default {
+    // การจัดการแพ็กเกจข้อมูล
+    addDataPackage: 'เพิ่มแพ็กเกจข้อมูล',
+    editDataPackage: 'แก้ไขแพ็กเกจข้อมูล',
+    packageName: 'ชื่อแพ็กเกจ',
+    enterPackageName: 'กรุณาป้อนชื่อแพ็กเกจ',
+    operatorType: 'ประเภทผู้ให้บริการ',
+    selectOperatorType: 'กรุณาเลือกประเภทผู้ให้บริการ',
+    searchExecuted: 'ดำเนินการค้นหาแล้ว',
+    searchReset: 'รีเซ็ตเงื่อนไขการค้นหาแล้ว',
+    selectStatus: 'กรุณาเลือกสถานะ',
+    statusName: 'สถานะ',
+    
+    // คอลัมน์ตาราง
+    id: 'รหัส',
+    packageCode: 'รหัสแพ็กเกจ',
+    operatorName: 'ชื่อผู้ให้บริการ',
+    packageSize: 'ขนาดแพ็กเกจ',
+    standardPrice: 'ราคามาตรฐาน',
+    status: 'สถานะ',
+    
+    // ข้อความการดำเนินการ
+    packageDeleted: 'ลบแพ็กเกจข้อมูล {name} แล้ว',
+    packageUpdated: 'อัปเดตแพ็กเกจข้อมูล {name} แล้ว',
+    packageAdded: 'เพิ่มแพ็กเกจข้อมูล {name} แล้ว',
+    
+    // ฟิลด์แบบฟอร์ม
+    operatorPackageCode: 'รหัสแพ็กเกจผู้ให้บริการ',
+    enterOperatorPackageCode: 'กรุณาป้อนรหัสแพ็กเกจผู้ให้บริการ',
+    enterPackageSize: 'กรุณาป้อนขนาดแพ็กเกจ',
+    enterStandardPrice: 'กรุณาป้อนราคามาตรฐาน',
+    
+    // ตัวเลือกสถานะ
+    status: {
+      normal: 'ปกติ',
+      disabled: 'ปิดใช้งาน',
+      offline: 'ออฟไลน์'
+    },
+    
+    // ตัวเลือกประเภทผู้ให้บริการ
+    operatorTypes: {
+      chinamobile: 'ไชน่าโมบาย',
+      chinaunicom: 'ไชน่ายูนิคอม',
+      chinatelecom: 'ไชน่าเทเลคอม',
+      international: 'นานาชาติ',
+      foreign_local: 'ต่างประเทศท้องถิ่น'
+    },
+    
+    // ข้อความตรวจสอบแบบฟอร์ม
+    packageNameRequired: 'กรุณาป้อนชื่อแพ็กเกจ',
+    operatorTypeRequired: 'กรุณาเลือกประเภทผู้ให้บริการ',
+    statusRequired: 'กรุณาเลือกสถานะ',
+    packageSizeRequired: 'กรุณาป้อนขนาดแพ็กเกจ',
+    standardPriceRequired: 'กรุณาป้อนราคามาตรฐาน'
+  };

+ 63 - 0
src/i18n/th/form.js

@@ -0,0 +1,63 @@
+export default {
+  "Key": "id",
+  "Id": "รหัส",
+  "Delete": "ลบ",
+  "DeleteConfirm": "คุณแน่ใจหรือไม่ว่าต้องการลบข้อมูลนี้?",
+  "Edit": "แก้ไข",
+  "Add": "เพิ่ม",
+  "Cancel": "ยกเลิก",
+  "Confirm": "ยืนยัน",
+  "Search": "ค้นหา",
+  "Reset": "รีเซ็ต",
+  "Export": "ส่งออก",
+  "Import": "นำเข้า",
+  "Status": "สถานะ",
+  "ExportSuccess": "ส่งออกสำเร็จ",
+  "ImportSuccess": "นำเข้าสำเร็จ",
+  "ExportFailed": "ส่งออกล้มเหลว",
+  "ImportFailed": "นำเข้าล้มเหลว",
+  "ExportConfirm": "คุณแน่ใจหรือไม่ว่าต้องการส่งออก?",
+  "ImportConfirm": "คุณแน่ใจหรือไม่ว่าต้องการนำเข้า?",
+  "PleaseEnterThe": "กรุณากรอก",
+
+  "DBdistributorSource": "แหล่งที่มา DB",
+
+  // Menu form
+  "Name": "ชื่อเมนู",
+  "Icon": "ไอคอน",
+  "SortNumber": "หมายเลขเรียงลำดับ",
+  "Refresh": "รีเฟรช",
+  "Path": "ตัวระบุ",
+  "Url": "เส้นทาง",
+
+  // Dictionary
+  "dictionaryName": "ชื่อพจนานุกรม",
+  "dictionaryType": "ประเภทพจนานุกรม",
+  "dictionaryValue": "ค่า",
+  "dictionarySortNumber": "หมายเลขเรียงลำดับ",
+  "dictionaryDescription": "คำอธิบาย",
+  "createUser": "สร้างโดย",
+  "updateUser": "อัปเดตโดย",
+  "createTime": "เวลาที่สร้าง",
+  "updateTime": "เวลาที่อัปเดต",
+
+  // Distributor
+  "distributorName": "ชื่อผู้จัดจำหน่าย",
+  "distributorContact": "ผู้ติดต่อ",
+  "distributorPhone": "เบอร์โทรติดต่อ",
+
+  // Data pool form
+  "datapoolForm": {
+    "title": "สร้างพูล SIM การ์ด",
+    "dealer": "ตัวแทนจำหน่าย",
+    "poolName": "ชื่อพูล",
+    "operator": "ผู้ให้บริการ",
+    "planType": "ประเภทแผน",
+    "displayFlow": "แสดงการไหล",
+    "plan": "แผน",
+    "pleaseSelect": "กรุณาเลือก",
+    "pleaseEnter": "กรุณากรอก",
+    "submit": "ส่ง",
+    "cancel": "ยกเลิก"
+  },
+}

+ 11 - 0
src/i18n/th/global.js

@@ -0,0 +1,11 @@
+export default {
+  "logOut": "เลิก",
+  newMenu: "เมนูใหม่",
+  common: {
+    search: 'ค้นหา',
+    reset: 'รีเซ็ต',
+    edit: 'แก้ไข',
+    delete: 'ลบ',
+    operations: 'การดำเนินการ'
+  }
+}

+ 15 - 0
src/i18n/th/index.js

@@ -0,0 +1,15 @@
+import login from './login'
+import global from './global'
+import form from './form'
+import supplier from './supplier'
+import plan from './plan'
+import dataPackage from './dataPackage'
+
+export default {
+  login,
+  global,
+  form,
+  supplier,
+  plan,
+  dataPackage
+}

+ 3 - 0
src/i18n/th/login.js

@@ -0,0 +1,3 @@
+export default {
+  'Welcome': 'ยินดีต้อนรับสู่เข้าสู่ระบบ',
+}

+ 74 - 0
src/i18n/th/plan.js

@@ -0,0 +1,74 @@
+export default {
+    feeName: 'ชื่อค่าบริการ',
+    enterFeeName: 'กรุณาป้อนชื่อหรือรหัสค่าบริการ',
+    operatorType: 'ประเภทผู้ให้บริการ',
+    selectOperatorType: 'กรุณาเลือก',
+    addFee: 'เพิ่มค่าบริการ',
+    editFee: 'แก้ไขค่าบริการ',
+    id: 'ลำดับ',
+    feeCode: 'รหัสค่าบริการ',
+    supplierName: 'ชื่อผู้จัดจำหน่าย',
+    dataType: 'ประเภทข้อมูล',
+    billingCategory: 'หมวดหมู่การเรียกเก็บเงิน',
+    billingCycle: 'รอบการเรียกเก็บเงิน',
+    packageSize: 'ขนาดแพ็คเกจ',
+    standardPrice: 'ราคามาตรฐาน',
+    cycleLimitation: 'ข้อจำกัดรอบ',
+    status: {
+      normal: 'ปกติ',
+      disabled: 'ปิดใช้งาน',
+      offline: 'ออฟไลน์'
+    },
+    operatorTypes: {
+      general: 'ทั่วไป',
+      specific: 'เฉพาะเจาะจง'
+    },
+    searchExecuted: 'ดำเนินการค้นหาแล้ว',
+    feeDeleted: 'ลบค่าบริการ {name} แล้ว',
+    feeUpdated: 'อัปเดตค่าบริการ {name} แล้ว',
+    feeAdded: 'เพิ่มค่าบริการใหม่ {name} แล้ว',
+    basicInfo: 'ข้อมูลพื้นฐาน',
+    supplier: 'ผู้ให้บริการ',
+    selectSupplier: 'กรุณาเลือกผู้ให้บริการ',
+    supplier1: 'ผู้จัดจำหน่าย 1',
+    supplier2: 'ผู้จัดจำหน่าย 2',
+    general: 'ทั่วไป',
+    specific: 'เฉพาะเจาะจง',
+    data: 'ข้อมูล',
+    voice: 'เสียง',
+    nb: 'NB',
+    sms: 'SMS',
+    billingInfo: 'ข้อมูลการเรียกเก็บเงิน',
+    daily: 'รายวัน',
+    monthly: 'รายเดือน',
+    enterPackageSize: 'กรุณาป้อนขนาดแพ็คเกจ',
+    enterPrice: 'กรุณาป้อนราคา',
+    currency: 'บาท',
+    billingCycleType: 'ประเภทรอบการเรียกเก็บเงิน',
+    month: 'เดือน',
+    subscriptionPeriod: 'ระยะเวลาการสมัคร',
+    minimum: 'ต่ำสุด',
+    maximum: 'สูงสุด',
+    monthsMin: 'เดือน (ต่ำสุด)',
+    monthsMax: 'เดือน (สูงสุด)',
+    overagePrice: 'ราคาส่วนเกิน',
+    enterOveragePrice: 'กรุณาป้อนราคาส่วนเกิน',
+    connectionTimes: 'จำนวนการเชื่อมต่อ (ครั้ง)',
+    times: 'ครั้ง',
+    voiceRate: 'อัตราค่าโทรเข้า',
+    minute: 'นาที',
+    billingCode: 'รหัสการเรียกเก็บเงิน',
+    autoGenerated: 'สร้างอัตโนมัติ',
+    feeCodeRequired: 'กรุณาป้อนรหัสค่าบริการ',
+    feeNameRequired: 'กรุณาป้อนชื่อค่าบริการ',
+    supplierRequired: 'กรุณาเลือกผู้ให้บริการ',
+    dataTypeRequired: 'กรุณาเลือกประเภทข้อมูล',
+    billingCategoryRequired: 'กรุณาเลือกหมวดหมู่การเรียกเก็บเงิน',
+    statusRequired: 'กรุณาเลือกสถานะ',
+    billingCycleRequired: 'กรุณาเลือกรอบการเรียกเก็บเงิน',
+    packageSizeRequired: 'กรุณาป้อนขนาดแพ็คเกจ',
+    standardPriceRequired: 'กรุณาป้อนราคามาตรฐาน',
+    minPeriodRequired: 'กรุณาป้อนระยะเวลาการสมัครขั้นต่ำ',
+    maxPeriodRequired: 'กรุณาป้อนระยะเวลาการสมัครสูงสุด',
+    fillRequiredFields: 'กรุณากรอกข้อมูลในช่องที่จำเป็นทั้งหมด'
+  }

+ 85 - 0
src/i18n/th/supplier.js

@@ -0,0 +1,85 @@
+export default {
+    addSupplier: 'เพิ่มซัพพลายเออร์',
+    editSupplier: 'แก้ไขซัพพลายเออร์',
+    supplierName: 'ชื่อซัพพลายเออร์',
+    enterSupplierName: 'กรุณาป้อนชื่อซัพพลายเออร์',
+    operatorType: 'ประเภทผู้ให้บริการ',
+    selectOperatorType: 'กรุณาเลือกประเภทผู้ให้บริการ',
+    id: 'รหัส',
+    operatorCode: 'รหัสผู้ให้บริการ',
+    operatorName: 'ชื่อผู้ให้บริการ',
+    updateTime: 'เวลาอัปเดต',
+    searchExecuted: 'ดำเนินการค้นหาแล้ว',
+    searchReset: 'รีเซ็ตเงื่อนไขการค้นหาแล้ว',
+    operatorTypes: {
+      foreign_local: 'ต่างประเทศท้องถิ่น',
+      international: 'นานาชาติ',
+      chinamobile: 'ไชน่าโมบาย',
+      chinaunicom: 'ไชน่ายูนิคอม',
+      chinatelecom: 'ไชน่าเทเลคอม'
+    },
+    basicInfo: 'ข้อมูลพื้นฐาน',
+    operatorApiConfig: 'การกำหนดค่า API ของผู้ให้บริการ',
+    advancedConfig: 'การกำหนดค่าขั้นสูง',
+    apiTemplate: 'เทมเพลต API',
+    selectApiTemplate: 'เลือกเทมเพลต API',
+    apiTemplates: {
+      telecom_CMP: 'เทเลคอม CMP'
+    },
+    apiUrl: 'URL ของ API',
+    enterApiUrl: 'ป้อน URL ของ API',
+    realNameAuthUrl: 'URL สำหรับการยืนยันตัวตน',
+    enterRealNameAuthUrl: 'ป้อน URL สำหรับการยืนยันตัวตน',
+    realNameUrlParam: 'พารามิเตอร์ URL สำหรับการยืนยันตัวตน',
+    enterRealNameUrlParam: 'ป้อนพารามิเตอร์ URL สำหรับการยืนยันตัวตน',
+    appKey: 'คีย์แอป',
+    enterAppKey: 'ป้อนคีย์แอป',
+    apiSecret: 'รหัสลับ API',
+    enterApiSecret: 'ป้อนรหัสลับ API',
+    key: 'คีย์',
+    enterKey: 'ป้อนคีย์',
+    stopCardAction: 'การดำเนินการหยุดบัตร',
+    selectStopCardAction: 'เลือกการดำเนินการหยุดบัตร',
+    stopCardActions: {
+      suspend: 'ระงับ'
+    },
+    needManualRealName: 'ต้องการยืนยันตัวตนด้วยตนเอง',
+    need: 'ต้องการ',
+    noNeed: 'ไม่ต้องการ',
+    autoSyncUsage: 'ซิงค์การใช้งานอัตโนมัติ',
+    enable: 'เปิดใช้งาน',
+    disable: 'ปิดใช้งาน',
+    useOperatorApi: 'ใช้ API ของผู้ให้บริการ',
+    call: 'เรียกใช้',
+    noCall: 'ไม่เรียกใช้',
+    setQuantityLimit: 'ตั้งค่าจำกัดปริมาณ',
+    quantityLimit: 'จำกัดปริมาณ',
+    noQuantityLimit: 'ไม่จำกัดปริมาณ',
+    useOperatorDataPool: 'ใช้พูลข้อมูลของผู้ให้บริการ',
+    silentPeriod: 'ช่วงเวลาเงียบ',
+    enterSilentPeriod: 'ป้อนช่วงเวลาเงียบ',
+    unusedSuspensionDays: 'วันที่ระงับเมื่อไม่ได้ใช้งาน',
+    enterDays: 'ป้อนจำนวนวัน',
+    maxWhitelistAdditions: 'จำนวนครั้งสูงสุดในการเพิ่มรายการอนุญาต',
+    enterTimes: 'ป้อนจำนวนครั้ง',
+    totalActiveWhitelists: 'จำนวนรายการอนุญาตที่ใช้งานทั้งหมด',
+    enterCount: 'ป้อนจำนวน',
+    dailyWhitelistRemovals: 'จำนวนการลบรายการอนุญาตต่อวัน',
+    whitelistAddOrder: 'ลำดับการเพิ่มรายการอนุญาต',
+    selectOrder: 'เลือกลำดับ',
+    noWhitelist: 'ไม่มีรายการอนุญาต',
+    numberGenerationRule: 'กฎการสร้างหมายเลข',
+    enterNumberGenerationRule: 'ป้อนกฎการสร้างหมายเลข',
+    supplierNameRequired: 'ต้องระบุชื่อซัพพลายเออร์',
+    operatorTypeRequired: 'ต้องระบุประเภทผู้ให้บริการ',
+    apiTemplateRequired: 'ต้องระบุเทมเพลต API',
+    apiUrlRequired: 'ต้องระบุ URL ของ API',
+    appKeyRequired: 'ต้องระบุคีย์แอป',
+    apiSecretRequired: 'ต้องระบุรหัสลับ API',
+    needManualRealNameRequired: 'ต้องระบุความต้องการยืนยันตัวตนด้วยตนเอง',
+    autoSyncUsageRequired: 'ต้องระบุการซิงค์การใช้งานอัตโนมัติ',
+    useOperatorApiRequired: 'ต้องระบุการใช้ API ของผู้ให้บริการ',
+    useOperatorDataPoolRequired: 'ต้องระบุการใช้พูลข้อมูลของผู้ให้บริการ',
+    silentPeriodRequired: 'ต้องระบุช่วงเวลาเงียบ',
+    fillRequiredFields: 'กรุณากรอกข้อมูลในฟิลด์ที่จำเป็นทั้งหมด'
+  }

+ 277 - 0
src/i18n/zh/customer.js

@@ -0,0 +1,277 @@
+export default {
+    // 主列表页面
+    customerName: "客户名称",
+    enterCustomerName: "请输入客户名称",
+    operatorType: "运营商类型",
+    selectOperatorType: "请选择运营商类型",
+    addCustomer: "新增客户",
+    batchDelete: "批量删除",
+    searchExecuted: "已执行搜索",
+    searchReset: "搜索条件已重置",
+    batchDeleteWarning: "确定要批量删除选中的客户吗?",
+    statusName: "状态",
+
+    basicInfoSection: "基本信息",
+    smsInfoSection: "手机短信",
+    accountManagement: "账户资费管理",
+    customerData: "客户资料",
+    interfaceParams: "接口参数",
+    billingInfo: "发票信息",
+    purchaseQuality: "购卡资质",
+    warningNumbers: "预警参数",
+
+    // 表格列
+    id: "用户id",
+    customerCode: "客户邮编",
+    accountNumber: "账号",
+    accountBalance: "账户余额",
+    paymentMethod: "付费方式",
+    customerStatus: "客户状态",
+    validPeriod: "有效期",
+    activeCards: "有效卡数/总卡数",
+    updateTime: "更新时间",
+
+    // 操作按钮
+    recharge: "充值",
+    packageManagement: "套餐管理",
+    edit: "编辑",
+
+    // 状态
+    status: {
+        normal: "正常",
+        disabled: "禁用",
+        pending: "待审",
+        suspended: "暂停",
+    },
+
+    // 运营商类型
+    operatorTypes: {
+        domestic: "国内",
+        international: "国际",
+    },
+
+    // 新增/编辑客户对话框
+    editCustomer: "编辑客户",
+    basicInfo: "基本信息",
+    smsInfo: "手机短信",
+    enterCustomerCode: "请输入客户邮编",
+    enterAccountNumber: "请输入账号",
+    password: "登录密码",
+    enterPassword: "请输入登录密码",
+    generatePassword: "重置密码",
+    remark: "号码备注",
+    enterRemark: "请输入号码备注",
+    selectValidPeriod: "请选择有效期",
+
+    smsNumber: "短信子号",
+    enterSmsNumber: "请输入短信子号",
+    smsName: "短信签名",
+    enterSmsName: "请输入短信签名",
+    loginSmsTemplate: "登录短信模板",
+    enterLoginSmsTemplate: "请输入登录短信模板",
+    alarmSmsTemplate: "预警短信模板",
+    enterAlarmSmsTemplate: "请输入预警短信模板",
+
+    // 表单验证消息
+    customerCodeRequired: "请输入客户编码",
+    customerNameRequired: "请输入客户名称",
+    accountNumberRequired: "请输入账号",
+    passwordRequired: "请输入登录密码",
+    validPeriodRequired: "请选择有效期",
+    statusRequired: "请选择客户状态",
+
+    // 其他
+    passwordGenerated: "密码已生成",
+
+    // 账户资费管理相关翻译
+    accountBalance: '账户余额',
+    rechargeLimit: '充值限制',
+    creditLimit: '信用额度',
+    mobileSmsPrice: '手机短信单价',
+    iotSmsPrice: '物联网短信单价',
+    paymentMethod: '付费方式',
+    currency: '元',
+    currencyPerTime: '元/次',
+    currencyPerMessage: '元/条',
+    paymentMethodName: '付费方式名称',
+    paymentMethod: {
+        prepaid: '预付费',
+        postpaid: '后付费'
+    },
+
+    // 客户资料相关翻译
+    platformName: '平台名称',
+    enterPlatformName: '请输入平台名称',
+    companyName: '公司名称',
+    enterCompanyName: '请输入公司名称',
+    servicePhone: '服务电话',
+    enterServicePhone: '请输入服务电话',
+    domain: '域名',
+    enterDomain: '请输入域名',
+    websiteBackend: '网站备案号',
+    enterWebsiteBackend: '请输入网站备案号',
+    customerAddress: '客户地址',
+    enterCustomerAddress: '请输入客户地址',
+
+    contactPerson: '联系人',
+    enterContactPerson: '请输入联系人',
+    contactPhone: '联系人手机号',
+    enterContactPhone: '请输入联系人手机号',
+    contactEmail: '联系人邮箱',
+    enterContactEmail: '请输入联系人邮箱',
+    contactQQ: '联系人QQ号',
+    enterContactQQ: '请输入联系人QQ号',
+
+    billingPerson: '收件人',
+    enterBillingPerson: '请输入收件人',
+    billingPhone: '收件人手机号',
+    enterBillingPhone: '请输入收件人手机号',
+    billingAddress: '收件人地址',
+    enterBillingAddress: '请输入收件人地址',
+
+    // 接口参数相关翻译
+    smsStatusReportUrl: '短信状态报告推送地址',
+    enterSmsStatusReportUrl: '请输入短信状态报告推送地址',
+    reportIp: '报备IP',
+    enterReportIp: '请输入报备IP',
+    deliveryPriority: '推送优先级',
+    selectDeliveryPriority: '请选择推送优先级',
+    deliveryPriorityName: '推送优先级',
+    deliveryPriority: {
+        high: '高',
+        medium: '中',
+        low: '低'
+    },
+    dataReportUrl: '数据推送地址',
+    enterDataReportUrl: '请输入数据推送地址',
+
+    // 发票信息相关翻译
+    invoiceTitle: '发票抬头',
+    enterInvoiceTitle: '请输入发票抬头',
+    taxRegistrationNumber: '税务登记证号',
+    enterTaxRegistrationNumber: '请输入税务登记证号',
+    registeredAddress: '注册场所地址',
+    enterRegisteredAddress: '请输入注册场所地址',
+    registeredPhone: '注册固定电话',
+    enterRegisteredPhone: '请输入注册固定电话',
+    bankName: '开户银行名称',
+    enterBankName: '请输入开户银行名称',
+    bankAccountName: '账户名称',
+    enterBankAccountName: '请输入账户名称',
+    bankAccountNumber: '开户账号',
+    enterBankAccountNumber: '请输入开户账号',
+    taxIdentificationNumber: '纳税人识别号',
+    enterTaxIdentificationNumber: '请输入纳税人识别号',
+    invoiceRecipient: '收票人',
+    enterInvoiceRecipient: '请输入收票人',
+    recipientPhone: '收票人手机号',
+    enterRecipientPhone: '请输入收票人手机号',
+    invoiceAddress: '收票地址',
+    enterInvoiceAddress: '请输入收票地址',
+    invoiceEmail: '收票邮箱',
+    enterInvoiceEmail: '请输入收票邮箱',
+    businessLicenseFile: '营业执照扫描件(加盖公章)',
+    taxRegistrationFile: '税务登记复印件',
+    generalTaxpayerFile: '一般纳税人认定表复印件',
+    uploadFile: '点击上传图片',
+
+    // 购卡资质相关翻译
+    businessLicenseFile: '营业执照扫描件(加盖公章)',
+    legalPersonIdCardFrontFile: '法人身份证人像面(加盖公章)',
+    legalPersonIdCardBackFile: '法人身份证国徽面(加盖公章)',
+    equipmentPurchaseFile: '设备照片(加盖公章)',
+    businessContractFile: '业务合同(加盖公章)',
+    informationSecurityFile: '信息安全承诺书(加盖公章)',
+    customerInformationFile: '客户信息表(加盖公章)',
+    obtainMethod: '获客方式及文字话术',
+    telephoneApplicationForm: '电话业务用户申请登记表',
+    otherDocuments: '其他附件',
+    uploadFile: '点击上传图片',
+    imageUploadDescription: '1.建议上传尺寸为360*240px的图片\n2.图片仅支持jpg或png格式\n3.图片不得大于2M',
+    obtainMethodDescription: '支持扩展名:.rar .zip .doc .docx .ppt .pptx .xls .xlsx .pdf .jpg .jpeg .png .txt\n最多上传10个文件,每个文件不超过2M',
+    telephoneApplicationFormDescription: '支持扩展名:.rar .zip .doc .docx .ppt .pptx .xls .xlsx .pdf .jpg .jpeg .png .txt\n最多上传10个文件,每个文件不超过2M',
+    otherDocumentsDescription: '支持扩展名:.rar .zip .doc .docx .ppt .pptx .xls .xlsx .pdf .jpg .jpeg .png .txt\n最多上传10个文件,每个文件不超过2M',
+
+    // 预警参数相关翻译
+    warningNumbers: '预警参数',
+    accountBalanceWarning: '账号余额预警',
+    reachWarning: '达量预警',
+    stopSending: '达量停机',
+    networkDisconnection: '达量断网',
+    warningPhones: '预警手机',
+    warningEmails: '预警邮箱',
+    enterWarningPhones: '多个逗号隔开,最多3个',
+    enterWarningEmails: '多个逗号隔开,最多3个',
+    noRecovery: '不复机',
+    manualRecovery: '手工恢复',
+    autoRecovery: '自动恢复',
+    // customerInvoice: {
+    //   businessLicenseFile: "营业执照扫描件(加盖公章)"
+    // },
+    // customerCardQualification: {
+    //   legalPersonIdCardFrontFile:
+    // }
+
+
+    // 客户管理
+    smsSubCode: '短信',
+    enterSmsSubCode: '请输入短信',
+    TaxRegistration: '税务登记',
+    TaxRegistrationText: '税务登记信息',
+    InvoiceInformation: '发票信息',
+    photocopy: '税务登记复印件',
+    CertificationQualification: '一般纳税人认证资格复印件',
+    address: '地址',
+    addressMessage: '请输入地址',
+    invoice_vatTextType: '发票类型',
+    invoice_vatTextTypeSelect: '请选择发票类型',
+    invoiceCode: '发票邮编',
+    InvoiceCodeName: '请输入发票邮编',
+    invoiceEmailName: '发票邮箱',
+    invoiceEmailNameType: '请输入发票邮箱',
+    BankNumber: '银行账号',
+    BankNumberName: '请输入银行账号',
+    BusinessLicense: '营业执照',
+    stateType: '请选择状态',
+    nameType: '请输入姓名',
+    roleIdsType: '请选择角色',
+    userTypeType: '请选择用户类型',
+    phoneType: '请输入手机号',
+    phoneName:'手机号',
+    emailName:'邮箱',
+    emailType: '请输入邮箱',
+    addrRequired: '请输入地址',
+    amountRequired: '请输入金额',
+    bankAccountRequired: '请输入银行账号',
+    bankBranchRequired: '请输入银行支行',
+    bankNameRequired: '请输入银行名称',
+    businessLicenseRequired: '请上传营业执照',
+    invoiceAddrRequired: '请输入发票地址',
+    invoiceEmailRequired: '请输入发票邮箱',
+    invoiceTitleRequired: '请输入发票抬头',
+    invoiceTypeRequired: '请选择发票类型',
+    invoiceZipRequired: '请输入发票邮政编码',
+    loginSMSTemplateRequired: '请输入登录短信模板',
+    noteRequired: '请输入备注',
+    smsRequired: '请输入短信模板',
+    smsSignatureRequired: '请输入短信签名',
+    warnSMSTemplateRequired: '请输入警告短信模板',
+    zipCodeRequired: '请输入邮政编码',
+    taxRegistrationCertificateRequired: '请上传税务登记证复印件',
+    taxpayerQualificationRequired: '请上传纳税人资格证复印件',
+    confirm: '确定',
+    netxbolck: '下一步',
+    confirmRemoveUpload:'是否删除该文件',
+    roleldsName:'角色',
+    roleldsNamedType:'请选择角色',
+    bank_branchName:'开户支行',
+    bank_branchNameType:'请输入开户支行',
+    userTypeName:'客户类型',
+    userTypeNameType:'请选择用户类型',
+    userAdmin:'客户账号',
+    startTime:'创建时间',
+    platform:'平台',
+    client:'客户',
+    note:'注:登录密码是明文加密,编辑并不会回显原密码,如无需修改密码,请直接保存信息即可!!',
+    cardNum:'卡数量'
+};

+ 22 - 0
src/i18n/zh/customerPackage.js

@@ -0,0 +1,22 @@
+export default {
+    title: '客户套餐管理',
+    mainPackage: '主套餐',
+    packageCode: '资费',
+    enterPackageCode: '请输入资费名称或代码',
+    packageType: '运营商类型',
+    selectPackageType: '请选择',
+    regular: '常规',
+    custom: '自定义',
+    addPackage: '新增',
+    serialNumber: '序号',
+    packageName: '资费名称',
+    providerName: '供应商名称',
+    billingType: '计费分类',
+    billingPeriod: '计费周期',
+    packageSize: '资费包大小',
+    standardPrice: '标准价格',
+    setPrice: '设置价格',
+    addPackageInfo: '添加新套餐功能尚未实现',
+    setPriceFor: '设置价格for',
+    deleteConfirm: '确定要删除',
+  };

+ 65 - 0
src/i18n/zh/dataPackage.js

@@ -0,0 +1,65 @@
+export default {
+  // 数据包管理
+  addDataPackage: '添加数据包',
+  editDataPackage: '编辑数据包',
+  enterPackageName: '请输入流量包名称',
+  operatorType: '运营商类型',
+  selectOperatorType: '请选择运营商类型',
+  searchExecuted: '搜索已执行',
+  searchReset: '搜索条件已重置',
+  selectStatus: '请选择状态',
+
+  // 表格列
+  id: '序号',
+  packageCode: '流量包编码',
+  packageName: '流量包名称',
+  operatorName: '运营商名称',
+  packageSize: '流量包大小',
+  standardPrice: '标准价格',
+  statusName: '状态',
+
+  superiorId: '上级ID',
+  activationMode: '激活方式',
+  lastModifyTime: '最后修改时间',
+  periodType: '周期类型',
+  period: '流量包套餐时长',
+  statusPackage: '流量包状态',
+  typePackage: '流量使用限制类型',
+
+
+  // 操作提示
+  packageDeleted: '数据包 {name} 已删除',
+  packageUpdated: '数据包 {name} 已更新',
+  packageAdded: '数据包 {name} 已添加',
+
+  // 表单字段
+  operatorPackageCode: '运营商流量包编码',
+  enterOperatorPackageCode: '请输入运营商流量包编码',
+  enterPackageSize: '请输入流量包大小',
+  enterStandardPrice: '请输入标准价格',
+  selectStatus: '请选择状态',
+  price: '资费',
+
+  // 状态选项
+  status: {
+    normal: '正常',
+    disabled: '停用',
+    offline: '下线'
+  },
+
+  // 运营商类型选项
+  operatorTypes: {
+    chinamobile: '中国移动',
+    chinaunicom: '中国联通',
+    chinatelecom: '中国电信',
+    international: '国际通用',
+    foreign_local: '境外本地'
+  },
+
+  // 表单验证消息
+  packageNameRequired: '请输入流量包名称',
+  operatorTypeRequired: '请选择运营商类型',
+  statusRequired: '请选择状态',
+  packageSizeRequired: '请输入流量包大小',
+  standardPriceRequired: '请输入标准价格'
+};

+ 4 - 0
src/i18n/zh/error.js

@@ -0,0 +1,4 @@
+export default {
+    Previous: '回到上一页',
+    notFound:'页面不存在'
+}

+ 32 - 0
src/i18n/zh/financialManagement.js

@@ -0,0 +1,32 @@
+// 财务模块
+export default {
+    searchForm: {
+        name: '客户名称',
+        placeholder: '请输入客户名称',
+    },
+    recharge: '充值',
+    rechargeType: '充值类型',
+    lenovoInput: '联想输入',
+    rechargeAmount: '充值金额',
+    rechargeAmountPlace: '请输入充值金额',
+    remarks: '备注',
+    remarksPlace: '请输入',
+    voucher: '凭证',
+    uploadTip1: '建议上传尺寸为360*240px的图片',
+    uploadTip2: '图片仅支持jpg或png格式',
+    uploadTip3: '图片不得大于2M',
+    orderNumber: '序号',
+    customerId: '客户编号',
+    customerName: '客户名称',
+    customerAccount: '客户账号',
+    rechargeAmountTab: '充值金额(元)',
+    availableAmountTab: '账户可用余额(元)',
+    updatedAt: '更新时间',
+    offset: '抵充',
+    deduct: '消费扣除',
+    rulesa: {
+        status: '请选择充值类型',
+        userId: '请输入客户名称',
+        amount: '请输入充值金额',
+    }
+}

+ 54 - 0
src/i18n/zh/flowPool.js

@@ -0,0 +1,54 @@
+export default {
+    // 流量池
+    label: "流量池名称",// 流量池名称
+    source: "运营商名称",// 运营商名称
+    trafficPoolType: "流量池类型",
+    trafficPoolStatus: "流量池状态",
+    simRariffId: "资费ID",
+    simRariff: "资费",
+    expireTime: "过期时间",
+    updated_at: "更新日期",
+
+    id: "序号",
+    poolNumber: "流量池编号",
+    cardRariffName: "卡资费名称",
+    cardFlow: "卡套餐",
+    cardNum: "已激活卡数/总卡数量",
+    UsedMonth: "本月已用",
+    surplusFlow: "剩余流量",
+    totalFlow: "已使用流量/总流量",
+    warnStatus: "预警状态",
+    exceededFlow: "已超流量",
+    poolSize: "池大小",
+    userId: "用户ID",
+
+    // 预警
+    proportion: "总用量占比",
+    shutdown: "达量停机",
+    netWork: "达量断网",
+    remind: "提醒次数",
+    singleWarn: "单次用量预警",
+    poolWarn: "池已用量预警",
+    earlyWarn: "达量预警",
+
+    // 按钮
+    Detail: "查看池",
+    exportCard: "导卡",
+    warnTabs: "预警设置",
+    infoTabs: "基础信息",
+
+    // 流量池
+    status:'流量池状态',
+    flowPoolStatus:'请选择流量池状态',
+    operator:'运营商名称',
+    operatorName:'请选择运营商名称',
+    start_time:'更新时间',
+    start_timeName:'请选择更新时间',
+    ICCIDlabel:'ICCID',
+    ICCIDName:'请选择ICCID',
+    tariffName:'资费名称',
+    ActivatedName:'已激活/总卡数量',
+    HaveBeenUsedName:'已使用流量',
+    TimeName:'过期时间',
+    Waring:'预警'
+}

+ 23 - 0
src/i18n/zh/forewarning.js

@@ -0,0 +1,23 @@
+export default {
+    EarlyWarningTank:'预警池',
+    PoolEarlyWarning:'池预警',
+    clientWarning:'客户端·池预警设置',
+    TakeUpOf:'总用量占比',
+    PleaseEnter:'请输入',
+    PleaseSelect:'请选择',
+    reach:'达量预警',
+    ShutDown:'达量停机',
+    NetworkOutage:"达量断网",
+    ReminderTimes:'提醒次数',
+    TimesMonth:'次/月',
+    SingleCard:'客户端·单卡预警设置',
+    SingleCardUsage:'单卡用量预警',
+    ManagementSide:'管理端预警设置',
+    consumed:'池已用量预警',
+    forewarning:'预警',
+    EarlyWarningSetting:'预警设置',
+    AccountBalanceAlarm:'账号余额报警',
+    ReachWarning:'达量预警',
+    EarlyWarningPhone:'预警手机',
+    WarningMailbox:'预警邮箱'
+}

+ 88 - 0
src/i18n/zh/form.js

@@ -0,0 +1,88 @@
+export default {
+  "Key": "id",
+  "Id": "操作",
+  "Delete": "删除",
+  "DeleteConfirm": "确认删除该信息?",
+  "Edit": "编辑",
+  "Add": "添加",
+  "Cancel": "取消",
+  "Confirm": "确定",
+  "Search": "搜索",
+  "Reset": "重置",
+  "Export": "导出",
+  "Import": "导入",
+  "Status": "状态",
+  "ExportSuccess": "导出成功",
+  "ImportSuccess": "导入成功",
+  "ExportFailed": "导出失败",
+  "ImportFailed": "导入失败",
+  "ExportConfirm": "确定要导出吗?",
+  "ImportConfirm": "确定要导入吗?",
+  "ExportConfirm": "确定要导出吗?",
+  "PleaseEnterThe": "请输入",
+
+  "DBdistributorSource": "DB来源",
+
+
+  // 菜单表单
+  "Name": "菜单名称",
+  "Icon": "图标",
+  "SortNumber": "序号",
+  "Refresh": "缓存",
+  "Path": "标识",
+  "Url": "路由",
+
+  //字典
+  dictionaryName: "字典名称",
+  dictionaryType: "字典类型",
+  dictionaryValue: "值",
+  dictionarySortNumber: "序号",
+  dictionaryDescription: "描述",
+  createUser: "创建人",
+  updateUser: "更新人",
+  createTime: "创建时间",
+  updateTime: "更新时间",
+
+  // 分销商
+  distributorName: "分销商名称",
+  //联系人
+  distributorContact: "联系人",
+  distributorPhone: "联系电话",
+
+  // 数据池表单
+  datapoolForm: {
+    title: "创建机卡池",
+    dealer: "经销商",
+    poolName: "池名称",
+    operator: "运营商",
+    planType: "套餐类型",
+    displayFlow: "显示流量",
+    plan: "套餐",
+    pleaseSelect: "请选择",
+    pleaseEnter: "请输入",
+    submit: "提交",
+    cancel: "取消"
+  },
+
+  // 新卡表单
+  cardForm: {
+    addTitle: "添加新卡",
+    editTitle: "编辑卡片",
+    title: "添加新卡",
+    iccid: "ICCID",
+    cardNumber: "卡号",
+    category: "分类",
+    imei: "IMEI",
+    plan: "套餐",
+    riskGroup: "风控组",
+    dataUsage: "流量用量",
+    cardStatus: "卡状态",
+    operator: "运营商",
+    distributor: "经销商",
+    expirationDate: "到期时间",
+    pleaseEnter: "请输入",
+  },
+
+  alter:'变更',
+  confirm:'保存'
+}

+ 12 - 0
src/i18n/zh/global.js

@@ -0,0 +1,12 @@
+
+export default {
+  "logOut": "退出登录",
+  "newMenu": "新增菜单",
+  common: {
+    search: '搜索',
+    reset: '重置',
+    edit: '编辑',
+    delete: '删除',
+    operations: '操作'
+  }
+}

+ 34 - 0
src/i18n/zh/index.js

@@ -0,0 +1,34 @@
+import login from './login'
+import global from './global'
+import form from './form'
+import supplier from './supplier'
+import plan from './plan'
+import dataPackage from './dataPackage'
+import customer from './customer'
+import customerPackage from './customerPackage'
+import lotCard from './lotCard'
+import tariffManagement from './tariffManagement'
+import flowPool from './flowPool'
+import financialManagement from './financialManagement'
+import error from './error'
+import setting from './setting'
+import forewarning from './forewarning'
+import order from './order'
+export default {
+  login,
+  global,
+  form,
+  supplier,
+  plan,
+  dataPackage,
+  customer,
+  customerPackage,
+  lotCard,
+  tariffManagement,
+  flowPool,
+  financialManagement,
+  error,
+  setting,
+  forewarning,
+  order
+}

+ 7 - 0
src/i18n/zh/login.js

@@ -0,0 +1,7 @@
+export default {
+  'Welcome': '欢迎登录',
+  userName:'用户名',
+  password:'密码',
+  RememberAccountNumber:'记住账号',
+  disembark:'登录'
+}

+ 193 - 0
src/i18n/zh/lotCard.js

@@ -0,0 +1,193 @@
+export default {
+    // 搜索
+    please: "请输入",
+    // 卡列表
+    created_at: "创建时间",
+    updated_at: "更新时间",
+    deleted_at: "删除时间",
+    msisdn: "主电话卡",
+    source: "来源",
+    status: "主卡状态",
+    CreateTime: "卡创建时间",
+    ExpireTime: "到期时间",
+    UserId: "用户ID",
+    iccid: "ICCID",
+    himsi: 'HIMSI',
+    tariff: '资费ID',
+    ServiceUsageMode: '激活卡套餐的方法',
+    LastModifyTime: '最后修改时间',
+
+
+    // 流量列表
+    superior_id: "流量包Id",
+    period: "流量包套餐时长",
+    periodType: "周期类型",
+    statusTraffic: "流量包状态",
+    type: "流量使用限制类型",
+    cardPools: "卡池ID",
+    desc: "描述",
+    ext: "扩展属性",
+    name: "流量包名",
+    refuelingPackage: "加油包",
+    sourcePlan: "供应商",// 流量套餐列表
+
+    // 套餐列表
+    bundleDesc: "流量包说明",
+    dataBundleId: "流量包ID",
+    orderEndTime: "过期时间",
+    orderActiveTime: "套餐激活时间",
+    orderCreateTime: "订购时间",
+    orderExpireTime: "到期时间",
+    orderRemainTime: "套餐剩余可用时间",
+    isSupportFuelpack: "周期类型",
+    orderChannel: "订购渠道",
+    orderID: "平台订单ID",
+    packageType: "包类型",
+    subscriptionKey: "子订单标识",
+    packageStatus: "订阅关系状态",
+    price: "订单价格",
+    deductionModel: "套餐收费方式",
+    currency: "货币",
+    is_Refuel: "是否为附加包",
+    quantity: "采购数量",
+    totalAmount: "订单金额",
+    sendLang: "发送的购买短信语言",// 发送的购买短信的语言
+
+
+
+    // 弹窗查询卡
+    titleSim: "查询卡",
+    cardHlrId: "主卡HLR标记",
+    cardOtaId: "主卡的OTA设备",
+    realRuleListName: "实名制对象",
+    serviceUsageMode: "激活卡套餐",
+    statusSim: "主卡状态",
+
+    titleIssued: "下发用户",
+    confirmTitleIssued: "确认下发用户吗",
+    titleOrder: "订购套餐",
+    confirmTitleOrder: "确认订购套餐吗",
+    titleCancelOrder: "取消订单",
+    confirmTitleCancelOrder: "确认取消订单吗",
+    orderEnd: "退订",
+    confirmOrderEnd: "确认退订吗",
+    tipsOrder: "请选择数据",
+
+
+    // 弹窗按钮
+    close: "关闭",
+    trafficUse: "查看流量消耗",
+
+    // 查询流量历史配额
+    time: '使用时间',
+    qtaconsumption: '流量使用总量',
+    mcc: '国家',
+    appName: '应用程序名称',
+
+    // 卡-订单
+    orderType: "订单状态",
+
+    // 资费管理搜索
+    soundName:'请选择供应商',
+    FlowTypeName:"请选择流量类型",
+    BillingTypeName:'请选择计费分类',
+    ChargingCycleName:'请选择计费周期',
+
+    // 卡清单管理
+    iccidType:'主卡状态',
+    iccidTypeName:'请选择主卡状态',
+    statrt_time:'创建时间',
+    statrt_timeType:'请选择创建时间',
+    Renewal_time:'更新时间',
+    Renewal_timeType:'请选择更新时间',
+    sourceCard:'来源',
+    sourceCardType:'请选择来源',
+
+    // 卡详情
+     currencyBalance:'SIM货币余额',
+     ActivationDate:'卡激活日期',
+     DueDate:'卡到期日期',
+     validity:'有效期',
+     supplier:'供应商',
+     month:'月',
+     CurrentPackageInformation:'当前套餐信息',
+     PackageName:'资费名称',
+     PackageStatus:'流量包状态',
+     Activated:'已激活',
+     Off:'关闭',
+     expired:'已过期',
+     NotInUse:'未使用',
+     WhetherToGive:'是否赠送套餐',
+     Yes:'是',
+     No:'否',
+     PackageActivationDate:'流量包激活日期',
+     PackageExpirationDate:'套餐过期日期',
+     PlaAvailableData:'套餐可用流量',
+     UnlimitedFlow:'无限流量',
+     PlanUsedData:'套餐已使用流量',
+     PackageUseTrafficToday:'套餐今日使用流量',
+     PackageValidDays:'套餐有效天数',
+     MonthlyConsumption:'月用量',
+     CardPackageInformation:'卡资费信息',
+     EarlyWarningInformation:'预警信息',
+     RechargeRecord:'充值记录',
+     UsageAmount:'使用量',
+     OperationRecord:'操作记录',
+     SuspensionService:'暂停SIM卡服务',
+     RestoreService:'恢复SIM卡服务',
+     CloseCard:'注销SIM卡',
+     Jan:'1月',
+     February:'2月',
+     March:'3月',
+     April:'4月',
+     May:'5月',
+     June:'6月',
+     July:'7月',
+     August:'8月',
+     September:'9月',
+     October:'10月',
+     November:'11月',
+     December:'12月',
+     AvailableFlow:'可用流量',
+     Usedflow:'已使用流量',
+     TrafficUsedToday:'今日使用流量',
+     OrderNumber:'订单号',
+     PurchasePackage:'购买套餐',
+     OrderType:'订单类型',
+     PackagePrice:'套餐价格',
+     operator:'运营商',
+     PaymentStatus:'支付状态',
+     OrderDate:'下单日期',
+     ID:'编号',
+     FlowRate:'流量',
+     CargoAreaCode:'流量产生国家或地区编号',
+     DetailDate:'CDR数据的记录日期',
+     settingUser:'操作人',
+     Controls:'操作',
+     remark:'备注',
+     userName:'客户名称',
+     bind:'MSISDN',
+     GenerationDate:'SIM生成日期',
+     SimStatus:'SIM状态',
+     TotalFlow:'已使用总流量',
+     MinutesIncomingVoiceCalls:'语音呼入分钟数',
+     MinutesOutgoingVoiceCalls:'语音呼出分钟数',
+     TotalVoiceMinutes:'总语音分钟数',
+     NumberTextMessagesSent:'发短信数',
+     ClosingDate:'SIM关闭日期',
+     CardPackage:'卡资费',
+     EarlyWarningState:'预警状态',
+     PoolName_Number:'池名称/编号',
+     TheExpirationTime:'沉默期',
+     DefaultRate:'默认速率',
+     CardDetails:'卡详情',
+     TariffName:'资费名称',
+     CardType:'卡类型',
+     SilentPeriod:'沉默期',
+     FormationPool:'组池',
+     FlowPool:'流量池',
+     QuantityCardsPurchased:'购卡数量',
+     DatapackageStatus:'流量包状态',
+     UsedpackFlow:'已用加油包流量',
+     FuelPackFlowAvailable:'可用加油包流量'
+}  

+ 51 - 0
src/i18n/zh/order.js

@@ -0,0 +1,51 @@
+export default {
+    CardPurchase:'购卡',
+    TariffName:'资费名称',
+    CardType:'卡类型',
+    SilentPeriod:'沉默期',
+    FormationPool:'组池',
+    FlowPool:'流量池',
+    QuantityCardsPurchased:'购卡数量',
+    OrderNum:'订单编号',
+    unshipped:'未发货',
+    shipped:'已发货',
+    MinimumSubscriptionPeriod:'最短订阅周期',
+    MaximumSubscriptionPeriod:'最长订阅周期',
+    Months:'个月',
+    BillingMode:'计费方式',
+    SettlementCycle:'结算周期',
+    StandardPrice:'标准价格',
+    CardNum:'卡数量',
+    AllocationCardNumber:'分配卡号',
+    OrderDetails:'订单详情',
+    CardStatus:'卡状态',
+    CreationTime:'创建时间',
+    normal:'正常',
+    unsubscribe:'退订',
+    TobeReviewed:'待审核',
+    PassTheExamination:'审核通过',
+    rejected:'已驳回',
+    examine:'审核',
+    UploadContract:'上传合同',
+    ViewTheContract:'查看合同',
+    UploadAmount:'制卡费',
+    view:'查看',
+    ChangeValidity:'续费',
+    SalesContract:'销售合同',
+    PurchaseAmount:'采购金额',
+    SerialNumber:'序号',
+    AuditStatus:'审核状态',
+    LogisticsStatus:'物流状态',
+    NumberCardsPurchased:'购卡数',
+    SilentPeriod:'静默期',
+    CarrierName:'运营商名称',
+    tariff:'资费',
+    ContractPhoto:'合同照片',
+    OrderTime:'下单时间',
+    IncorrectInput:'输入有误',
+    ReturnTheCard:'退卡',
+    AuditOpinion:'审核意见',
+    TurnDown:'驳回',
+    ReturnAmount:'退货金额',
+    ChangeTariff:'变更资费'
+}

+ 75 - 0
src/i18n/zh/plan.js

@@ -0,0 +1,75 @@
+
+export default {
+    feeName: '资费名称',
+    enterFeeName: '请输入资费名称或编码',
+    operatorType: '运营商类型',
+    selectOperatorType: '请选择',
+    addFee: '新增资费',
+    editFee: '编辑资费',
+    id: '序号',
+    feeCode: '资费编码',
+    supplierName: '供应商名称',
+    dataType: '流量类型',
+    billingCategory: '计费分类',
+    billingCycle: '计费周期',
+    packageSize: '资费包大小',
+    standardPrice: '标准价格',
+    cycleLimitation: '周期限制',
+    status: {
+      normal: '正常',
+      disabled: '禁用',
+      offline: '下架'
+    },
+    operatorTypes: {
+      general: '通用',
+      specific: '定向'
+    },
+    searchExecuted: '执行搜索操作',
+    feeDeleted: '已删除资费 {name}',
+    feeUpdated: '已更新资费 {name}',
+    feeAdded: '已添加新资费 {name}',
+    basicInfo: '基本信息',
+    supplier: '运营商',
+    selectSupplier: '请选择运营商',
+    supplier1: '供应商1',
+    supplier2: '供应商2',
+    general: '通用',
+    specific: '定向',
+    data: '流量',
+    voice: '语音',
+    nb: 'NB',
+    sms: '短信',
+    billingInfo: '计费信息',
+    daily: '按天',
+    monthly: '按月',
+    enterPackageSize: '请输入资费包大小',
+    enterPrice: '请输入价格',
+    currency: '元',
+    billingCycleType: '计费周期类型',
+    month: '月',
+    subscriptionPeriod: '订购周期',
+    minimum: '最短',
+    maximum: '最长',
+    monthsMin: '个月,最短',
+    monthsMax: '个月',
+    overagePrice: '超套价格',
+    enterOveragePrice: '请输入超套价格',
+    connectionTimes: '连接数(次)',
+    times: '次',
+    voiceRate: '语音被叫',
+    minute: '分钟',
+    billingCode: '计费函数',
+    autoGenerated: '自动生成',
+    feeCodeRequired: '请输入资费编码',
+    feeNameRequired: '请输入资费名称',
+    supplierRequired: '请选择运营商',
+    dataTypeRequired: '请选择流量类型',
+    billingCategoryRequired: '请选择计费分类',
+    statusRequired: '请选择状态',
+    billingCycleRequired: '请选择计费周期',
+    packageSizeRequired: '请输入资费包大小',
+    standardPriceRequired: '请输入标准价格',
+    minPeriodRequired: '请输入最短订购周期',
+    maxPeriodRequired: '请输入最长订购周期',
+    fillRequiredFields: '请填写所有必填字段'
+  }

+ 10 - 0
src/i18n/zh/setting.js

@@ -0,0 +1,10 @@
+export default {
+    editSuccess:'修改成功',
+    addSuccess:'添加成功',
+    ControlsSuccess:'操作成功',
+    deleteSuccess:'删除成功',
+     USD:'美金',
+    yuan:'元',
+    add:'添加',
+    edit:'修改'
+}

+ 85 - 0
src/i18n/zh/supplier.js

@@ -0,0 +1,85 @@
+export default {
+    addSupplier: '新增供应商',
+    editSupplier: '编辑供应商',
+    supplierName: '供应商名称',
+    enterSupplierName: '请输入供应商名称',
+    operatorType: '运营商类型',
+    selectOperatorType: '请选择运营商类型',
+    id: '序号',
+    operatorCode: '运营商编码',
+    operatorName: '运营商名称',
+    updateTime: '更新时间',
+    searchExecuted: '搜索已执行',
+    searchReset: '搜索条件已重置',
+    operatorTypes: {
+      foreign_local: '境外本地',
+      international: '国际通用',
+      chinamobile: '中国移动',
+      chinaunicom: '中国联通',
+      chinatelecom: '中国电信'
+    },
+    basicInfo: '基本信息',
+    operatorApiConfig: '运营商API配置',
+    advancedConfig: '高级配置',
+    apiTemplate: 'API模板',
+    selectApiTemplate: '选择API模板',
+    apiTemplates: {
+      telecom_CMP: '电信CMP'
+    },
+    apiUrl: 'API地址',
+    enterApiUrl: '输入API地址',
+    realNameAuthUrl: '实名认证地址',
+    enterRealNameAuthUrl: '输入实名认证地址',
+    realNameUrlParam: '实名URL参数',
+    enterRealNameUrlParam: '输入实名URL参数',
+    appKey: '应用密钥',
+    enterAppKey: '输入应用密钥',
+    apiSecret: 'API密钥',
+    enterApiSecret: '输入API密钥',
+    key: '密钥',
+    enterKey: '输入密钥',
+    stopCardAction: '停卡动作',
+    selectStopCardAction: '选择停卡动作',
+    stopCardActions: {
+      suspend: '暂停'
+    },
+    needManualRealName: '需要手动实名',
+    need: '需要',
+    noNeed: '不需要',
+    autoSyncUsage: '自动同步用量',
+    enable: '启用',
+    disable: '禁用',
+    useOperatorApi: '使用运营商API',
+    call: '调用',
+    noCall: '不调用',
+    setQuantityLimit: '设置用量限制',
+    quantityLimit: '达量断网',
+    noQuantityLimit: '不达量断网',
+    useOperatorDataPool: '使用运营商数据池',
+    silentPeriod: '静默期',
+    enterSilentPeriod: '输入静默期',
+    unusedSuspensionDays: '未使用停机天数',
+    enterDays: '输入天数',
+    maxWhitelistAdditions: '最大白名单添加次数',
+    enterTimes: '输入次数',
+    totalActiveWhitelists: '总活跃白名单数',
+    enterCount: '输入数量',
+    dailyWhitelistRemovals: '每日白名单移除数',
+    whitelistAddOrder: '白名单添加顺序',
+    selectOrder: '选择顺序',
+    noWhitelist: '无白名单',
+    numberGenerationRule: '号码生成规则',
+    enterNumberGenerationRule: '输入号码生成规则',
+    supplierNameRequired: '供应商名称为必填项',
+    operatorTypeRequired: '运营商类型为必填项',
+    apiTemplateRequired: 'API模板为必填项',
+    apiUrlRequired: 'API地址为必填项',
+    appKeyRequired: '应用密钥为必填项',
+    apiSecretRequired: 'API密钥为必填项',
+    needManualRealNameRequired: '需要手动实名为必填项',
+    autoSyncUsageRequired: '自动同步用量为必填项',
+    useOperatorApiRequired: '使用运营商API为必填项',
+    useOperatorDataPoolRequired: '使用运营商数据池为必填项',
+    silentPeriodRequired: '静默期为必填项',
+    fillRequiredFields: '请填写所有必填字段'
+  }

+ 52 - 0
src/i18n/zh/tariffManagement.js

@@ -0,0 +1,52 @@
+export default {
+    // 资费计划
+    simDataPlanId: "流量包",
+    label: "资费名称",
+    userId: "客户",
+    source: "供应商名称",
+    trafficType: "流量类型",
+    billingType: "计费分类", //计费方式
+    billingCycle: "计费周期",
+    bagSize: "资费包大小",
+    pricing: "结算价格",
+    settlementCycle: "周期限制", // 结算周期
+    settlementCycleLabel: "周期限制(月)", // 结算周期
+
+    billingMethod: "计费方式",
+    sourcePrice: "来源价格",
+    currency: "结算币种",
+
+
+    id: '序号',
+    feeCode: '资费编码',
+    feeStatus: "状态",
+
+    cycleBuy: "有效期(月)",
+    priceplan: "超套价格",
+
+    // 按钮
+    addPlanBtn: "添加资费计划",
+
+    // 资费管理搜索
+    soundName: '供应商名称',
+    FlowType: '流量类型',
+    BillingType: '计费分类',
+    ChargingCycle: '计费周期',
+    userName: '客户名称',
+    MRCName: 'MRC费(月租)',
+    networkName: '网络接入费',
+    ActivatedNames: '流量大小',
+    SetMeal:'套餐',
+    SelectiveTrafficPacket:'选择流量包',
+    BasicInformation:'基本信息',
+    BillingInformation:'计费信息',
+    PackageTermMonth:'套餐期限(月)',
+    PackagePrice:'套餐价格',
+    Currency:'币种',
+    AddPackage:'添加套餐',
+    endDate:'有效期',
+    BillingMode:'计费方式',
+    TestFlowPacket:'测试流量包',
+    simDataPlanIdName:'流量包名称',
+    TestFlowPacketName:'测试流量包名称'
+}

+ 52 - 0
src/main.js

@@ -0,0 +1,52 @@
+import { createApp } from "vue";
+import App from "./App.vue";
+import router, { setupRouter } from "@/router";
+import { i18n } from "@/i18n";
+import { setupStore } from "@/store";
+
+import ArcoVue from "@arco-design/web-vue";
+import "@arco-design/web-vue/dist/arco.less";
+
+/* 其他模块引入 */
+import "virtual:svg-icons-register";
+// 引入 Symbol icon图标
+import "@/assets/iconsvg/iconfont";
+import SvgIcon from "@/components/Svg-icon/SvgIcon.vue";
+// 额外引入图标库
+import ArcoVueIcon from "@arco-design/web-vue/es/icon";
+// 引入上传组件
+import upload from "./components/upload/index.vue";
+
+async function appInit() {
+  const app = createApp(App);
+  // 注入组件
+  app.component("SvgIcon", SvgIcon);
+  // 挂载状态管理
+  await setupStore(app);
+  // arco-design
+  app.use(ArcoVue);
+  app.use(ArcoVueIcon);
+  app.use(i18n);
+  app.component("upload", upload);
+  window["$t"] = i18n.global.t;
+
+
+  app.config.warnHandler = () => null;
+
+  // 挂载路由
+  await setupRouter(app);
+  // 路由准备就绪后挂载APP实例
+  await router.isReady();
+  // 挂载到页面
+  app.mount("#app", true);
+
+  // 挂载到 window
+  window["$vue"] = app;
+}
+
+appInit().then(() => {
+  // 捕获全局错误
+  // window.addEventListener("unhandledrejection", event => {
+  //   console.warn(`UNHANDLED PROMISE REJECTION: ${event.reason}`);
+  // });
+});

+ 9 - 0
src/mixins/index.js

@@ -0,0 +1,9 @@
+import { dictionaryDeleteAll } from "@/api/path/dict.js";
+import { ref } from "vue";
+// 获取字典
+export function Getdictionary(params) {
+    // 返回 Promise
+    return dictionaryDeleteAll({ typeKey: params }).then((res) => {
+        return res.data; // 将响应数据返回
+    });
+}

+ 23 - 0
src/router/index.js

@@ -0,0 +1,23 @@
+import { pinia } from '@/store'
+import { createRouter, createWebHistory } from 'vue-router'
+import { createRouterGuards } from './router.guards.js'
+import { useSystemStore } from '@/store/modules/systemStore'
+import { systemRoutes } from './router.system.js'
+import { updateRouteByMenu  } from "./router.update.js"
+
+const systemStore = useSystemStore(pinia)
+
+const router = createRouter({
+  history: createWebHistory(),
+  routes: systemRoutes
+});
+
+
+export async function setupRouter(app) {
+  await updateRouteByMenu(router, systemStore)
+  app.use(router)
+  // 创建路由守卫
+  createRouterGuards(router, systemStore)
+}
+
+export default router;

+ 37 - 0
src/router/router.guards.js

@@ -0,0 +1,37 @@
+import { fn_logout } from '@/utils'
+
+const paths  = ['/login']
+
+export function createRouterGuards(router, systemStore) {
+  const routes = router.getRoutes()
+
+  // 前置
+  router.beforeEach(async (to, from, next) => {
+    // 如果用户进入了登录页面就相当于退出
+    if (paths.includes(to.path)) {
+    
+      fn_logout()
+      return next()
+    }
+
+    // 验证菜单
+    const menus = systemStore.getMenus
+    if(menus.length == 0) return next('/login')
+    if (to.matched.length === 0) {
+      return  next('/errors')
+    }
+  
+    next()
+  })
+
+  router.afterEach((to, _, next) => {
+    // const Loading = window['$loading']
+    // setTitle(to.meta.title as string | undefined)
+    // Loading && Loading.submit-success()
+  })
+
+  // 错误
+  router.onError(error => {
+    console.log(error, '路由错误')
+  })
+}

+ 81 - 0
src/router/router.system.js

@@ -0,0 +1,81 @@
+
+// 异步模块
+// const LAYOUT = () => import('@/components/Layout/Layout.vue')
+const ERROR = () => import('@/views/exception/errors.vue')
+
+// login
+const LOGIN = () => import("@/views/login/index.vue")
+const HOME = () => import("@/views/home/index.vue")
+
+export const publicMenu = [
+  {
+    path: "/home",
+    name: "home",
+    component: HOME,
+    meta: {
+      title: '首页',
+      icon: 'Dh-shouye3'
+    }
+  },
+]
+
+export const systemRoutes = [
+  {
+    path: "/login",
+    name: "login",
+    component: LOGIN,
+    meta: {
+      title: '登录'
+    }
+  },
+  {
+    path: '/errors',
+    name: 'errors',
+    meta: {
+      title: '异常页',
+    },
+    component: ERROR,
+  }
+];
+
+// const systemRouter = [
+//   {
+//     path: '/system',
+//     name: 'system',
+//     redirect: '/system-user',
+//     meta: {
+//       icon: "menu-gongju",
+//       title: '系统',
+//     },
+//     children: [
+//       {
+//         path: '/system-user',
+//         name: 'system-user',
+//         meta: {
+//           title: '员工账号',
+//         },
+//         component: () => import('@/views/system/user/index.vue')
+//       },
+//       {
+//         path: '/system-role',
+//         name: 'system-role',
+//         meta: {
+//           title: '角色权限',
+//         },
+//         component: () => import('@/views/system/role/index.vue')
+//       },
+//       {
+//         path: '/system-menu',
+//         name: 'system-menu',
+//         meta: {
+//           title: '菜单管理',
+//         },
+//         component: () => import('@/views/system/menu/index.vue')
+//       }
+//     ]
+//   }
+// ]
+
+
+
+// export default systemRouter

+ 75 - 0
src/router/router.update.js

@@ -0,0 +1,75 @@
+import { systemUserInfoMenu } from "@/api/path/system.api";
+import { systemRoutes } from "./router.system";
+import { getLocalStorage, getParseLang } from '@/utils'
+import { lang } from '@/settings/designSetting'
+import { publicMenu } from './router.system.js'
+
+const LAYOUT = () => import("@/components/Layout/Layout.vue");
+
+const findPath = (data) => {
+  if (data.children && data.children.length > 0) {
+    return findPath(data.children[0]);
+  } else {
+    return data;
+  }
+};
+
+// 生成路由
+const comp = import.meta.glob("../views/**/index.vue");
+const component = (view) => {
+  return () => comp[`../${view}`]();
+};
+
+
+
+// 路由格式转化
+const toRoutesJson = (data) => {
+  const LANG =  getLocalStorage("LANG") || {lang}
+  return data.map((item) => {
+    const routeItem = {
+      path: `/${item.path}`,
+      name: item.path,
+      meta: {
+        title: getParseLang(item.name, LANG.lang),
+        icon: item.icon,
+      },
+    };
+    if (item.url && item.type == "2") {
+      routeItem.component = component(item.url);
+    }
+    if (item.children && item.children.length > 0) {
+      routeItem.children = toRoutesJson(item.children);
+    }
+    return routeItem;
+  });
+};
+
+export const updateRouteByMenu = async (router, systemStore) => {
+  if(!systemStore.getToken) {
+    router.push({
+      name: "login",
+    })
+    return
+  }
+  try {
+    const { data: menuList } = await systemUserInfoMenu();
+    systemStore.setStateValue({
+      key: "menus",
+      value: menuList || [],
+      localStorage: true,
+    });
+    const pathHome = findPath(publicMenu[0]);
+    const mainRoutes = toRoutesJson(menuList);
+    const routes = {
+      path: "/",
+      name: "main",
+      redirect: pathHome.path,
+      component: LAYOUT,
+      children: [...publicMenu,...mainRoutes],
+    };
+    router.options.routes = [routes, ...systemRoutes];
+    await router.addRoute(routes);
+  } catch(err) {
+    console.log(err)
+  }
+};

+ 10 - 0
src/settings/designSetting.js

@@ -0,0 +1,10 @@
+// 默认语言
+export const lang = "zh-CN" 
+
+// 主题配置
+export const theme = {
+  // 默认是否开启深色主题
+  darkTheme: true,
+  //默认主题色
+  appTheme: '#1890ff'
+}

+ 11 - 0
src/settings/pagination.js

@@ -0,0 +1,11 @@
+export const getInitPagination =  {
+  size: 'small',
+  total: 0,
+  pageSize: 10,
+  current: 1,
+  showPageSize: true,
+  showJumper: true,
+  hideOnSinglePage: false,
+  pageSizeOptions: [5, 10, 20, 30, 40],
+  showTotal: true,
+}

+ 9 - 0
src/store/index.js

@@ -0,0 +1,9 @@
+import { createPinia } from 'pinia';
+
+const pinia = createPinia();
+
+export function setupStore(app) {
+  app.use(pinia);
+}
+
+export { pinia };

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio