From 1788c96aea9247cc36ef8b82734997f1a6a92fb4 Mon Sep 17 00:00:00 2001
From: riku <risaku@163.com>
Date: 星期五, 23 八月 2024 11:07:42 +0800
Subject: [PATCH] 新增新版本。静安区特供版

---
 src/composables/fetchData.js                       |    1 
 src/utils/chart/chart-option.js                    |   13 
 src/constant/radio-options/options-jingan.js       |   31 
 src/utils/map/dialog.js                            |   26 
 src/model/Factor.js                                |    1 
 src/api/missionApi.js                              |   18 
 src/components/search/SearchBar.vue                |   27 
 src/components/search/OptionTime.vue               |   47 
 src/components/map/MapScene.vue                    |    1 
 src/components/map/MapToolbox.vue                  |   36 
 src/components/monitor/DataTable.vue               |   13 
 src/lib/jquery.xml2json.js                         |  200 ++
 src/constant/scene-types/options-jingan.js         |   93 
 src/constant/device-type.js                        |   54 
 src/components/search/OptionType copy.vue          |   54 
 src/views/realtimemode/component/DeviceChange.vue  |   24 
 public/favicon.ico                                 |    0 
 src/components/search/OptionType.vue               |   19 
 src/utils/factor/data.js                           |  246 ++
 src/views/LoginPage.vue                            |  185 +
 src/views/historymode/HistoryMode.vue              |   75 
 src/components/monitor/FactorTrend.vue             |   48 
 src/components/mission/MIssionCreate.vue           |   44 
 src/components/mission/MissionManage.vue           |   25 
 src/components/animation/HistoricalTrajectory.vue  |   36 
 src/views/historymode/component/DataSheet.vue      |   14 
 src/router/index.js                                |    2 
 .env.development                                   |    2 
 src/constant/scene-types/options.js                |   86 
 src/model/Legend.js                                |    9 
 src/components/monitor/FactorRadio.vue             |    1 
 src/views/historymode/HistoryMode copy.vue         |  237 ++
 src/test.xml                                       |   13 
 src/components/search/OptionLocation.vue           |   23 
 .env.production                                    |    2 
 src/model/FrameAnimation.js                        |   15 
 .env.production.jingan                             |    2 
 src/assets/common-style.css                        |   11 
 package-lock.json                                  | 2058 +++++++++++++++++++
 src/components/monitor/WeatherData.vue             |    2 
 src/components/monitor/FactorCheckbox.vue          |   19 
 src/components.d.ts                                |    3 
 src/views/realtimemode/RealtimeMode.vue            |   92 
 src/styles/elementUI.scss                          |    7 
 src/lib/jquery.soap.js                             |  792 ++++++++
 .env.development.jingan                            |    2 
 src/components/search/OptionDevice copy.vue        |   72 
 src/api/index.js                                   |   35 
 src/constant/factor-name.js                        |    1 
 src/constant/factor-unit.js                        |    4 
 src/views/realtimemode/component/RealTimeTrend.vue |    3 
 src/constant/checkbox-options/options-jingan.js    |   51 
 src/views/historymode/component/TrendAnalysis.vue  |   21 
 src/constant/scene-types.js                        |   89 
 src/components/SliderBar.vue                       |   12 
 src/model/FactorDatas.js                           |    7 
 src/components/monitor/DataSummary.vue             |    4 
 src/views/realtimemode/component/DashBoard.vue     |    9 
 package.json                                       |    9 
 src/utils/map/sector.js                            |   19 
 src/views/realtimemode/RealtimeMode copy.vue       |  186 +
 src/components/search/OptionDevice.vue             |   32 
 src/components/search/OptionMission.vue            |   21 
 src/constant/checkbox-options.js                   |  218 -
 src/utils/number.js                                |    4 
 src/constant/checkbox-options/options.js           |  173 +
 src/constant/radio-options.js                      |  158 
 src/constant/radio-options/options.js              |   74 
 68 files changed, 5,176 insertions(+), 735 deletions(-)

diff --git a/.env.development b/.env.development
new file mode 100644
index 0000000..ebe9a97
--- /dev/null
+++ b/.env.development
@@ -0,0 +1,2 @@
+# 寮�鍙戞ā寮�
+VITE_DATA_MODE='origin'
\ No newline at end of file
diff --git a/.env.development.jingan b/.env.development.jingan
new file mode 100644
index 0000000..18f406d
--- /dev/null
+++ b/.env.development.jingan
@@ -0,0 +1,2 @@
+# 寮�鍙戞ā寮忥紙閽堝闈欏畨鍖虹増鏈級
+VITE_DATA_MODE='jingan'
\ No newline at end of file
diff --git a/.env.production b/.env.production
new file mode 100644
index 0000000..4213a54
--- /dev/null
+++ b/.env.production
@@ -0,0 +1,2 @@
+# 鐢熶骇妯″紡
+VITE_DATA_MODE='origin'
\ No newline at end of file
diff --git a/.env.production.jingan b/.env.production.jingan
new file mode 100644
index 0000000..7bbc51d
--- /dev/null
+++ b/.env.production.jingan
@@ -0,0 +1,2 @@
+# 鐢熶骇妯″紡锛堥拡瀵归潤瀹夊尯鐗堟湰锛�
+VITE_DATA_MODE='jingan'
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index d551b73..61ffb58 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -20,11 +20,16 @@
         "echarts": "^5.5.0",
         "element-plus": "^2.6.2",
         "jquery": "^3.7.1",
+        "jquery-xml2json": "^0.0.8",
+        "jquery.soap": "^1.7.3",
+        "js-base64": "^3.7.7",
         "moment": "^2.30.1",
         "pinia": "^2.1.7",
+        "strong-soap": "^4.1.3",
         "unplugin-vue-components": "^0.26.0",
         "vue": "^3.4.21",
-        "vue-router": "^4.3.0"
+        "vue-router": "^4.3.0",
+        "xml2json": "^0.12.0"
       },
       "devDependencies": {
         "@rushstack/eslint-patch": "^1.3.3",
@@ -76,6 +81,55 @@
       "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==",
       "engines": {
         "node": ">=10"
+      }
+    },
+    "node_modules/@cypress/request": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/@cypress/request/-/request-3.0.1.tgz",
+      "integrity": "sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==",
+      "dependencies": {
+        "aws-sign2": "~0.7.0",
+        "aws4": "^1.8.0",
+        "caseless": "~0.12.0",
+        "combined-stream": "~1.0.6",
+        "extend": "~3.0.2",
+        "forever-agent": "~0.6.1",
+        "form-data": "~2.3.2",
+        "http-signature": "~1.3.6",
+        "is-typedarray": "~1.0.0",
+        "isstream": "~0.1.2",
+        "json-stringify-safe": "~5.0.1",
+        "mime-types": "~2.1.19",
+        "performance-now": "^2.1.0",
+        "qs": "6.10.4",
+        "safe-buffer": "^5.1.2",
+        "tough-cookie": "^4.1.3",
+        "tunnel-agent": "^0.6.0",
+        "uuid": "^8.3.2"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/@cypress/request/node_modules/form-data": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmmirror.com/form-data/-/form-data-2.3.3.tgz",
+      "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+      "dependencies": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.6",
+        "mime-types": "^2.1.12"
+      },
+      "engines": {
+        "node": ">= 0.12"
+      }
+    },
+    "node_modules/@cypress/request/node_modules/uuid": {
+      "version": "8.3.2",
+      "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz",
+      "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+      "bin": {
+        "uuid": "dist/bin/uuid"
       }
     },
     "node_modules/@element-plus/icons-vue": {
@@ -1263,6 +1317,14 @@
         }
       }
     },
+    "node_modules/@xmldom/xmldom": {
+      "version": "0.8.10",
+      "resolved": "https://registry.npmmirror.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz",
+      "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==",
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
     "node_modules/abbrev": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/abbrev/-/abbrev-2.0.0.tgz",
@@ -1270,6 +1332,14 @@
       "dev": true,
       "engines": {
         "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      }
+    },
+    "node_modules/accept-language": {
+      "version": "3.0.20",
+      "resolved": "https://registry.npmmirror.com/accept-language/-/accept-language-3.0.20.tgz",
+      "integrity": "sha512-xklPzRma4aoDEPk0ZfMjeuxB2FP4JBYlAR25OFUqCoOYDjYo6wGwAs49SnTN/MoB5VpnNX9tENfZ+vEIFmHQMQ==",
+      "dependencies": {
+        "bcp47": "^1.1.2"
       }
     },
     "node_modules/acorn": {
@@ -1364,6 +1434,22 @@
       "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
       "dev": true
     },
+    "node_modules/asn1": {
+      "version": "0.2.6",
+      "resolved": "https://registry.npmmirror.com/asn1/-/asn1-0.2.6.tgz",
+      "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
+      "dependencies": {
+        "safer-buffer": "~2.1.0"
+      }
+    },
+    "node_modules/assert-plus": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/assert-plus/-/assert-plus-1.0.0.tgz",
+      "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
     "node_modules/assertion-error": {
       "version": "1.1.0",
       "resolved": "https://registry.npmmirror.com/assertion-error/-/assertion-error-1.1.0.tgz",
@@ -1383,10 +1469,23 @@
       "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
       "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
     },
+    "node_modules/aws-sign2": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmmirror.com/aws-sign2/-/aws-sign2-0.7.0.tgz",
+      "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/aws4": {
+      "version": "1.13.1",
+      "resolved": "https://registry.npmmirror.com/aws4/-/aws4-1.13.1.tgz",
+      "integrity": "sha512-u5w79Rd7SU4JaIlA/zFqG+gOiuq25q5VLyZ8E+ijJeILuTxVzZgp2CaGw/UTw6pXYN9XMO9yiqj/nEHmhTG5CA=="
+    },
     "node_modules/axios": {
-      "version": "1.6.8",
-      "resolved": "https://registry.npmmirror.com/axios/-/axios-1.6.8.tgz",
-      "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==",
+      "version": "1.7.4",
+      "resolved": "https://registry.npmmirror.com/axios/-/axios-1.7.4.tgz",
+      "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==",
       "dependencies": {
         "follow-redirects": "^1.15.6",
         "form-data": "^4.0.0",
@@ -1398,12 +1497,36 @@
       "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
       "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
     },
+    "node_modules/bcp47": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/bcp47/-/bcp47-1.1.2.tgz",
+      "integrity": "sha512-JnkkL4GUpOvvanH9AZPX38CxhiLsXMBicBY2IAtqiVN8YulGDQybUydWA4W6yAMtw6iShtw+8HEF6cfrTHU+UQ==",
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/bcrypt-pbkdf": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+      "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
+      "dependencies": {
+        "tweetnacl": "^0.14.3"
+      }
+    },
     "node_modules/binary-extensions": {
       "version": "2.3.0",
       "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz",
       "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
       "engines": {
         "node": ">=8"
+      }
+    },
+    "node_modules/bindings": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmmirror.com/bindings/-/bindings-1.5.0.tgz",
+      "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
+      "dependencies": {
+        "file-uri-to-path": "1.0.0"
       }
     },
     "node_modules/boolbase": {
@@ -1416,7 +1539,6 @@
       "version": "1.1.11",
       "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz",
       "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dev": true,
       "dependencies": {
         "balanced-match": "^1.0.0",
         "concat-map": "0.0.1"
@@ -1433,6 +1555,11 @@
         "node": ">=8"
       }
     },
+    "node_modules/brackets2dots": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/brackets2dots/-/brackets2dots-1.1.0.tgz",
+      "integrity": "sha512-DEIJz+ebFQ2SYPpXd8owCjy+8H+9N2Pd9DeSf0J33oavLyBYpAtjLg/Z/RmdJdTeHmKVva+L411HjnvyV2rSOA=="
+    },
     "node_modules/cac": {
       "version": "6.7.14",
       "resolved": "https://registry.npmmirror.com/cac/-/cac-6.7.14.tgz",
@@ -1440,6 +1567,24 @@
       "dev": true,
       "engines": {
         "node": ">=8"
+      }
+    },
+    "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==",
+      "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/callsites": {
@@ -1450,6 +1595,11 @@
       "engines": {
         "node": ">=6"
       }
+    },
+    "node_modules/caseless": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmmirror.com/caseless/-/caseless-0.12.0.tgz",
+      "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="
     },
     "node_modules/chai": {
       "version": "4.4.1",
@@ -1480,6 +1630,14 @@
       },
       "engines": {
         "node": ">=10"
+      }
+    },
+    "node_modules/charenc": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmmirror.com/charenc/-/charenc-0.0.2.tgz",
+      "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==",
+      "engines": {
+        "node": "*"
       }
     },
     "node_modules/check-error": {
@@ -1525,6 +1683,11 @@
         "node": ">= 6"
       }
     },
+    "node_modules/cldrjs": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmmirror.com/cldrjs/-/cldrjs-0.5.5.tgz",
+      "integrity": "sha512-KDwzwbmLIPfCgd8JERVDpQKrUUM1U4KpFJJg2IROv89rF172lLufoJnqJ/Wea6fXL5bO6WjuLMzY8V52UWPvkA=="
+    },
     "node_modules/color-convert": {
       "version": "2.0.1",
       "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
@@ -1563,11 +1726,15 @@
         "node": ">=14"
       }
     },
+    "node_modules/compress": {
+      "version": "0.99.0",
+      "resolved": "https://registry.npmmirror.com/compress/-/compress-0.99.0.tgz",
+      "integrity": "sha512-+qy9iMBFGTLUqKwYkAqRtZ5Xdl1PGKrSMYCuiirsxSQ5OgDoyP9QO6YoZ4feHzhpufGOwJ+y4qRXz2ytzZ1l0g=="
+    },
     "node_modules/concat-map": {
       "version": "0.0.1",
       "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
-      "dev": true
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
     },
     "node_modules/config-chain": {
       "version": "1.1.13",
@@ -1579,11 +1746,15 @@
         "proto-list": "~1.2.1"
       }
     },
+    "node_modules/core-util-is": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz",
+      "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
+    },
     "node_modules/cross-spawn": {
       "version": "7.0.3",
       "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz",
       "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
-      "dev": true,
       "dependencies": {
         "path-key": "^3.1.0",
         "shebang-command": "^2.0.0",
@@ -1591,6 +1762,14 @@
       },
       "engines": {
         "node": ">= 8"
+      }
+    },
+    "node_modules/crypt": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmmirror.com/crypt/-/crypt-0.0.2.tgz",
+      "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==",
+      "engines": {
+        "node": "*"
       }
     },
     "node_modules/cssesc": {
@@ -1622,6 +1801,25 @@
       "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
       "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
     },
+    "node_modules/curry2": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/curry2/-/curry2-1.0.3.tgz",
+      "integrity": "sha512-2vXqPLsITt0ccyczu1BFl3tc8Q6BOCsTHt+NZYasd8wp60RQIYhGM3Beis5h5FgJPT11M1rfiKOR7dPL6cL14Q==",
+      "dependencies": {
+        "fast-bind": "^1.0.0"
+      }
+    },
+    "node_modules/dashdash": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmmirror.com/dashdash/-/dashdash-1.14.1.tgz",
+      "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
+      "dependencies": {
+        "assert-plus": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
     "node_modules/data-urls": {
       "version": "5.0.0",
       "resolved": "https://registry.npmmirror.com/data-urls/-/data-urls-5.0.0.tgz",
@@ -1641,9 +1839,9 @@
       "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ=="
     },
     "node_modules/debug": {
-      "version": "4.3.4",
-      "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
-      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "version": "4.3.6",
+      "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.6.tgz",
+      "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==",
       "dependencies": {
         "ms": "2.1.2"
       },
@@ -1680,12 +1878,37 @@
       "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
       "dev": true
     },
+    "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==",
+      "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/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/des.js": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/des.js/-/des.js-1.1.0.tgz",
+      "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==",
+      "dependencies": {
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0"
       }
     },
     "node_modules/diff-sequences": {
@@ -1709,11 +1932,25 @@
         "node": ">=6.0.0"
       }
     },
+    "node_modules/dotsplit.js": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/dotsplit.js/-/dotsplit.js-1.1.0.tgz",
+      "integrity": "sha512-oFVx9VEE+M3yM4oUkaiDa+U2RhOmjXWyXwtfdc5UiHDSZWleE96FS3nx3yXMVuhLJOdI2GMThvaegkwRYPgAFQ=="
+    },
     "node_modules/eastasianwidth": {
       "version": "0.2.0",
       "resolved": "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
       "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
       "dev": true
+    },
+    "node_modules/ecc-jsbn": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmmirror.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+      "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
+      "dependencies": {
+        "jsbn": "~0.1.0",
+        "safer-buffer": "^2.1.0"
+      }
     },
     "node_modules/echarts": {
       "version": "5.5.0",
@@ -1872,12 +2109,39 @@
       "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
       "dev": true
     },
+    "node_modules/end-of-stream": {
+      "version": "1.4.4",
+      "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz",
+      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+      "dependencies": {
+        "once": "^1.4.0"
+      }
+    },
     "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"
+      }
+    },
+    "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==",
+      "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==",
+      "engines": {
+        "node": ">= 0.4"
       }
     },
     "node_modules/esbuild": {
@@ -2152,6 +2416,24 @@
         "node": ">=16.17"
       }
     },
+    "node_modules/extend": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz",
+      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+    },
+    "node_modules/extsprintf": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.3.0.tgz",
+      "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
+      "engines": [
+        "node >=0.6.0"
+      ]
+    },
+    "node_modules/fast-bind": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/fast-bind/-/fast-bind-1.0.0.tgz",
+      "integrity": "sha512-kna1xVU4nn4HW4RVwh6VYSWoii+u8EkWKS3I6YZluncEvtQwahHKhZTRPFHOOkeJK4m0/Tz2Ir9n10tARqeiXw=="
+    },
     "node_modules/fast-deep-equal": {
       "version": "3.1.3",
       "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -2221,6 +2503,11 @@
       "engines": {
         "node": "^10.12.0 || >=12.0.0"
       }
+    },
+    "node_modules/file-uri-to-path": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+      "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="
     },
     "node_modules/fill-range": {
       "version": "7.0.1",
@@ -2292,6 +2579,14 @@
         "node": ">=14"
       }
     },
+    "node_modules/forever-agent": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmmirror.com/forever-agent/-/forever-agent-0.6.1.tgz",
+      "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
+      "engines": {
+        "node": "*"
+      }
+    },
     "node_modules/form-data": {
       "version": "4.0.0",
       "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz",
@@ -2308,8 +2603,7 @@
     "node_modules/fs.realpath": {
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
-      "dev": true
+      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
     },
     "node_modules/fsevents": {
       "version": "2.3.3",
@@ -2338,6 +2632,24 @@
         "node": "*"
       }
     },
+    "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==",
+      "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-stream": {
       "version": "8.0.1",
       "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-8.0.1.tgz",
@@ -2345,6 +2657,14 @@
       "dev": true,
       "engines": {
         "node": ">=16"
+      }
+    },
+    "node_modules/getpass": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmmirror.com/getpass/-/getpass-0.1.7.tgz",
+      "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
+      "dependencies": {
+        "assert-plus": "^1.0.0"
       }
     },
     "node_modules/glob": {
@@ -2399,6 +2719,14 @@
         "node": ">=16 || 14 >=14.17"
       }
     },
+    "node_modules/globalize": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmmirror.com/globalize/-/globalize-1.7.0.tgz",
+      "integrity": "sha512-faR46vTIbFCeAemyuc9E6/d7Wrx9k2ae2L60UhakztFg6VuE42gENVJNuPFtt7Sdjrk9m2w8+py7Jj+JTNy59w==",
+      "dependencies": {
+        "cldrjs": "^0.5.4"
+      }
+    },
     "node_modules/globals": {
       "version": "13.24.0",
       "resolved": "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz",
@@ -2409,6 +2737,17 @@
       },
       "engines": {
         "node": ">=8"
+      }
+    },
+    "node_modules/gopd": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz",
+      "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+      "dependencies": {
+        "get-intrinsic": "^1.1.3"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
     "node_modules/graphemer": {
@@ -2426,6 +2765,39 @@
         "node": ">=8"
       }
     },
+    "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==",
+      "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==",
+      "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==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/hasown": {
       "version": "2.0.2",
       "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz",
@@ -2435,6 +2807,15 @@
       },
       "engines": {
         "node": ">= 0.4"
+      }
+    },
+    "node_modules/hoek": {
+      "version": "4.3.1",
+      "resolved": "https://registry.npmmirror.com/hoek/-/hoek-4.3.1.tgz",
+      "integrity": "sha512-v7E+yIjcHECn973i0xHm4kJkEpv3C8sbYS4344WXbzYqRyiDD7rjnnKo4hsJkejQBAFdRMUGNHySeSPKSH9Rqw==",
+      "deprecated": "This module has moved and is now available at @hapi/hoek. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.",
+      "engines": {
+        "node": ">=6.0.0"
       }
     },
     "node_modules/html-encoding-sniffer": {
@@ -2460,6 +2841,51 @@
       },
       "engines": {
         "node": ">= 14"
+      }
+    },
+    "node_modules/http-signature": {
+      "version": "1.3.6",
+      "resolved": "https://registry.npmmirror.com/http-signature/-/http-signature-1.3.6.tgz",
+      "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==",
+      "dependencies": {
+        "assert-plus": "^1.0.0",
+        "jsprim": "^2.0.2",
+        "sshpk": "^1.14.1"
+      },
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/httpntlm": {
+      "version": "1.8.13",
+      "resolved": "https://registry.npmmirror.com/httpntlm/-/httpntlm-1.8.13.tgz",
+      "integrity": "sha512-2F2FDPiWT4rewPzNMg3uPhNkP3NExENlUGADRUDPQvuftuUTGW98nLZtGemCIW3G40VhWZYgkIDcQFAwZ3mf2Q==",
+      "funding": [
+        {
+          "type": "paypal",
+          "url": "https://www.paypal.com/donate/?hosted_button_id=2CKNJLZJBW8ZC"
+        },
+        {
+          "type": "buymeacoffee",
+          "url": "https://www.buymeacoffee.com/samdecrock"
+        }
+      ],
+      "dependencies": {
+        "des.js": "^1.0.1",
+        "httpreq": ">=0.4.22",
+        "js-md4": "^0.3.2",
+        "underscore": "~1.12.1"
+      },
+      "engines": {
+        "node": ">=10.4.0"
+      }
+    },
+    "node_modules/httpreq": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/httpreq/-/httpreq-1.1.1.tgz",
+      "integrity": "sha512-uhSZLPPD2VXXOSN8Cni3kIsoFHaU2pT/nySEU/fHr/ePbqHYr0jeiQRmUKLEirC09SFPsdMoA7LU7UXMd/w0Kw==",
+      "engines": {
+        "node": ">= 6.15.1"
       }
     },
     "node_modules/https-proxy-agent": {
@@ -2537,7 +2963,6 @@
       "version": "1.0.6",
       "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz",
       "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
-      "dev": true,
       "dependencies": {
         "once": "^1.3.0",
         "wrappy": "1"
@@ -2546,14 +2971,24 @@
     "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
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
     },
     "node_modules/ini": {
       "version": "1.3.8",
       "resolved": "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz",
       "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
       "dev": true
+    },
+    "node_modules/invert-kv": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/invert-kv/-/invert-kv-3.0.1.tgz",
+      "integrity": "sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==",
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sindresorhus/invert-kv?sponsor=1"
+      }
     },
     "node_modules/is-binary-path": {
       "version": "2.1.0",
@@ -2565,6 +3000,11 @@
       "engines": {
         "node": ">=8"
       }
+    },
+    "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=="
     },
     "node_modules/is-core-module": {
       "version": "2.13.1",
@@ -2634,11 +3074,31 @@
         "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
       }
     },
+    "node_modules/is-typedarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz",
+      "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
+    },
+    "node_modules/isemail": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmmirror.com/isemail/-/isemail-3.2.0.tgz",
+      "integrity": "sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==",
+      "dependencies": {
+        "punycode": "2.x.x"
+      },
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
     "node_modules/isexe": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
-      "dev": true
+      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
+    },
+    "node_modules/isstream": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmmirror.com/isstream/-/isstream-0.1.2.tgz",
+      "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="
     },
     "node_modules/jackspeak": {
       "version": "2.3.6",
@@ -2655,10 +3115,51 @@
         "@pkgjs/parseargs": "^0.11.0"
       }
     },
+    "node_modules/joi": {
+      "version": "13.7.0",
+      "resolved": "https://registry.npmmirror.com/joi/-/joi-13.7.0.tgz",
+      "integrity": "sha512-xuY5VkHfeOYK3Hdi91ulocfuFopwgbSORmIwzcwHKESQhC7w1kD5jaVSPnqDxS2I8t3RZ9omCKAxNwXN5zG1/Q==",
+      "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).",
+      "dependencies": {
+        "hoek": "5.x.x",
+        "isemail": "3.x.x",
+        "topo": "3.x.x"
+      },
+      "engines": {
+        "node": ">=8.9.0"
+      }
+    },
+    "node_modules/joi/node_modules/hoek": {
+      "version": "5.0.4",
+      "resolved": "https://registry.npmmirror.com/hoek/-/hoek-5.0.4.tgz",
+      "integrity": "sha512-Alr4ZQgoMlnere5FZJsIyfIjORBqZll5POhDsF4q64dPuJR6rNxXdDxtHSQq8OXRurhmx+PWYEE8bXRROY8h0w==",
+      "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).",
+      "engines": {
+        "node": ">=8.9.0"
+      }
+    },
     "node_modules/jquery": {
       "version": "3.7.1",
       "resolved": "https://registry.npmmirror.com/jquery/-/jquery-3.7.1.tgz",
       "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg=="
+    },
+    "node_modules/jquery-xml2json": {
+      "version": "0.0.8",
+      "resolved": "https://registry.npmmirror.com/jquery-xml2json/-/jquery-xml2json-0.0.8.tgz",
+      "integrity": "sha512-PF8yh3sEeQev44ZWQ3c4Mxg1rXP8MEhOKPt5lDyaMe25SJaDI7pQvQOS5kpBPb1YC/d/0nEzUn+YewaXhAQFlw=="
+    },
+    "node_modules/jquery.soap": {
+      "version": "1.7.3",
+      "resolved": "https://registry.npmmirror.com/jquery.soap/-/jquery.soap-1.7.3.tgz",
+      "integrity": "sha512-ZNMQ2Rmy8uQ/4CSJMz0IDZCYhdmT+SiAlLFMGDPvygthZfEsbj9TLPATBIjotx5STyTooRZBgmoaHbAXEAID1A==",
+      "dependencies": {
+        "jquery": ">=1.9.0"
+      }
+    },
+    "node_modules/js-base64": {
+      "version": "3.7.7",
+      "resolved": "https://registry.npmmirror.com/js-base64/-/js-base64-3.7.7.tgz",
+      "integrity": "sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw=="
     },
     "node_modules/js-beautify": {
       "version": "1.15.1",
@@ -2690,6 +3191,11 @@
         "node": ">=14"
       }
     },
+    "node_modules/js-md4": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmmirror.com/js-md4/-/js-md4-0.3.2.tgz",
+      "integrity": "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA=="
+    },
     "node_modules/js-tokens": {
       "version": "8.0.3",
       "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-8.0.3.tgz",
@@ -2707,6 +3213,11 @@
       "bin": {
         "js-yaml": "bin/js-yaml.js"
       }
+    },
+    "node_modules/jsbn": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmmirror.com/jsbn/-/jsbn-0.1.1.tgz",
+      "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="
     },
     "node_modules/jsdom": {
       "version": "24.0.0",
@@ -2763,6 +3274,11 @@
       "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
       "dev": true
     },
+    "node_modules/json-schema": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmmirror.com/json-schema/-/json-schema-0.4.0.tgz",
+      "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
+    },
     "node_modules/json-schema-traverse": {
       "version": "0.4.1",
       "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
@@ -2775,11 +3291,30 @@
       "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
       "dev": true
     },
+    "node_modules/json-stringify-safe": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+      "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="
+    },
     "node_modules/jsonc-parser": {
       "version": "3.2.1",
       "resolved": "https://registry.npmmirror.com/jsonc-parser/-/jsonc-parser-3.2.1.tgz",
       "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==",
       "dev": true
+    },
+    "node_modules/jsprim": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/jsprim/-/jsprim-2.0.2.tgz",
+      "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==",
+      "engines": [
+        "node >=0.6.0"
+      ],
+      "dependencies": {
+        "assert-plus": "1.0.0",
+        "extsprintf": "1.3.0",
+        "json-schema": "0.4.0",
+        "verror": "1.10.0"
+      }
     },
     "node_modules/keyv": {
       "version": "4.5.4",
@@ -2788,6 +3323,17 @@
       "dev": true,
       "dependencies": {
         "json-buffer": "3.0.1"
+      }
+    },
+    "node_modules/lcid": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmmirror.com/lcid/-/lcid-3.1.1.tgz",
+      "integrity": "sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==",
+      "dependencies": {
+        "invert-kv": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
       }
     },
     "node_modules/levn": {
@@ -2883,6 +3429,48 @@
         "node": ">=12"
       }
     },
+    "node_modules/map-age-cleaner": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmmirror.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
+      "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
+      "dependencies": {
+        "p-defer": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/md5": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/md5/-/md5-2.3.0.tgz",
+      "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==",
+      "dependencies": {
+        "charenc": "0.0.2",
+        "crypt": "0.0.2",
+        "is-buffer": "~1.1.6"
+      }
+    },
+    "node_modules/mem": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmmirror.com/mem/-/mem-5.1.1.tgz",
+      "integrity": "sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==",
+      "dependencies": {
+        "map-age-cleaner": "^0.1.3",
+        "mimic-fn": "^2.1.0",
+        "p-is-promise": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/mem/node_modules/mimic-fn": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz",
+      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/memoize-one": {
       "version": "6.0.0",
       "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz",
@@ -2891,8 +3479,7 @@
     "node_modules/merge-stream": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz",
-      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
-      "dev": true
+      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
     },
     "node_modules/merge2": {
       "version": "1.4.1",
@@ -2942,11 +3529,15 @@
         "node": ">=12"
       }
     },
+    "node_modules/minimalistic-assert": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
+    },
     "node_modules/minimatch": {
       "version": "3.1.2",
       "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz",
       "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
-      "dev": true,
       "dependencies": {
         "brace-expansion": "^1.1.7"
       },
@@ -2961,6 +3552,17 @@
       "dev": true,
       "engines": {
         "node": ">=16 || 14 >=14.17"
+      }
+    },
+    "node_modules/mkdirp": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz",
+      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+      "bin": {
+        "mkdirp": "bin/cmd.js"
+      },
+      "engines": {
+        "node": ">=10"
       }
     },
     "node_modules/mlly": {
@@ -2988,6 +3590,11 @@
       "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
       "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
     },
+    "node_modules/nan": {
+      "version": "2.20.0",
+      "resolved": "https://registry.npmmirror.com/nan/-/nan-2.20.0.tgz",
+      "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw=="
+    },
     "node_modules/nanoid": {
       "version": "3.3.7",
       "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz",
@@ -3004,6 +3611,24 @@
       "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz",
       "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
       "dev": true
+    },
+    "node_modules/node-expat": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmmirror.com/node-expat/-/node-expat-2.4.1.tgz",
+      "integrity": "sha512-uWgvQLgo883NKIL+66oJsK9ysKK3ej0YjVCPBZzO/7wMAuH68/Yb7+JwPWNaVq0yPaxrb48AoEXfYEc8gsmFbg==",
+      "hasInstallScript": true,
+      "dependencies": {
+        "bindings": "^1.5.0",
+        "nan": "^2.19.0"
+      }
+    },
+    "node_modules/node-rsa": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/node-rsa/-/node-rsa-1.1.1.tgz",
+      "integrity": "sha512-Jd4cvbJMryN21r5HgxQOpMEqv+ooke/korixNNK3mGqfGJmy0M77WDDzo/05969+OkMy3XW1UuZsSmW9KQm7Fw==",
+      "dependencies": {
+        "asn1": "^0.2.4"
+      }
     },
     "node_modules/nopt": {
       "version": "7.2.0",
@@ -3069,11 +3694,21 @@
       "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==",
       "dev": true
     },
+    "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==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/once": {
       "version": "1.4.0",
       "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz",
       "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
-      "dev": true,
       "dependencies": {
         "wrappy": "1"
       }
@@ -3105,6 +3740,139 @@
       },
       "engines": {
         "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/os-locale": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/os-locale/-/os-locale-5.0.0.tgz",
+      "integrity": "sha512-tqZcNEDAIZKBEPnHPlVDvKrp7NzgLi7jRmhKiUoa2NUmhl13FtkAGLUVR+ZsYvApBQdBfYm43A4tXXQ4IrYLBA==",
+      "dependencies": {
+        "execa": "^4.0.0",
+        "lcid": "^3.0.0",
+        "mem": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/os-locale/node_modules/execa": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmmirror.com/execa/-/execa-4.1.0.tgz",
+      "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
+      "dependencies": {
+        "cross-spawn": "^7.0.0",
+        "get-stream": "^5.0.0",
+        "human-signals": "^1.1.1",
+        "is-stream": "^2.0.0",
+        "merge-stream": "^2.0.0",
+        "npm-run-path": "^4.0.0",
+        "onetime": "^5.1.0",
+        "signal-exit": "^3.0.2",
+        "strip-final-newline": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sindresorhus/execa?sponsor=1"
+      }
+    },
+    "node_modules/os-locale/node_modules/get-stream": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz",
+      "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+      "dependencies": {
+        "pump": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/os-locale/node_modules/human-signals": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-1.1.1.tgz",
+      "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
+      "engines": {
+        "node": ">=8.12.0"
+      }
+    },
+    "node_modules/os-locale/node_modules/is-stream": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz",
+      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/os-locale/node_modules/mimic-fn": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz",
+      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/os-locale/node_modules/npm-run-path": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz",
+      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+      "dependencies": {
+        "path-key": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/os-locale/node_modules/onetime": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz",
+      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+      "dependencies": {
+        "mimic-fn": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/os-locale/node_modules/signal-exit": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz",
+      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
+    },
+    "node_modules/os-locale/node_modules/strip-final-newline": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/p-defer": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/p-defer/-/p-defer-1.0.0.tgz",
+      "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/p-is-promise": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/p-is-promise/-/p-is-promise-2.1.0.tgz",
+      "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==",
+      "engines": {
+        "node": ">=6"
       }
     },
     "node_modules/p-limit": {
@@ -3165,7 +3933,6 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
       "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -3174,7 +3941,6 @@
       "version": "3.1.1",
       "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz",
       "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
-      "dev": true,
       "engines": {
         "node": ">=8"
       }
@@ -3211,6 +3977,11 @@
       "engines": {
         "node": "*"
       }
+    },
+    "node_modules/performance-now": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/performance-now/-/performance-now-2.1.0.tgz",
+      "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="
     },
     "node_modules/picocolors": {
       "version": "1.0.0",
@@ -3376,23 +4147,43 @@
     "node_modules/psl": {
       "version": "1.9.0",
       "resolved": "https://registry.npmmirror.com/psl/-/psl-1.9.0.tgz",
-      "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
-      "dev": true
+      "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="
+    },
+    "node_modules/pump": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz",
+      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+      "dependencies": {
+        "end-of-stream": "^1.1.0",
+        "once": "^1.3.1"
+      }
     },
     "node_modules/punycode": {
       "version": "2.3.1",
       "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz",
       "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
-      "dev": true,
       "engines": {
         "node": ">=6"
+      }
+    },
+    "node_modules/qs": {
+      "version": "6.10.4",
+      "resolved": "https://registry.npmmirror.com/qs/-/qs-6.10.4.tgz",
+      "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==",
+      "dependencies": {
+        "side-channel": "^1.0.4"
+      },
+      "engines": {
+        "node": ">=0.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
     "node_modules/querystringify": {
       "version": "2.2.0",
       "resolved": "https://registry.npmmirror.com/querystringify/-/querystringify-2.2.0.tgz",
-      "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
-      "dev": true
+      "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="
     },
     "node_modules/queue-microtask": {
       "version": "1.2.3",
@@ -3419,8 +4210,7 @@
     "node_modules/requires-port": {
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz",
-      "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
-      "dev": true
+      "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
     },
     "node_modules/resolve": {
       "version": "1.22.8",
@@ -3528,11 +4318,29 @@
         "queue-microtask": "^1.2.2"
       }
     },
+    "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==",
+      "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/safer-buffer": {
       "version": "2.1.2",
       "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
-      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
-      "dev": true
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
     },
     "node_modules/sass": {
       "version": "1.76.0",
@@ -3551,6 +4359,11 @@
         "node": ">=14.0.0"
       }
     },
+    "node_modules/sax": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmmirror.com/sax/-/sax-1.4.1.tgz",
+      "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg=="
+    },
     "node_modules/saxes": {
       "version": "6.0.0",
       "resolved": "https://registry.npmmirror.com/saxes/-/saxes-6.0.0.tgz",
@@ -3562,6 +4375,30 @@
       "engines": {
         "node": ">=v12.22.7"
       }
+    },
+    "node_modules/selectn": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/selectn/-/selectn-1.1.2.tgz",
+      "integrity": "sha512-AaQlR5br4jWANaF5p5J1ctpsOKwFE5ljWK8ZUSrc4u4ZwcmFLyiowTMt7UjfzQN2/aXF3xnuSVnV4c3Q9tBDqQ==",
+      "dependencies": {
+        "brackets2dots": "^1.1.0",
+        "curry2": "^1.0.0",
+        "debug": "^2.5.2",
+        "dotsplit.js": "^1.0.3"
+      }
+    },
+    "node_modules/selectn/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/selectn/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
     },
     "node_modules/semver": {
       "version": "7.6.0",
@@ -3590,11 +4427,26 @@
         "node": ">=10"
       }
     },
+    "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==",
+      "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/shebang-command": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz",
       "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
-      "dev": true,
       "dependencies": {
         "shebang-regex": "^3.0.0"
       },
@@ -3606,9 +4458,25 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz",
       "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
-      "dev": true,
       "engines": {
         "node": ">=8"
+      }
+    },
+    "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==",
+      "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/siginfo": {
@@ -3630,6 +4498,35 @@
       "version": "1.2.0",
       "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.0.tgz",
       "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/sprintf-js": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz",
+      "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
+    },
+    "node_modules/sshpk": {
+      "version": "1.18.0",
+      "resolved": "https://registry.npmmirror.com/sshpk/-/sshpk-1.18.0.tgz",
+      "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==",
+      "dependencies": {
+        "asn1": "~0.2.3",
+        "assert-plus": "^1.0.0",
+        "bcrypt-pbkdf": "^1.0.0",
+        "dashdash": "^1.12.0",
+        "ecc-jsbn": "~0.1.1",
+        "getpass": "^0.1.1",
+        "jsbn": "~0.1.0",
+        "safer-buffer": "^2.0.2",
+        "tweetnacl": "~0.14.0"
+      },
+      "bin": {
+        "sshpk-conv": "bin/sshpk-conv",
+        "sshpk-sign": "bin/sshpk-sign",
+        "sshpk-verify": "bin/sshpk-verify"
+      },
       "engines": {
         "node": ">=0.10.0"
       }
@@ -3754,6 +4651,66 @@
         "js-tokens": "^8.0.2"
       }
     },
+    "node_modules/strong-globalize": {
+      "version": "6.0.6",
+      "resolved": "https://registry.npmmirror.com/strong-globalize/-/strong-globalize-6.0.6.tgz",
+      "integrity": "sha512-+mN0wTXBg9rLiKBk7jsyfXFWsg08q160XQcmJ3gNxSQ8wrC668dzR8JUp/wcK3NZ2eQ5h5tvc8O6Y+FC0D61lw==",
+      "dependencies": {
+        "accept-language": "^3.0.18",
+        "debug": "^4.2.0",
+        "globalize": "^1.6.0",
+        "lodash": "^4.17.20",
+        "md5": "^2.3.0",
+        "mkdirp": "^1.0.4",
+        "os-locale": "^5.0.0",
+        "yamljs": "^0.3.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/strong-soap": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmmirror.com/strong-soap/-/strong-soap-4.1.3.tgz",
+      "integrity": "sha512-Ts19vzoumipPPR3iWlmd2OVERAxlLdz6LXayDPBWyh9OuKyRw1hNrsaaGWzhlY2JY+5kq/j7mq2MpEVSYsk10w==",
+      "dependencies": {
+        "@cypress/request": "^3.0.1",
+        "compress": "^0.99.0",
+        "debug": "^4.3.6",
+        "httpntlm": "^1.8.13",
+        "lodash": "^4.17.21",
+        "node-rsa": "^1.1.1",
+        "sax": "^1.4.1",
+        "selectn": "^1.1.2",
+        "strong-globalize": "^6.0.6",
+        "uuid": "^10.0.0",
+        "xml-crypto": "^3.2.0",
+        "xmlbuilder": "^10.1.1"
+      },
+      "engines": {
+        "node": "18 || 20 || 21"
+      }
+    },
+    "node_modules/strong-soap/node_modules/xml-crypto": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmmirror.com/xml-crypto/-/xml-crypto-3.2.0.tgz",
+      "integrity": "sha512-qVurBUOQrmvlgmZqIVBqmb06TD2a/PpEUfFPgD7BuBfjmoH4zgkqaWSIJrnymlCvM2GGt9x+XtJFA+ttoAufqg==",
+      "dependencies": {
+        "@xmldom/xmldom": "^0.8.8",
+        "xpath": "0.0.32"
+      },
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/strong-soap/node_modules/xpath": {
+      "version": "0.0.32",
+      "resolved": "https://registry.npmmirror.com/xpath/-/xpath-0.0.32.tgz",
+      "integrity": "sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw==",
+      "engines": {
+        "node": ">=0.6.0"
+      }
+    },
     "node_modules/supports-color": {
       "version": "7.2.0",
       "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
@@ -3834,11 +4791,25 @@
         "node": ">=8.0"
       }
     },
+    "node_modules/topo": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmmirror.com/topo/-/topo-3.0.3.tgz",
+      "integrity": "sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ==",
+      "deprecated": "This module has moved and is now available at @hapi/topo. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.",
+      "dependencies": {
+        "hoek": "6.x.x"
+      }
+    },
+    "node_modules/topo/node_modules/hoek": {
+      "version": "6.1.3",
+      "resolved": "https://registry.npmmirror.com/hoek/-/hoek-6.1.3.tgz",
+      "integrity": "sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ==",
+      "deprecated": "This module has moved and is now available at @hapi/hoek. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues."
+    },
     "node_modules/tough-cookie": {
       "version": "4.1.3",
       "resolved": "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-4.1.3.tgz",
       "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==",
-      "dev": true,
       "dependencies": {
         "psl": "^1.1.33",
         "punycode": "^2.1.1",
@@ -3866,6 +4837,22 @@
       "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.6.2.tgz",
       "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
       "dev": true
+    },
+    "node_modules/tunnel-agent": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+      "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+      "dependencies": {
+        "safe-buffer": "^5.0.1"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/tweetnacl": {
+      "version": "0.14.5",
+      "resolved": "https://registry.npmmirror.com/tweetnacl/-/tweetnacl-0.14.5.tgz",
+      "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="
     },
     "node_modules/type-check": {
       "version": "0.4.0",
@@ -3903,11 +4890,15 @@
       "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==",
       "dev": true
     },
+    "node_modules/underscore": {
+      "version": "1.12.1",
+      "resolved": "https://registry.npmmirror.com/underscore/-/underscore-1.12.1.tgz",
+      "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw=="
+    },
     "node_modules/universalify": {
       "version": "0.2.0",
       "resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.2.0.tgz",
       "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
-      "dev": true,
       "engines": {
         "node": ">= 4.0.0"
       }
@@ -3999,7 +4990,6 @@
       "version": "1.5.10",
       "resolved": "https://registry.npmmirror.com/url-parse/-/url-parse-1.5.10.tgz",
       "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
-      "dev": true,
       "dependencies": {
         "querystringify": "^2.1.1",
         "requires-port": "^1.0.0"
@@ -4010,6 +5000,31 @@
       "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz",
       "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
       "dev": true
+    },
+    "node_modules/uuid": {
+      "version": "10.0.0",
+      "resolved": "https://registry.npmmirror.com/uuid/-/uuid-10.0.0.tgz",
+      "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==",
+      "funding": [
+        "https://github.com/sponsors/broofa",
+        "https://github.com/sponsors/ctavan"
+      ],
+      "bin": {
+        "uuid": "dist/bin/uuid"
+      }
+    },
+    "node_modules/verror": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmmirror.com/verror/-/verror-1.10.0.tgz",
+      "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
+      "engines": [
+        "node >=0.6.0"
+      ],
+      "dependencies": {
+        "assert-plus": "^1.0.0",
+        "core-util-is": "1.0.2",
+        "extsprintf": "^1.2.0"
+      }
     },
     "node_modules/vite": {
       "version": "5.2.6",
@@ -4283,7 +5298,6 @@
       "version": "2.0.2",
       "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz",
       "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-      "dev": true,
       "dependencies": {
         "isexe": "^2.0.0"
       },
@@ -4392,8 +5406,7 @@
     "node_modules/wrappy": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
-      "dev": true
+      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
     },
     "node_modules/ws": {
       "version": "8.16.0",
@@ -4425,6 +5438,27 @@
         "node": ">=12"
       }
     },
+    "node_modules/xml2json": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmmirror.com/xml2json/-/xml2json-0.12.0.tgz",
+      "integrity": "sha512-EPJHRWJnJUYbJlzR4pBhZODwWdi2IaYGtDdteJi0JpZ4OD31IplWALuit8r73dJuM4iHZdDVKY1tLqY2UICejg==",
+      "dependencies": {
+        "hoek": "^4.2.1",
+        "joi": "^13.1.2",
+        "node-expat": "^2.3.18"
+      },
+      "bin": {
+        "xml2json": "bin/xml2json"
+      }
+    },
+    "node_modules/xmlbuilder": {
+      "version": "10.1.1",
+      "resolved": "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-10.1.1.tgz",
+      "integrity": "sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==",
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
     "node_modules/xmlchars": {
       "version": "2.2.0",
       "resolved": "https://registry.npmmirror.com/xmlchars/-/xmlchars-2.2.0.tgz",
@@ -4436,6 +5470,47 @@
       "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
       "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
       "dev": true
+    },
+    "node_modules/yamljs": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmmirror.com/yamljs/-/yamljs-0.3.0.tgz",
+      "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==",
+      "dependencies": {
+        "argparse": "^1.0.7",
+        "glob": "^7.0.5"
+      },
+      "bin": {
+        "json2yaml": "bin/json2yaml",
+        "yaml2json": "bin/yaml2json"
+      }
+    },
+    "node_modules/yamljs/node_modules/argparse": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+      "dependencies": {
+        "sprintf-js": "~1.0.2"
+      }
+    },
+    "node_modules/yamljs/node_modules/glob": {
+      "version": "7.2.3",
+      "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz",
+      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "deprecated": "Glob versions prior to v9 are no longer supported",
+      "dependencies": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.1.1",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      },
+      "engines": {
+        "node": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
     },
     "node_modules/yocto-queue": {
       "version": "0.1.0",
@@ -4486,6 +5561,48 @@
       "version": "3.6.1",
       "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz",
       "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA=="
+    },
+    "@cypress/request": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/@cypress/request/-/request-3.0.1.tgz",
+      "integrity": "sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==",
+      "requires": {
+        "aws-sign2": "~0.7.0",
+        "aws4": "^1.8.0",
+        "caseless": "~0.12.0",
+        "combined-stream": "~1.0.6",
+        "extend": "~3.0.2",
+        "forever-agent": "~0.6.1",
+        "form-data": "~2.3.2",
+        "http-signature": "~1.3.6",
+        "is-typedarray": "~1.0.0",
+        "isstream": "~0.1.2",
+        "json-stringify-safe": "~5.0.1",
+        "mime-types": "~2.1.19",
+        "performance-now": "^2.1.0",
+        "qs": "6.10.4",
+        "safe-buffer": "^5.1.2",
+        "tough-cookie": "^4.1.3",
+        "tunnel-agent": "^0.6.0",
+        "uuid": "^8.3.2"
+      },
+      "dependencies": {
+        "form-data": {
+          "version": "2.3.3",
+          "resolved": "https://registry.npmmirror.com/form-data/-/form-data-2.3.3.tgz",
+          "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+          "requires": {
+            "asynckit": "^0.4.0",
+            "combined-stream": "^1.0.6",
+            "mime-types": "^2.1.12"
+          }
+        },
+        "uuid": {
+          "version": "8.3.2",
+          "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz",
+          "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
+        }
+      }
     },
     "@element-plus/icons-vue": {
       "version": "2.3.1",
@@ -5265,11 +6382,24 @@
         }
       }
     },
+    "@xmldom/xmldom": {
+      "version": "0.8.10",
+      "resolved": "https://registry.npmmirror.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz",
+      "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw=="
+    },
     "abbrev": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/abbrev/-/abbrev-2.0.0.tgz",
       "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==",
       "dev": true
+    },
+    "accept-language": {
+      "version": "3.0.20",
+      "resolved": "https://registry.npmmirror.com/accept-language/-/accept-language-3.0.20.tgz",
+      "integrity": "sha512-xklPzRma4aoDEPk0ZfMjeuxB2FP4JBYlAR25OFUqCoOYDjYo6wGwAs49SnTN/MoB5VpnNX9tENfZ+vEIFmHQMQ==",
+      "requires": {
+        "bcp47": "^1.1.2"
+      }
     },
     "acorn": {
       "version": "8.11.3",
@@ -5340,6 +6470,19 @@
       "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
       "dev": true
     },
+    "asn1": {
+      "version": "0.2.6",
+      "resolved": "https://registry.npmmirror.com/asn1/-/asn1-0.2.6.tgz",
+      "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
+      "requires": {
+        "safer-buffer": "~2.1.0"
+      }
+    },
+    "assert-plus": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/assert-plus/-/assert-plus-1.0.0.tgz",
+      "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw=="
+    },
     "assertion-error": {
       "version": "1.1.0",
       "resolved": "https://registry.npmmirror.com/assertion-error/-/assertion-error-1.1.0.tgz",
@@ -5356,10 +6499,20 @@
       "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
       "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
     },
+    "aws-sign2": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmmirror.com/aws-sign2/-/aws-sign2-0.7.0.tgz",
+      "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA=="
+    },
+    "aws4": {
+      "version": "1.13.1",
+      "resolved": "https://registry.npmmirror.com/aws4/-/aws4-1.13.1.tgz",
+      "integrity": "sha512-u5w79Rd7SU4JaIlA/zFqG+gOiuq25q5VLyZ8E+ijJeILuTxVzZgp2CaGw/UTw6pXYN9XMO9yiqj/nEHmhTG5CA=="
+    },
     "axios": {
-      "version": "1.6.8",
-      "resolved": "https://registry.npmmirror.com/axios/-/axios-1.6.8.tgz",
-      "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==",
+      "version": "1.7.4",
+      "resolved": "https://registry.npmmirror.com/axios/-/axios-1.7.4.tgz",
+      "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==",
       "requires": {
         "follow-redirects": "^1.15.6",
         "form-data": "^4.0.0",
@@ -5371,10 +6524,31 @@
       "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
       "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
     },
+    "bcp47": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/bcp47/-/bcp47-1.1.2.tgz",
+      "integrity": "sha512-JnkkL4GUpOvvanH9AZPX38CxhiLsXMBicBY2IAtqiVN8YulGDQybUydWA4W6yAMtw6iShtw+8HEF6cfrTHU+UQ=="
+    },
+    "bcrypt-pbkdf": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+      "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
+      "requires": {
+        "tweetnacl": "^0.14.3"
+      }
+    },
     "binary-extensions": {
       "version": "2.3.0",
       "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz",
       "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="
+    },
+    "bindings": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmmirror.com/bindings/-/bindings-1.5.0.tgz",
+      "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
+      "requires": {
+        "file-uri-to-path": "1.0.0"
+      }
     },
     "boolbase": {
       "version": "1.0.0",
@@ -5386,7 +6560,6 @@
       "version": "1.1.11",
       "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz",
       "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dev": true,
       "requires": {
         "balanced-match": "^1.0.0",
         "concat-map": "0.0.1"
@@ -5400,17 +6573,39 @@
         "fill-range": "^7.0.1"
       }
     },
+    "brackets2dots": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/brackets2dots/-/brackets2dots-1.1.0.tgz",
+      "integrity": "sha512-DEIJz+ebFQ2SYPpXd8owCjy+8H+9N2Pd9DeSf0J33oavLyBYpAtjLg/Z/RmdJdTeHmKVva+L411HjnvyV2rSOA=="
+    },
     "cac": {
       "version": "6.7.14",
       "resolved": "https://registry.npmmirror.com/cac/-/cac-6.7.14.tgz",
       "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
       "dev": true
     },
+    "call-bind": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.7.tgz",
+      "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
+      "requires": {
+        "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"
+      }
+    },
     "callsites": {
       "version": "3.1.0",
       "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz",
       "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
       "dev": true
+    },
+    "caseless": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmmirror.com/caseless/-/caseless-0.12.0.tgz",
+      "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="
     },
     "chai": {
       "version": "4.4.1",
@@ -5436,6 +6631,11 @@
         "ansi-styles": "^4.1.0",
         "supports-color": "^7.1.0"
       }
+    },
+    "charenc": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmmirror.com/charenc/-/charenc-0.0.2.tgz",
+      "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA=="
     },
     "check-error": {
       "version": "1.0.3",
@@ -5471,6 +6671,11 @@
         }
       }
     },
+    "cldrjs": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmmirror.com/cldrjs/-/cldrjs-0.5.5.tgz",
+      "integrity": "sha512-KDwzwbmLIPfCgd8JERVDpQKrUUM1U4KpFJJg2IROv89rF172lLufoJnqJ/Wea6fXL5bO6WjuLMzY8V52UWPvkA=="
+    },
     "color-convert": {
       "version": "2.0.1",
       "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
@@ -5500,11 +6705,15 @@
       "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
       "dev": true
     },
+    "compress": {
+      "version": "0.99.0",
+      "resolved": "https://registry.npmmirror.com/compress/-/compress-0.99.0.tgz",
+      "integrity": "sha512-+qy9iMBFGTLUqKwYkAqRtZ5Xdl1PGKrSMYCuiirsxSQ5OgDoyP9QO6YoZ4feHzhpufGOwJ+y4qRXz2ytzZ1l0g=="
+    },
     "concat-map": {
       "version": "0.0.1",
       "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
-      "dev": true
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
     },
     "config-chain": {
       "version": "1.1.13",
@@ -5516,16 +6725,25 @@
         "proto-list": "~1.2.1"
       }
     },
+    "core-util-is": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz",
+      "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
+    },
     "cross-spawn": {
       "version": "7.0.3",
       "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz",
       "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
-      "dev": true,
       "requires": {
         "path-key": "^3.1.0",
         "shebang-command": "^2.0.0",
         "which": "^2.0.1"
       }
+    },
+    "crypt": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmmirror.com/crypt/-/crypt-0.0.2.tgz",
+      "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow=="
     },
     "cssesc": {
       "version": "3.0.0",
@@ -5547,6 +6765,22 @@
       "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
       "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
     },
+    "curry2": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/curry2/-/curry2-1.0.3.tgz",
+      "integrity": "sha512-2vXqPLsITt0ccyczu1BFl3tc8Q6BOCsTHt+NZYasd8wp60RQIYhGM3Beis5h5FgJPT11M1rfiKOR7dPL6cL14Q==",
+      "requires": {
+        "fast-bind": "^1.0.0"
+      }
+    },
+    "dashdash": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmmirror.com/dashdash/-/dashdash-1.14.1.tgz",
+      "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
+      "requires": {
+        "assert-plus": "^1.0.0"
+      }
+    },
     "data-urls": {
       "version": "5.0.0",
       "resolved": "https://registry.npmmirror.com/data-urls/-/data-urls-5.0.0.tgz",
@@ -5563,9 +6797,9 @@
       "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ=="
     },
     "debug": {
-      "version": "4.3.4",
-      "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz",
-      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "version": "4.3.6",
+      "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.6.tgz",
+      "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==",
       "requires": {
         "ms": "2.1.2"
       }
@@ -5591,10 +6825,29 @@
       "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
       "dev": true
     },
+    "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==",
+      "requires": {
+        "es-define-property": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.0.1"
+      }
+    },
     "delayed-stream": {
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
       "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
+    },
+    "des.js": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/des.js/-/des.js-1.1.0.tgz",
+      "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==",
+      "requires": {
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0"
+      }
     },
     "diff-sequences": {
       "version": "29.6.3",
@@ -5611,11 +6864,25 @@
         "esutils": "^2.0.2"
       }
     },
+    "dotsplit.js": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/dotsplit.js/-/dotsplit.js-1.1.0.tgz",
+      "integrity": "sha512-oFVx9VEE+M3yM4oUkaiDa+U2RhOmjXWyXwtfdc5UiHDSZWleE96FS3nx3yXMVuhLJOdI2GMThvaegkwRYPgAFQ=="
+    },
     "eastasianwidth": {
       "version": "0.2.0",
       "resolved": "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
       "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
       "dev": true
+    },
+    "ecc-jsbn": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmmirror.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+      "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
+      "requires": {
+        "jsbn": "~0.1.0",
+        "safer-buffer": "^2.1.0"
+      }
     },
     "echarts": {
       "version": "5.5.0",
@@ -5740,10 +7007,31 @@
       "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
       "dev": true
     },
+    "end-of-stream": {
+      "version": "1.4.4",
+      "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz",
+      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+      "requires": {
+        "once": "^1.4.0"
+      }
+    },
     "entities": {
       "version": "4.5.0",
       "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
       "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="
+    },
+    "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==",
+      "requires": {
+        "get-intrinsic": "^1.2.4"
+      }
+    },
+    "es-errors": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz",
+      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="
     },
     "esbuild": {
       "version": "0.20.2",
@@ -5949,6 +7237,21 @@
         "strip-final-newline": "^3.0.0"
       }
     },
+    "extend": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz",
+      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+    },
+    "extsprintf": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.3.0.tgz",
+      "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g=="
+    },
+    "fast-bind": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/fast-bind/-/fast-bind-1.0.0.tgz",
+      "integrity": "sha512-kna1xVU4nn4HW4RVwh6VYSWoii+u8EkWKS3I6YZluncEvtQwahHKhZTRPFHOOkeJK4m0/Tz2Ir9n10tARqeiXw=="
+    },
     "fast-deep-equal": {
       "version": "3.1.3",
       "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -6012,6 +7315,11 @@
         "flat-cache": "^3.0.4"
       }
     },
+    "file-uri-to-path": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+      "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="
+    },
     "fill-range": {
       "version": "7.0.1",
       "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz",
@@ -6062,6 +7370,11 @@
         "signal-exit": "^4.0.1"
       }
     },
+    "forever-agent": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmmirror.com/forever-agent/-/forever-agent-0.6.1.tgz",
+      "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw=="
+    },
     "form-data": {
       "version": "4.0.0",
       "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz",
@@ -6075,8 +7388,7 @@
     "fs.realpath": {
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
-      "dev": true
+      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
     },
     "fsevents": {
       "version": "2.3.3",
@@ -6095,11 +7407,31 @@
       "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
       "dev": true
     },
+    "get-intrinsic": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
+      "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
+      "requires": {
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
+        "has-proto": "^1.0.1",
+        "has-symbols": "^1.0.3",
+        "hasown": "^2.0.0"
+      }
+    },
     "get-stream": {
       "version": "8.0.1",
       "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-8.0.1.tgz",
       "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
       "dev": true
+    },
+    "getpass": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmmirror.com/getpass/-/getpass-0.1.7.tgz",
+      "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
+      "requires": {
+        "assert-plus": "^1.0.0"
+      }
     },
     "glob": {
       "version": "10.3.10",
@@ -6143,6 +7475,14 @@
         "is-glob": "^4.0.3"
       }
     },
+    "globalize": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmmirror.com/globalize/-/globalize-1.7.0.tgz",
+      "integrity": "sha512-faR46vTIbFCeAemyuc9E6/d7Wrx9k2ae2L60UhakztFg6VuE42gENVJNuPFtt7Sdjrk9m2w8+py7Jj+JTNy59w==",
+      "requires": {
+        "cldrjs": "^0.5.4"
+      }
+    },
     "globals": {
       "version": "13.24.0",
       "resolved": "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz",
@@ -6150,6 +7490,14 @@
       "dev": true,
       "requires": {
         "type-fest": "^0.20.2"
+      }
+    },
+    "gopd": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz",
+      "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+      "requires": {
+        "get-intrinsic": "^1.1.3"
       }
     },
     "graphemer": {
@@ -6164,6 +7512,24 @@
       "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
       "dev": true
     },
+    "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==",
+      "requires": {
+        "es-define-property": "^1.0.0"
+      }
+    },
+    "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=="
+    },
+    "has-symbols": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz",
+      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
+    },
     "hasown": {
       "version": "2.0.2",
       "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz",
@@ -6171,6 +7537,11 @@
       "requires": {
         "function-bind": "^1.1.2"
       }
+    },
+    "hoek": {
+      "version": "4.3.1",
+      "resolved": "https://registry.npmmirror.com/hoek/-/hoek-4.3.1.tgz",
+      "integrity": "sha512-v7E+yIjcHECn973i0xHm4kJkEpv3C8sbYS4344WXbzYqRyiDD7rjnnKo4hsJkejQBAFdRMUGNHySeSPKSH9Rqw=="
     },
     "html-encoding-sniffer": {
       "version": "4.0.0",
@@ -6190,6 +7561,32 @@
         "agent-base": "^7.1.0",
         "debug": "^4.3.4"
       }
+    },
+    "http-signature": {
+      "version": "1.3.6",
+      "resolved": "https://registry.npmmirror.com/http-signature/-/http-signature-1.3.6.tgz",
+      "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==",
+      "requires": {
+        "assert-plus": "^1.0.0",
+        "jsprim": "^2.0.2",
+        "sshpk": "^1.14.1"
+      }
+    },
+    "httpntlm": {
+      "version": "1.8.13",
+      "resolved": "https://registry.npmmirror.com/httpntlm/-/httpntlm-1.8.13.tgz",
+      "integrity": "sha512-2F2FDPiWT4rewPzNMg3uPhNkP3NExENlUGADRUDPQvuftuUTGW98nLZtGemCIW3G40VhWZYgkIDcQFAwZ3mf2Q==",
+      "requires": {
+        "des.js": "^1.0.1",
+        "httpreq": ">=0.4.22",
+        "js-md4": "^0.3.2",
+        "underscore": "~1.12.1"
+      }
+    },
+    "httpreq": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/httpreq/-/httpreq-1.1.1.tgz",
+      "integrity": "sha512-uhSZLPPD2VXXOSN8Cni3kIsoFHaU2pT/nySEU/fHr/ePbqHYr0jeiQRmUKLEirC09SFPsdMoA7LU7UXMd/w0Kw=="
     },
     "https-proxy-agent": {
       "version": "7.0.4",
@@ -6248,7 +7645,6 @@
       "version": "1.0.6",
       "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz",
       "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
-      "dev": true,
       "requires": {
         "once": "^1.3.0",
         "wrappy": "1"
@@ -6257,14 +7653,18 @@
     "inherits": {
       "version": "2.0.4",
       "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
-      "dev": true
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
     },
     "ini": {
       "version": "1.3.8",
       "resolved": "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz",
       "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
       "dev": true
+    },
+    "invert-kv": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/invert-kv/-/invert-kv-3.0.1.tgz",
+      "integrity": "sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw=="
     },
     "is-binary-path": {
       "version": "2.1.0",
@@ -6273,6 +7673,11 @@
       "requires": {
         "binary-extensions": "^2.0.0"
       }
+    },
+    "is-buffer": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz",
+      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
     },
     "is-core-module": {
       "version": "2.13.1",
@@ -6324,11 +7729,28 @@
       "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
       "dev": true
     },
+    "is-typedarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz",
+      "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
+    },
+    "isemail": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmmirror.com/isemail/-/isemail-3.2.0.tgz",
+      "integrity": "sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==",
+      "requires": {
+        "punycode": "2.x.x"
+      }
+    },
     "isexe": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
-      "dev": true
+      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
+    },
+    "isstream": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmmirror.com/isstream/-/isstream-0.1.2.tgz",
+      "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="
     },
     "jackspeak": {
       "version": "2.3.6",
@@ -6340,10 +7762,45 @@
         "@pkgjs/parseargs": "^0.11.0"
       }
     },
+    "joi": {
+      "version": "13.7.0",
+      "resolved": "https://registry.npmmirror.com/joi/-/joi-13.7.0.tgz",
+      "integrity": "sha512-xuY5VkHfeOYK3Hdi91ulocfuFopwgbSORmIwzcwHKESQhC7w1kD5jaVSPnqDxS2I8t3RZ9omCKAxNwXN5zG1/Q==",
+      "requires": {
+        "hoek": "5.x.x",
+        "isemail": "3.x.x",
+        "topo": "3.x.x"
+      },
+      "dependencies": {
+        "hoek": {
+          "version": "5.0.4",
+          "resolved": "https://registry.npmmirror.com/hoek/-/hoek-5.0.4.tgz",
+          "integrity": "sha512-Alr4ZQgoMlnere5FZJsIyfIjORBqZll5POhDsF4q64dPuJR6rNxXdDxtHSQq8OXRurhmx+PWYEE8bXRROY8h0w=="
+        }
+      }
+    },
     "jquery": {
       "version": "3.7.1",
       "resolved": "https://registry.npmmirror.com/jquery/-/jquery-3.7.1.tgz",
       "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg=="
+    },
+    "jquery-xml2json": {
+      "version": "0.0.8",
+      "resolved": "https://registry.npmmirror.com/jquery-xml2json/-/jquery-xml2json-0.0.8.tgz",
+      "integrity": "sha512-PF8yh3sEeQev44ZWQ3c4Mxg1rXP8MEhOKPt5lDyaMe25SJaDI7pQvQOS5kpBPb1YC/d/0nEzUn+YewaXhAQFlw=="
+    },
+    "jquery.soap": {
+      "version": "1.7.3",
+      "resolved": "https://registry.npmmirror.com/jquery.soap/-/jquery.soap-1.7.3.tgz",
+      "integrity": "sha512-ZNMQ2Rmy8uQ/4CSJMz0IDZCYhdmT+SiAlLFMGDPvygthZfEsbj9TLPATBIjotx5STyTooRZBgmoaHbAXEAID1A==",
+      "requires": {
+        "jquery": ">=1.9.0"
+      }
+    },
+    "js-base64": {
+      "version": "3.7.7",
+      "resolved": "https://registry.npmmirror.com/js-base64/-/js-base64-3.7.7.tgz",
+      "integrity": "sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw=="
     },
     "js-beautify": {
       "version": "1.15.1",
@@ -6364,6 +7821,11 @@
       "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==",
       "dev": true
     },
+    "js-md4": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmmirror.com/js-md4/-/js-md4-0.3.2.tgz",
+      "integrity": "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA=="
+    },
     "js-tokens": {
       "version": "8.0.3",
       "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-8.0.3.tgz",
@@ -6378,6 +7840,11 @@
       "requires": {
         "argparse": "^2.0.1"
       }
+    },
+    "jsbn": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmmirror.com/jsbn/-/jsbn-0.1.1.tgz",
+      "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="
     },
     "jsdom": {
       "version": "24.0.0",
@@ -6422,6 +7889,11 @@
       "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
       "dev": true
     },
+    "json-schema": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmmirror.com/json-schema/-/json-schema-0.4.0.tgz",
+      "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
+    },
     "json-schema-traverse": {
       "version": "0.4.1",
       "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
@@ -6434,11 +7906,27 @@
       "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
       "dev": true
     },
+    "json-stringify-safe": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+      "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="
+    },
     "jsonc-parser": {
       "version": "3.2.1",
       "resolved": "https://registry.npmmirror.com/jsonc-parser/-/jsonc-parser-3.2.1.tgz",
       "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==",
       "dev": true
+    },
+    "jsprim": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/jsprim/-/jsprim-2.0.2.tgz",
+      "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==",
+      "requires": {
+        "assert-plus": "1.0.0",
+        "extsprintf": "1.3.0",
+        "json-schema": "0.4.0",
+        "verror": "1.10.0"
+      }
     },
     "keyv": {
       "version": "4.5.4",
@@ -6447,6 +7935,14 @@
       "dev": true,
       "requires": {
         "json-buffer": "3.0.1"
+      }
+    },
+    "lcid": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmmirror.com/lcid/-/lcid-3.1.1.tgz",
+      "integrity": "sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==",
+      "requires": {
+        "invert-kv": "^3.0.0"
       }
     },
     "levn": {
@@ -6523,6 +8019,41 @@
         "@jridgewell/sourcemap-codec": "^1.4.15"
       }
     },
+    "map-age-cleaner": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmmirror.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
+      "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
+      "requires": {
+        "p-defer": "^1.0.0"
+      }
+    },
+    "md5": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/md5/-/md5-2.3.0.tgz",
+      "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==",
+      "requires": {
+        "charenc": "0.0.2",
+        "crypt": "0.0.2",
+        "is-buffer": "~1.1.6"
+      }
+    },
+    "mem": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmmirror.com/mem/-/mem-5.1.1.tgz",
+      "integrity": "sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==",
+      "requires": {
+        "map-age-cleaner": "^0.1.3",
+        "mimic-fn": "^2.1.0",
+        "p-is-promise": "^2.1.0"
+      },
+      "dependencies": {
+        "mimic-fn": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz",
+          "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
+        }
+      }
+    },
     "memoize-one": {
       "version": "6.0.0",
       "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz",
@@ -6531,8 +8062,7 @@
     "merge-stream": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz",
-      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
-      "dev": true
+      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
     },
     "merge2": {
       "version": "1.4.1",
@@ -6567,11 +8097,15 @@
       "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
       "dev": true
     },
+    "minimalistic-assert": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
+    },
     "minimatch": {
       "version": "3.1.2",
       "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz",
       "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
-      "dev": true,
       "requires": {
         "brace-expansion": "^1.1.7"
       }
@@ -6581,6 +8115,11 @@
       "resolved": "https://registry.npmmirror.com/minipass/-/minipass-7.0.4.tgz",
       "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==",
       "dev": true
+    },
+    "mkdirp": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz",
+      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
     },
     "mlly": {
       "version": "1.6.1",
@@ -6604,6 +8143,11 @@
       "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
       "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
     },
+    "nan": {
+      "version": "2.20.0",
+      "resolved": "https://registry.npmmirror.com/nan/-/nan-2.20.0.tgz",
+      "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw=="
+    },
     "nanoid": {
       "version": "3.3.7",
       "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz",
@@ -6614,6 +8158,23 @@
       "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz",
       "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
       "dev": true
+    },
+    "node-expat": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmmirror.com/node-expat/-/node-expat-2.4.1.tgz",
+      "integrity": "sha512-uWgvQLgo883NKIL+66oJsK9ysKK3ej0YjVCPBZzO/7wMAuH68/Yb7+JwPWNaVq0yPaxrb48AoEXfYEc8gsmFbg==",
+      "requires": {
+        "bindings": "^1.5.0",
+        "nan": "^2.19.0"
+      }
+    },
+    "node-rsa": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/node-rsa/-/node-rsa-1.1.1.tgz",
+      "integrity": "sha512-Jd4cvbJMryN21r5HgxQOpMEqv+ooke/korixNNK3mGqfGJmy0M77WDDzo/05969+OkMy3XW1UuZsSmW9KQm7Fw==",
+      "requires": {
+        "asn1": "^0.2.4"
+      }
     },
     "nopt": {
       "version": "7.2.0",
@@ -6666,11 +8227,15 @@
       "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==",
       "dev": true
     },
+    "object-inspect": {
+      "version": "1.13.2",
+      "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.2.tgz",
+      "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g=="
+    },
     "once": {
       "version": "1.4.0",
       "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz",
       "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
-      "dev": true,
       "requires": {
         "wrappy": "1"
       }
@@ -6697,6 +8262,93 @@
         "prelude-ls": "^1.2.1",
         "type-check": "^0.4.0"
       }
+    },
+    "os-locale": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/os-locale/-/os-locale-5.0.0.tgz",
+      "integrity": "sha512-tqZcNEDAIZKBEPnHPlVDvKrp7NzgLi7jRmhKiUoa2NUmhl13FtkAGLUVR+ZsYvApBQdBfYm43A4tXXQ4IrYLBA==",
+      "requires": {
+        "execa": "^4.0.0",
+        "lcid": "^3.0.0",
+        "mem": "^5.0.0"
+      },
+      "dependencies": {
+        "execa": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmmirror.com/execa/-/execa-4.1.0.tgz",
+          "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
+          "requires": {
+            "cross-spawn": "^7.0.0",
+            "get-stream": "^5.0.0",
+            "human-signals": "^1.1.1",
+            "is-stream": "^2.0.0",
+            "merge-stream": "^2.0.0",
+            "npm-run-path": "^4.0.0",
+            "onetime": "^5.1.0",
+            "signal-exit": "^3.0.2",
+            "strip-final-newline": "^2.0.0"
+          }
+        },
+        "get-stream": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz",
+          "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+          "requires": {
+            "pump": "^3.0.0"
+          }
+        },
+        "human-signals": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-1.1.1.tgz",
+          "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw=="
+        },
+        "is-stream": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz",
+          "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="
+        },
+        "mimic-fn": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz",
+          "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
+        },
+        "npm-run-path": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz",
+          "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+          "requires": {
+            "path-key": "^3.0.0"
+          }
+        },
+        "onetime": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz",
+          "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+          "requires": {
+            "mimic-fn": "^2.1.0"
+          }
+        },
+        "signal-exit": {
+          "version": "3.0.7",
+          "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz",
+          "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
+        },
+        "strip-final-newline": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+          "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="
+        }
+      }
+    },
+    "p-defer": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/p-defer/-/p-defer-1.0.0.tgz",
+      "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw=="
+    },
+    "p-is-promise": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/p-is-promise/-/p-is-promise-2.1.0.tgz",
+      "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg=="
     },
     "p-limit": {
       "version": "3.1.0",
@@ -6743,14 +8395,12 @@
     "path-is-absolute": {
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
-      "dev": true
+      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="
     },
     "path-key": {
       "version": "3.1.1",
       "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz",
-      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
-      "dev": true
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
     },
     "path-parse": {
       "version": "1.0.7",
@@ -6778,6 +8428,11 @@
       "resolved": "https://registry.npmmirror.com/pathval/-/pathval-1.1.1.tgz",
       "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
       "dev": true
+    },
+    "performance-now": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/performance-now/-/performance-now-2.1.0.tgz",
+      "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="
     },
     "picocolors": {
       "version": "1.0.0",
@@ -6891,20 +8546,34 @@
     "psl": {
       "version": "1.9.0",
       "resolved": "https://registry.npmmirror.com/psl/-/psl-1.9.0.tgz",
-      "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
-      "dev": true
+      "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="
+    },
+    "pump": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz",
+      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+      "requires": {
+        "end-of-stream": "^1.1.0",
+        "once": "^1.3.1"
+      }
     },
     "punycode": {
       "version": "2.3.1",
       "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz",
-      "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
-      "dev": true
+      "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="
+    },
+    "qs": {
+      "version": "6.10.4",
+      "resolved": "https://registry.npmmirror.com/qs/-/qs-6.10.4.tgz",
+      "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==",
+      "requires": {
+        "side-channel": "^1.0.4"
+      }
     },
     "querystringify": {
       "version": "2.2.0",
       "resolved": "https://registry.npmmirror.com/querystringify/-/querystringify-2.2.0.tgz",
-      "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
-      "dev": true
+      "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="
     },
     "queue-microtask": {
       "version": "1.2.3",
@@ -6928,8 +8597,7 @@
     "requires-port": {
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz",
-      "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
-      "dev": true
+      "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
     },
     "resolve": {
       "version": "1.22.8",
@@ -7014,11 +8682,15 @@
         "queue-microtask": "^1.2.2"
       }
     },
+    "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=="
+    },
     "safer-buffer": {
       "version": "2.1.2",
       "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
-      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
-      "dev": true
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
     },
     "sass": {
       "version": "1.76.0",
@@ -7031,6 +8703,11 @@
         "source-map-js": ">=0.6.2 <2.0.0"
       }
     },
+    "sax": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmmirror.com/sax/-/sax-1.4.1.tgz",
+      "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg=="
+    },
     "saxes": {
       "version": "6.0.0",
       "resolved": "https://registry.npmmirror.com/saxes/-/saxes-6.0.0.tgz",
@@ -7038,6 +8715,32 @@
       "dev": true,
       "requires": {
         "xmlchars": "^2.2.0"
+      }
+    },
+    "selectn": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/selectn/-/selectn-1.1.2.tgz",
+      "integrity": "sha512-AaQlR5br4jWANaF5p5J1ctpsOKwFE5ljWK8ZUSrc4u4ZwcmFLyiowTMt7UjfzQN2/aXF3xnuSVnV4c3Q9tBDqQ==",
+      "requires": {
+        "brackets2dots": "^1.1.0",
+        "curry2": "^1.0.0",
+        "debug": "^2.5.2",
+        "dotsplit.js": "^1.0.3"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+        }
       }
     },
     "semver": {
@@ -7060,11 +8763,23 @@
         }
       }
     },
+    "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==",
+      "requires": {
+        "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"
+      }
+    },
     "shebang-command": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz",
       "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
-      "dev": true,
       "requires": {
         "shebang-regex": "^3.0.0"
       }
@@ -7072,8 +8787,18 @@
     "shebang-regex": {
       "version": "3.0.0",
       "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz",
-      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
-      "dev": true
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
+    },
+    "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==",
+      "requires": {
+        "call-bind": "^1.0.7",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.4",
+        "object-inspect": "^1.13.1"
+      }
     },
     "siginfo": {
       "version": "2.0.0",
@@ -7091,6 +8816,27 @@
       "version": "1.2.0",
       "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.0.tgz",
       "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg=="
+    },
+    "sprintf-js": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz",
+      "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
+    },
+    "sshpk": {
+      "version": "1.18.0",
+      "resolved": "https://registry.npmmirror.com/sshpk/-/sshpk-1.18.0.tgz",
+      "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==",
+      "requires": {
+        "asn1": "~0.2.3",
+        "assert-plus": "^1.0.0",
+        "bcrypt-pbkdf": "^1.0.0",
+        "dashdash": "^1.12.0",
+        "ecc-jsbn": "~0.1.1",
+        "getpass": "^0.1.1",
+        "jsbn": "~0.1.0",
+        "safer-buffer": "^2.0.2",
+        "tweetnacl": "~0.14.0"
+      }
     },
     "stackback": {
       "version": "0.0.2",
@@ -7190,6 +8936,56 @@
         "js-tokens": "^8.0.2"
       }
     },
+    "strong-globalize": {
+      "version": "6.0.6",
+      "resolved": "https://registry.npmmirror.com/strong-globalize/-/strong-globalize-6.0.6.tgz",
+      "integrity": "sha512-+mN0wTXBg9rLiKBk7jsyfXFWsg08q160XQcmJ3gNxSQ8wrC668dzR8JUp/wcK3NZ2eQ5h5tvc8O6Y+FC0D61lw==",
+      "requires": {
+        "accept-language": "^3.0.18",
+        "debug": "^4.2.0",
+        "globalize": "^1.6.0",
+        "lodash": "^4.17.20",
+        "md5": "^2.3.0",
+        "mkdirp": "^1.0.4",
+        "os-locale": "^5.0.0",
+        "yamljs": "^0.3.0"
+      }
+    },
+    "strong-soap": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmmirror.com/strong-soap/-/strong-soap-4.1.3.tgz",
+      "integrity": "sha512-Ts19vzoumipPPR3iWlmd2OVERAxlLdz6LXayDPBWyh9OuKyRw1hNrsaaGWzhlY2JY+5kq/j7mq2MpEVSYsk10w==",
+      "requires": {
+        "@cypress/request": "^3.0.1",
+        "compress": "^0.99.0",
+        "debug": "^4.3.6",
+        "httpntlm": "^1.8.13",
+        "lodash": "^4.17.21",
+        "node-rsa": "^1.1.1",
+        "sax": "^1.4.1",
+        "selectn": "^1.1.2",
+        "strong-globalize": "^6.0.6",
+        "uuid": "^10.0.0",
+        "xml-crypto": "^3.2.0",
+        "xmlbuilder": "^10.1.1"
+      },
+      "dependencies": {
+        "xml-crypto": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmmirror.com/xml-crypto/-/xml-crypto-3.2.0.tgz",
+          "integrity": "sha512-qVurBUOQrmvlgmZqIVBqmb06TD2a/PpEUfFPgD7BuBfjmoH4zgkqaWSIJrnymlCvM2GGt9x+XtJFA+ttoAufqg==",
+          "requires": {
+            "@xmldom/xmldom": "^0.8.8",
+            "xpath": "0.0.32"
+          }
+        },
+        "xpath": {
+          "version": "0.0.32",
+          "resolved": "https://registry.npmmirror.com/xpath/-/xpath-0.0.32.tgz",
+          "integrity": "sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw=="
+        }
+      }
+    },
     "supports-color": {
       "version": "7.2.0",
       "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
@@ -7252,11 +9048,25 @@
         "is-number": "^7.0.0"
       }
     },
+    "topo": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmmirror.com/topo/-/topo-3.0.3.tgz",
+      "integrity": "sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ==",
+      "requires": {
+        "hoek": "6.x.x"
+      },
+      "dependencies": {
+        "hoek": {
+          "version": "6.1.3",
+          "resolved": "https://registry.npmmirror.com/hoek/-/hoek-6.1.3.tgz",
+          "integrity": "sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ=="
+        }
+      }
+    },
     "tough-cookie": {
       "version": "4.1.3",
       "resolved": "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-4.1.3.tgz",
       "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==",
-      "dev": true,
       "requires": {
         "psl": "^1.1.33",
         "punycode": "^2.1.1",
@@ -7278,6 +9088,19 @@
       "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.6.2.tgz",
       "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
       "dev": true
+    },
+    "tunnel-agent": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+      "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+      "requires": {
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "tweetnacl": {
+      "version": "0.14.5",
+      "resolved": "https://registry.npmmirror.com/tweetnacl/-/tweetnacl-0.14.5.tgz",
+      "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="
     },
     "type-check": {
       "version": "0.4.0",
@@ -7306,11 +9129,15 @@
       "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==",
       "dev": true
     },
+    "underscore": {
+      "version": "1.12.1",
+      "resolved": "https://registry.npmmirror.com/underscore/-/underscore-1.12.1.tgz",
+      "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw=="
+    },
     "universalify": {
       "version": "0.2.0",
       "resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.2.0.tgz",
-      "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
-      "dev": true
+      "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg=="
     },
     "unplugin": {
       "version": "1.10.0",
@@ -7376,7 +9203,6 @@
       "version": "1.5.10",
       "resolved": "https://registry.npmmirror.com/url-parse/-/url-parse-1.5.10.tgz",
       "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
-      "dev": true,
       "requires": {
         "querystringify": "^2.1.1",
         "requires-port": "^1.0.0"
@@ -7387,6 +9213,21 @@
       "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz",
       "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
       "dev": true
+    },
+    "uuid": {
+      "version": "10.0.0",
+      "resolved": "https://registry.npmmirror.com/uuid/-/uuid-10.0.0.tgz",
+      "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ=="
+    },
+    "verror": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmmirror.com/verror/-/verror-1.10.0.tgz",
+      "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
+      "requires": {
+        "assert-plus": "^1.0.0",
+        "core-util-is": "1.0.2",
+        "extsprintf": "^1.2.0"
+      }
     },
     "vite": {
       "version": "5.2.6",
@@ -7544,7 +9385,6 @@
       "version": "2.0.2",
       "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz",
       "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-      "dev": true,
       "requires": {
         "isexe": "^2.0.0"
       }
@@ -7626,8 +9466,7 @@
     "wrappy": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
-      "dev": true
+      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
     },
     "ws": {
       "version": "8.16.0",
@@ -7642,6 +9481,21 @@
       "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==",
       "dev": true
     },
+    "xml2json": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmmirror.com/xml2json/-/xml2json-0.12.0.tgz",
+      "integrity": "sha512-EPJHRWJnJUYbJlzR4pBhZODwWdi2IaYGtDdteJi0JpZ4OD31IplWALuit8r73dJuM4iHZdDVKY1tLqY2UICejg==",
+      "requires": {
+        "hoek": "^4.2.1",
+        "joi": "^13.1.2",
+        "node-expat": "^2.3.18"
+      }
+    },
+    "xmlbuilder": {
+      "version": "10.1.1",
+      "resolved": "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-10.1.1.tgz",
+      "integrity": "sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg=="
+    },
     "xmlchars": {
       "version": "2.2.0",
       "resolved": "https://registry.npmmirror.com/xmlchars/-/xmlchars-2.2.0.tgz",
@@ -7654,6 +9508,38 @@
       "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
       "dev": true
     },
+    "yamljs": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmmirror.com/yamljs/-/yamljs-0.3.0.tgz",
+      "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==",
+      "requires": {
+        "argparse": "^1.0.7",
+        "glob": "^7.0.5"
+      },
+      "dependencies": {
+        "argparse": {
+          "version": "1.0.10",
+          "resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz",
+          "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+          "requires": {
+            "sprintf-js": "~1.0.2"
+          }
+        },
+        "glob": {
+          "version": "7.2.3",
+          "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz",
+          "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+          "requires": {
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.1.1",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        }
+      }
+    },
     "yocto-queue": {
       "version": "0.1.0",
       "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz",
diff --git a/package.json b/package.json
index b002e29..c9aa419 100644
--- a/package.json
+++ b/package.json
@@ -5,7 +5,9 @@
   "type": "module",
   "scripts": {
     "dev": "vite",
+    "dev:jingan": "vite --mode development.jingan",
     "build": "vite build",
+    "build:jingan": "vite build --mode production.jingan",
     "preview": "vite preview",
     "test:unit": "vitest",
     "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs --fix --ignore-path .gitignore",
@@ -24,11 +26,16 @@
     "echarts": "^5.5.0",
     "element-plus": "^2.6.2",
     "jquery": "^3.7.1",
+    "jquery-xml2json": "^0.0.8",
+    "jquery.soap": "^1.7.3",
+    "js-base64": "^3.7.7",
     "moment": "^2.30.1",
     "pinia": "^2.1.7",
+    "strong-soap": "^4.1.3",
     "unplugin-vue-components": "^0.26.0",
     "vue": "^3.4.21",
-    "vue-router": "^4.3.0"
+    "vue-router": "^4.3.0",
+    "xml2json": "^0.12.0"
   },
   "devDependencies": {
     "@rushstack/eslint-patch": "^1.3.3",
diff --git a/public/favicon.ico b/public/favicon.ico
index df36fcf..43aa390 100644
--- a/public/favicon.ico
+++ b/public/favicon.ico
Binary files differ
diff --git a/src/api/index.js b/src/api/index.js
index ed45795..ef5ed5c 100644
--- a/src/api/index.js
+++ b/src/api/index.js
@@ -1,10 +1,13 @@
 import axios from 'axios';
 import { ElMessage } from 'element-plus';
 
-const debug = false;
+const debug = true;
 
-// let ip1 = 'http://114.215.109.124:8805/';
 let ip1 = 'http://47.100.191.150:9029/';
+// console.log(import.meta.env);
+if (import.meta.env.VITE_DATA_MODE == 'jingan') {
+  ip1 = 'http://114.215.109.124:8805/';
+}
 
 if (debug) {
   ip1 = 'http://192.168.0.138:8084/';
@@ -21,17 +24,21 @@
   i.interceptors.request.use(
     function (config) {
       // 鍦ㄥ彂閫佽姹備箣鍓嶅仛浜涗粈涔�
-      console.log('==>璇锋眰寮�濮�');
-      console.log(`${config.baseURL}${config.url}`);
-      if (config.data) {
-        console.log('==>璇锋眰鏁版嵁', config.data);
+      if (import.meta.env.DEV) {
+        console.log('==>璇锋眰寮�濮�');
+        console.log(`${config.baseURL}${config.url}`);
+        if (config.data) {
+          console.log('==>璇锋眰鏁版嵁', config.data);
+        }
       }
       return config;
     },
     function (error) {
       // 瀵硅姹傞敊璇仛浜涗粈涔�
-      console.log('==>璇锋眰寮�濮�');
-      console.log(error);
+      if (import.meta.env.DEV) {
+        console.log('==>璇锋眰寮�濮�');
+        console.log(error);
+      }
       ElMessage({
         message: error,
         type: 'error'
@@ -45,8 +52,10 @@
     function (response) {
       // 2xx 鑼冨洿鍐呯殑鐘舵�佺爜閮戒細瑙﹀彂璇ュ嚱鏁般��
       // 瀵瑰搷搴旀暟鎹仛鐐逛粈涔�
-      console.log(response);
-      console.log('==>璇锋眰缁撴潫');
+      if (import.meta.env.DEV) {
+        console.log(response);
+        console.log('==>璇锋眰缁撴潫');
+      }
       if (response.status == 200) {
         if (
           response.data.success != undefined &&
@@ -71,8 +80,10 @@
     function (error) {
       // 瓒呭嚭 2xx 鑼冨洿鐨勭姸鎬佺爜閮戒細瑙﹀彂璇ュ嚱鏁般��
       // 瀵瑰搷搴旈敊璇仛鐐逛粈涔�
-      console.log(error);
-      console.log('==>璇锋眰缁撴潫');
+      if (import.meta.env.DEV) {
+        console.log(error);
+        console.log('==>璇锋眰缁撴潫');
+      }
       ElMessage({
         message: error,
         type: 'error'
diff --git a/src/api/missionApi.js b/src/api/missionApi.js
index af08c4d..764199a 100644
--- a/src/api/missionApi.js
+++ b/src/api/missionApi.js
@@ -1,4 +1,5 @@
 import { $http } from './index';
+import { Base64 } from 'js-base64';
 
 /**
  *
@@ -17,5 +18,22 @@
   deleteMission(missionCode) {
     let params = `missionCode=${missionCode}`;
     return $http.post(`air/mission/delete?${params}`).then((res) => res.data);
+  },
+
+  downloadReport(missionCode) {
+    let params = `missionCode=${missionCode}`;
+    return $http
+      .get(`air/mission/report?${params}`, { responseType: 'blob' })
+      .then((res) => {
+        const name = Base64.decode(res.headers.get('fileName'));
+        const url = window.URL.createObjectURL(res.data);
+        const link = document.createElement('a');
+        link.href = url;
+        link.setAttribute('download', name);
+        document.body.appendChild(link);
+        link.click();
+        document.body.removeChild(link);
+        window.URL.revokeObjectURL(url);
+      });
   }
 };
diff --git a/src/assets/common-style.css b/src/assets/common-style.css
index f3d4346..e2de279 100644
--- a/src/assets/common-style.css
+++ b/src/assets/common-style.css
@@ -181,7 +181,7 @@
 }
 
 .time {
-  color: #ffffff9d;
+  color: #ffffffde;
   font-size: 12px;
 }
 
@@ -415,7 +415,7 @@
 }
 
 .custom-info {
-  border: solid 1px silver;
+  border: solid 1px rgb(255, 255, 255);
 }
 
 div.info-top {
@@ -440,6 +440,7 @@
 div.info-middle {
   padding: 0px 12px 4px 0px;
   /* line-height: 20px; */
+  color: #ffffffde;
 }
 
 div.refresh-btn {
@@ -527,4 +528,10 @@
   color: var(--font-color);
   font-size: 16px;
   padding: 0px 4px;
+}
+
+.text-clz {
+  /* background-color: aliceblue; */
+  font-size: 14px;
+  line-height: 16px;
 }
\ No newline at end of file
diff --git a/src/components.d.ts b/src/components.d.ts
index c720d3b..216f2b2 100644
--- a/src/components.d.ts
+++ b/src/components.d.ts
@@ -11,6 +11,7 @@
     BaseMap: typeof import('./components/map/BaseMap.vue')['default']
     CardButton: typeof import('./components/CardButton.vue')['default']
     CardDialog: typeof import('./components/CardDialog.vue')['default']
+    copy: typeof import('./components/search/OptionType copy.vue')['default']
     CoreHeader: typeof import('./components/core/CoreHeader.vue')['default']
     CoreMenu: typeof import('./components/core/CoreMenu.vue')['default']
     DataSummary: typeof import('./components/monitor/DataSummary.vue')['default']
@@ -57,11 +58,13 @@
     MissionImport: typeof import('./components/mission/MissionImport.vue')['default']
     MissionManage: typeof import('./components/mission/MissionManage.vue')['default']
     OptionDevice: typeof import('./components/search/OptionDevice.vue')['default']
+    'OptionDevice copy': typeof import('./components/search/OptionDevice copy.vue')['default']
     OptionLocation: typeof import('./components/search/OptionLocation.vue')['default']
     OptionLocation2: typeof import('./components/search/OptionLocation2.vue')['default']
     OptionMission: typeof import('./components/search/OptionMission.vue')['default']
     OptionTime: typeof import('./components/search/OptionTime.vue')['default']
     OptionType: typeof import('./components/search/OptionType.vue')['default']
+    'OptionType copy': typeof import('./components/search/OptionType copy.vue')['default']
     ProgressLineChart: typeof import('./components/chart/ProgressLineChart.vue')['default']
     RealTimeLineChart: typeof import('./components/chart/RealTimeLineChart.vue')['default']
     RouterLink: typeof import('vue-router')['RouterLink']
diff --git a/src/components/SliderBar.vue b/src/components/SliderBar.vue
index 6acf1bd..9dfb8c5 100644
--- a/src/components/SliderBar.vue
+++ b/src/components/SliderBar.vue
@@ -1,6 +1,7 @@
 <template>
   <el-row justify="center" align="middle" class="wrap">
-    <el-form-item label="鏁版嵁閲�">
+    <!-- <el-col :span="6"> -->
+    <el-form-item label="灞曠ず鏁版嵁閲�">
       <el-select
         v-model="pageSize"
         @change="handleSizeChange"
@@ -12,9 +13,12 @@
         <el-option label="500" :value="500" />
       </el-select>
     </el-form-item>
+    <!-- </el-col> -->
+    <!-- <el-col :span="18"> -->
     <div class="slider-wrap m-l-16">
       <el-slider :model-value="progress" :marks="marks" @input="handleInput" />
     </div>
+    <!-- </el-col> -->
   </el-row>
 </template>
 <script>
@@ -62,6 +66,10 @@
   height: 60px;
 }
 .slider-wrap {
-  min-width: 400px;
+  /* background-color: aliceblue; */
+  min-width: 290px;
+}
+.el-form-item {
+  margin-bottom: 0px;
 }
 </style>
diff --git a/src/components/animation/HistoricalTrajectory.vue b/src/components/animation/HistoricalTrajectory.vue
index 4aaea2d..37d23be 100644
--- a/src/components/animation/HistoricalTrajectory.vue
+++ b/src/components/animation/HistoricalTrajectory.vue
@@ -2,28 +2,28 @@
   <BaseCard size="middle-s" direction="up">
     <template #content>
       <el-row align="middle" style="gap: 6px">
-        <div>鍘嗗彶杞ㄨ抗</div>
-        <div class="map-btn-group">
-          <font-awesome-icon
-            :icon="btnStop.icon"
-            :class="'btn-search m-r-2 ' + btnStop.clz"
-            @click="handleStop"
-          />
-          <font-awesome-icon
-            :icon="btnPlay.icon"
-            class="btn-search"
-            @click="handlePlayOrPause"
-          />
-        </div>
-        <div class="label-date margin-left-2">
-          <span class="label-date-title">鍊嶉��</span>
+        <el-form-item label="鍘嗗彶杞ㄨ抗">
+          <div class="map-btn-group">
+            <font-awesome-icon
+              :icon="btnStop.icon"
+              :class="'btn-search m-r-2 ' + btnStop.clz"
+              @click="handleStop"
+            />
+            <font-awesome-icon
+              :icon="btnPlay.icon"
+              class="btn-search"
+              @click="handlePlayOrPause"
+            />
+          </div>
+        </el-form-item>
+        <el-form-item label="鍊嶉��">
           <el-select v-model="speed" size="small" class="w-60">
             <el-option label="1.0X" :value="1" />
             <el-option label="4.0X" :value="4" />
             <el-option label="8.0X" :value="8" />
             <el-option label="16X" :value="16" />
           </el-select>
-        </div>
+        </el-form-item>
       </el-row>
     </template>
   </BaseCard>
@@ -140,4 +140,8 @@
 .btn-disable {
   color: gray;
 }
+
+.el-form-item {
+  margin-bottom: 0px;
+}
 </style>
diff --git a/src/components/map/MapScene.vue b/src/components/map/MapScene.vue
index b230c8c..c3cb97a 100644
--- a/src/components/map/MapScene.vue
+++ b/src/components/map/MapScene.vue
@@ -28,6 +28,7 @@
           v-for="item in options"
           :key="item.label"
           :value="item.value"
+          :disabled="item.disabled"
           >{{ item.label }}</el-checkbox
         >
       </div>
diff --git a/src/components/map/MapToolbox.vue b/src/components/map/MapToolbox.vue
index 0b0db4d..39f98c7 100644
--- a/src/components/map/MapToolbox.vue
+++ b/src/components/map/MapToolbox.vue
@@ -72,25 +72,25 @@
             this.value = !this.value;
             toolbox.toggleCoorPicking(this.value);
           }
-        },
-        {
-          icon: 'fa fa-compass',
-          label: '鏁版嵁鏍囪',
-          value: true,
-          click: function () {
-            this.value = !this.value;
-            // todo 鏁版嵁鏍囪
-          }
-        },
-        {
-          icon: 'fa fa-compass',
-          label: '鏁版嵁寮规',
-          value: true,
-          click: function () {
-            this.value = !this.value;
-            // todo 鏁版嵁寮规
-          }
         }
+        // {
+        //   icon: 'fa fa-compass',
+        //   label: '鏁版嵁鏍囪',
+        //   value: true,
+        //   click: function () {
+        //     this.value = !this.value;
+        //     // todo 鏁版嵁鏍囪
+        //   }
+        // },
+        // {
+        //   icon: 'fa fa-compass',
+        //   label: '鏁版嵁寮规',
+        //   value: true,
+        //   click: function () {
+        //     this.value = !this.value;
+        //     // todo 鏁版嵁寮规
+        //   }
+        // }
       ]
     };
   },
diff --git a/src/components/mission/MIssionCreate.vue b/src/components/mission/MIssionCreate.vue
index 1966572..11ddbb4 100644
--- a/src/components/mission/MIssionCreate.vue
+++ b/src/components/mission/MIssionCreate.vue
@@ -33,14 +33,6 @@
         />
       </el-form-item>
       <OptionType v-model="formObj.deviceType"></OptionType>
-      <!-- <el-form-item label="璁惧缂栧彿" prop="acountname">
-        <el-input
-          size="small"
-          clearable
-          v-model="formObj.deviceCode"
-          placeholder="璁惧缂栧彿"
-        />
-      </el-form-item> -->
       <OptionDevice
         :type="formObj.deviceType"
         v-model="formObj.deviceCode"
@@ -60,6 +52,7 @@
   </CardDialog>
 </template>
 <script setup>
+import moment from 'moment';
 import { ref, reactive, computed } from 'vue';
 import missionApi from '@/api/missionApi';
 import { useFormConfirm } from '@/composables/formConfirm';
@@ -87,8 +80,23 @@
   timeArray: [
     {
       required: true,
-      message: '鏃堕棿涓嶈兘涓虹┖',
-      trigger: 'change'
+      // message: '鏃堕棿涓嶈兘涓虹┖',
+      trigger: 'change',
+      validator: (rule, value, callback) => {
+        console.log(rule);
+        console.log(value);
+        if (value == null) {
+          callback(new Error('鏃堕棿涓嶈兘涓虹┖'));
+        } else {
+          const st = moment(value[0]);
+          const et = moment(value[1]);
+          const range = et.diff(st, 'second');
+          if (range > 12 * 60 * 60) {
+            callback(new Error('浠诲姟鏃堕暱鏈�澶氫负12灏忔椂'));
+          }
+        }
+        callback();
+      }
     }
   ]
 });
@@ -121,4 +129,20 @@
     }
   }
 });
+
+if (import.meta.env.VITE_DATA_MODE == 'jingan') {
+  formObj.value.location = {
+    pCode: '31',
+    pName: '涓婃捣甯�',
+    cCode: '3100',
+    cName: '涓婃捣甯�',
+    dCode: '310106',
+    dName: '闈欏畨鍖�'
+  };
+}
 </script>
+<style scoped>
+/* .el-form-item {
+  margin-bottom: 0px;
+} */
+</style>
diff --git a/src/components/mission/MissionManage.vue b/src/components/mission/MissionManage.vue
index 5884383..7e67122 100644
--- a/src/components/mission/MissionManage.vue
+++ b/src/components/mission/MissionManage.vue
@@ -41,7 +41,7 @@
             align="center"
             :formatter="timeFormatter"
           />
-          <el-table-column label="绠$悊" width="70" align="center">
+          <el-table-column label="绠$悊" width="140" align="center">
             <template #default="{ row }">
               <el-button
                 type="primary"
@@ -49,6 +49,14 @@
                 class="el-button-custom"
                 @click="deleteMission(row)"
                 >鍒犻櫎</el-button
+              >
+              <el-button
+                :loading="row.downloadLoading"
+                type="primary"
+                size="small"
+                class="el-button-custom"
+                @click="downloadReport(row)"
+                >鎶ュ憡</el-button
               >
             </template>
           </el-table-column>
@@ -61,16 +69,16 @@
               </el-button> -->
           <MissionCreate></MissionCreate>
         </div>
-        <div>
+        <!-- <div>
           <el-button type="primary" class="el-button-custom">
             鏁版嵁瀵煎叆
           </el-button>
-        </div>
-        <div>
+        </div> -->
+        <!-- <div>
           <el-button type="primary" class="el-button-custom">
             涓嬭浇妯℃澘
           </el-button>
-        </div>
+        </div> -->
       </el-col>
     </el-row>
   </CardDialog>
@@ -84,6 +92,7 @@
 </template>
 <script>
 import moment from 'moment';
+import missionApi from '@/api/missionApi';
 import { mapStores } from 'pinia';
 import { useMissionStore } from '@/stores/mission';
 import { useFetchData } from '@/composables/fetchData';
@@ -111,6 +120,12 @@
       };
       this.msgBoxVisible = true;
     },
+    downloadReport(row) {
+      row.downloadLoading = true;
+      missionApi
+        .downloadReport(row.missionCode)
+        .finally(() => (row.downloadLoading = false));
+    },
     timeFormatter(row, col, cellValue, index) {
       return moment(cellValue).format('YYYY-MM-DD HH:mm:ss');
     }
diff --git a/src/components/monitor/DataSummary.vue b/src/components/monitor/DataSummary.vue
index 4d4b9e2..39a61f0 100644
--- a/src/components/monitor/DataSummary.vue
+++ b/src/components/monitor/DataSummary.vue
@@ -70,12 +70,14 @@
             total += v.factorData;
             count++;
           });
+          let _avg = count == 0 ? 0 : Math.round((total / count) * 100) / 100;
+          if (isNaN(_avg)) _avg = '-';
           list.push({
             factorId: f.factorId,
             factor: factorName[f.factorName],
             min,
             max,
-            avg: count == 0 ? 0 : Math.round((total / count) * 100) / 100
+            avg: _avg
           });
         }
       }
diff --git a/src/components/monitor/DataTable.vue b/src/components/monitor/DataTable.vue
index 2681130..29619e0 100644
--- a/src/components/monitor/DataTable.vue
+++ b/src/components/monitor/DataTable.vue
@@ -65,6 +65,7 @@
 import { FactorDatas } from '@/model/FactorDatas';
 import { checkboxOptions } from '@/constant/checkbox-options';
 import { TYPE0 } from '@/constant/device-type';
+import { windDir } from '@/constant/wind-dir';
 
 export default {
   props: {
@@ -112,13 +113,18 @@
         if (Object.hasOwnProperty.call(this.factorDatas.factor, key)) {
           const f = this.factorDatas.factor[key];
           f.datas.forEach((v, i) => {
+            const name = f.factorName;
+            let value = v.factorData;
+            if (name == 'WIND_DIRECTION') {
+              value = windDir(value);
+            }
             if (list.length <= i) {
               list.push({
                 index: i,
-                [f.factorName]: v.factorData
+                [name]: value
               });
             } else {
-              list[i][f.factorName] = v.factorData;
+              list[i][name] = value;
             }
           });
         }
@@ -164,7 +170,8 @@
 .el-table {
   --el-table-bg-color: transparent;
   --el-table-row-hover-bg-color: #23dad0a2;
-  --el-table-current-row-bg-color: #7dff5d96;
+  --el-table-current-row-bg-color: #23dad0a2;
+  /* --el-table-current-row-bg-color: #7dff5d96; */
   --el-table-text-color: var(--font-color);
 }
 
diff --git a/src/components/monitor/FactorCheckbox.vue b/src/components/monitor/FactorCheckbox.vue
index 7e236e3..093920a 100644
--- a/src/components/monitor/FactorCheckbox.vue
+++ b/src/components/monitor/FactorCheckbox.vue
@@ -63,9 +63,7 @@
   },
   emits: ['update:modelValue'],
   data() {
-    return {
-      checkbox: [checkboxOptions(TYPE0)[0].value]
-    };
+    return {};
   },
   computed: {
     options() {
@@ -81,7 +79,7 @@
           const e = array[i];
           res.push(e.value);
         }
-        this.$emit('update:modelValue', res);
+        this.handleChange(res);
       }
     }
   },
@@ -95,10 +93,23 @@
 <style scoped>
 .el-checkbox {
   --el-checkbox-text-color: white;
+  --main-color: #23dad1;
+  --el-checkbox-checked-text-color: var(--main-color);
+  --el-checkbox-checked-input-border-color: var(--main-color);
+  --el-checkbox-checked-bg-color: var(--main-color);
+  --el-checkbox-input-border-color-hover: var(--main-color);
+
+  --el-checkbox-disabled-checked-input-fill: var(--main-color);
+  --el-checkbox-disabled-checked-input-border-color: var(--main-color);
+  --el-checkbox-disabled-checked-icon-color: white;
   margin-right: 6px;
   /* height: initial; */
 }
 
+.el-checkbox__input.is-disabled + span.el-checkbox__label {
+  color: var(--el-color-primary);
+}
+
 .vertical-class {
   display: flex;
   flex-direction: column;
diff --git a/src/components/monitor/FactorRadio.vue b/src/components/monitor/FactorRadio.vue
index afdd4d5..ce67151 100644
--- a/src/components/monitor/FactorRadio.vue
+++ b/src/components/monitor/FactorRadio.vue
@@ -52,6 +52,7 @@
 <style scoped>
 .el-radio {
   --el-radio-text-color: white;
+  --el-color-primary: #23dad1;
   margin-right: 10px;
   height: initial;
 }
diff --git a/src/components/monitor/FactorTrend.vue b/src/components/monitor/FactorTrend.vue
index f2e0e3f..eddadbb 100644
--- a/src/components/monitor/FactorTrend.vue
+++ b/src/components/monitor/FactorTrend.vue
@@ -2,18 +2,6 @@
   <BaseCard size="medium" direction="left">
     <template #content>
       <el-scrollbar height="calc(98vh - var(--bevel-length-2))">
-        <!-- <div v-for="item in factorTypes" :key="item">
-          <el-row>
-            <div>{{ allSeries.get(item.value).name }}</div>
-            <div>{{ allSeries.get(item.value).currentData }}</div>
-            <div>{{ allSeries.get(item.value).min }}</div>
-            <div>{{ allSeries.get(item.value).max }}</div>
-            <RealTimeLineChart
-              v-show="selectFactorType.includes(item.value)"
-              :model-value="series(item.value)"
-            ></RealTimeLineChart>
-          </el-row>
-        </div> -->
         <div v-for="item in seriesList" :key="item.key">
           <el-row
             v-show="selectFactorType.includes(item.series.key)"
@@ -74,18 +62,8 @@
     };
   },
   computed: {
-    factorTypes() {
-      return checkboxOptions(this.deviceType);
-    }
-    // seriesList() {
-    //   const list = [];
-    //   for (const iterator of this.allSeries) {
-    //     list.push({
-    //       xAxis: this.xAxis,
-    //       series: iterator[1]
-    //     });
-    //   }
-    //   return list;
+    // factorTypes() {
+    //   return checkboxOptions(this.deviceType);
     // }
   },
   watch: {
@@ -165,12 +143,20 @@
     },
     toList() {
       const list = [];
-      for (const iterator of this.allSeries) {
-        list.push({
-          xAxis: this.xAxis,
-          series: iterator[1]
-        });
-      }
+      // for (const iterator of this.allSeries) {
+      //   list.push({
+      //     xAxis: this.xAxis,
+      //     series: iterator[1]
+      //   });
+      // }
+      checkboxOptions(this.deviceType).forEach((t) => {
+        if (this.allSeries.has(t.value)) {
+          list.push({
+            xAxis: this.xAxis,
+            series: this.allSeries.get(t.value)
+          });
+        }
+      });
       this.seriesList = list;
     },
     // getScaleValue(label, value) {
@@ -199,7 +185,7 @@
 }
 
 .factor-name {
-  color: var(--el-color-warning);
+  color: #23dad1;
 }
 
 .factor-unit {
diff --git a/src/components/monitor/WeatherData.vue b/src/components/monitor/WeatherData.vue
index 6609315..af32269 100644
--- a/src/components/monitor/WeatherData.vue
+++ b/src/components/monitor/WeatherData.vue
@@ -26,7 +26,7 @@
 </template>
 <script>
 import { FactorDatas } from '@/model/FactorDatas';
-import { windDir } from '../../constant/wind-dir';
+import { windDir } from '@/constant/wind-dir';
 
 export default {
   props: {
diff --git a/src/components/search/OptionDevice copy.vue b/src/components/search/OptionDevice copy.vue
new file mode 100644
index 0000000..6fc1b0a
--- /dev/null
+++ b/src/components/search/OptionDevice copy.vue
@@ -0,0 +1,72 @@
+<template>
+  <el-form-item label="璁惧">
+    <el-select
+      :model-value="modelValue"
+      @update:model-value="handleChange"
+      placeholder="璁惧"
+      size="small"
+      class="w-120"
+    >
+      <el-option
+        v-for="(s, i) in deviceList"
+        :key="i"
+        :label="s.label"
+        :value="s.value"
+      />
+    </el-select>
+  </el-form-item>
+</template>
+
+<script>
+export default {
+  props: {
+    type: String,
+    modelValue: String
+  },
+  emits: ['update:modelValue'],
+  data() {
+    return {};
+  },
+  computed: {
+    deviceList() {
+      const t = this.type ? this.type : '0a';
+      return [1, 2, 3].map((v) => {
+        const label = `${this.getDeviceType(t)}璁惧${v}鍙穈;
+        const value = `${t}000000000${v}`;
+        return {
+          label: label,
+          value: value
+        };
+      });
+    }
+  },
+  watch: {
+    deviceList(nV, oV) {
+      if (nV != oV) {
+        this.handleChange(nV[0].value);
+      }
+    }
+  },
+  methods: {
+    handleChange(value) {
+      this.$emit('update:modelValue', value);
+    },
+    getDeviceType(t) {
+      switch (t) {
+        case '0a':
+          return '杞﹁浇';
+        case '0b':
+          return '鏃犱汉鏈�';
+        case '0c':
+          return '鏃犱汉鑸�';
+        default:
+          return '杞﹁浇';
+      }
+    }
+  },
+  mounted() {
+    this.handleChange(this.deviceList[0].value);
+  }
+};
+</script>
+<style scoped></style>
diff --git a/src/components/search/OptionDevice.vue b/src/components/search/OptionDevice.vue
index 6fc1b0a..2ba1468 100644
--- a/src/components/search/OptionDevice.vue
+++ b/src/components/search/OptionDevice.vue
@@ -8,7 +8,7 @@
       class="w-120"
     >
       <el-option
-        v-for="(s, i) in deviceList"
+        v-for="(s, i) in deviceOptions"
         :key="i"
         :label="s.label"
         :value="s.value"
@@ -18,6 +18,8 @@
 </template>
 
 <script>
+import { deviceList } from '@/constant/device-type';
+
 export default {
   props: {
     type: String,
@@ -28,20 +30,12 @@
     return {};
   },
   computed: {
-    deviceList() {
-      const t = this.type ? this.type : '0a';
-      return [1, 2, 3].map((v) => {
-        const label = `${this.getDeviceType(t)}璁惧${v}鍙穈;
-        const value = `${t}000000000${v}`;
-        return {
-          label: label,
-          value: value
-        };
-      });
+    deviceOptions() {
+      return deviceList(this.type);
     }
   },
   watch: {
-    deviceList(nV, oV) {
+    deviceOptions(nV, oV) {
       if (nV != oV) {
         this.handleChange(nV[0].value);
       }
@@ -50,22 +44,10 @@
   methods: {
     handleChange(value) {
       this.$emit('update:modelValue', value);
-    },
-    getDeviceType(t) {
-      switch (t) {
-        case '0a':
-          return '杞﹁浇';
-        case '0b':
-          return '鏃犱汉鏈�';
-        case '0c':
-          return '鏃犱汉鑸�';
-        default:
-          return '杞﹁浇';
-      }
     }
   },
   mounted() {
-    this.handleChange(this.deviceList[0].value);
+    this.handleChange(this.deviceOptions[0].value);
   }
 };
 </script>
diff --git a/src/components/search/OptionLocation.vue b/src/components/search/OptionLocation.vue
index 71e5edc..b4ceed8 100644
--- a/src/components/search/OptionLocation.vue
+++ b/src/components/search/OptionLocation.vue
@@ -25,12 +25,7 @@
   emits: ['update:modelValue'],
   data() {
     return {
-      typeList: [
-        {
-          label: '闀垮畞鍖�',
-          value: '310105'
-        }
-      ]
+      typeList: []
     };
   },
   methods: {
@@ -40,6 +35,22 @@
     }
   },
   mounted() {
+    let options = [
+      {
+        label: '闀垮畞鍖�',
+        value: '310105'
+      }
+    ];
+
+    if (import.meta.env.VITE_DATA_MODE == 'jingan') {
+      options = [
+        {
+          label: '闈欏畨鍖�',
+          value: '310106'
+        }
+      ];
+    }
+    this.typeList = options;
     this.handleChange(this.typeList[0].value);
   }
 };
diff --git a/src/components/search/OptionMission.vue b/src/components/search/OptionMission.vue
index 7ee4d9b..f26efe3 100644
--- a/src/components/search/OptionMission.vue
+++ b/src/components/search/OptionMission.vue
@@ -19,7 +19,6 @@
 
 <script>
 import { mapStores } from 'pinia';
-import missionApi from '@/api/missionApi';
 import { useFetchData } from '@/composables/fetchData';
 import { useMissionStore } from '@/stores/mission';
 
@@ -43,23 +42,15 @@
   },
   methods: {
     fetchMission() {
-      // this.fetchData((page, pageSize) => {
-      //   return missionApi
-      //     .fethchMission({ type: this.type, page, pageSize })
-      //     .then((res) => {
-      //       this.missionList = res.data;
-      //       this.missionStore.missionList = res.data;
-      //       // if (this.missionList.length > 0) {
-      //       //   this.handleChange(0);
-      //       // }
-      //       return res.head;
-      //     });
-      // });
-      this.missionStore.fetchMission(this.type);
+      this.missionStore.fetchMission(this.type).then((res) => {
+        if (res.success && res.data.length > 0) {
+          this.index = 0;
+          this.handleChange(0);
+        }
+      });
     },
     handleChange(value) {
       this.$emit('update:modelValue', this.missionStore.missionList[value]);
-      // this.$emit('change', this.missionList[value]);
     }
   },
   mounted() {
diff --git a/src/components/search/OptionTime.vue b/src/components/search/OptionTime.vue
index 29ccf19..bb11f85 100644
--- a/src/components/search/OptionTime.vue
+++ b/src/components/search/OptionTime.vue
@@ -7,20 +7,30 @@
       start-placeholder="閫夋嫨寮�濮嬫椂闂�"
       end-placeholder="閫夋嫨缁撴潫鏃堕棿"
       size="small"
+      :disabled-date="diableData"
     />
   </el-form-item>
 </template>
 
 <script>
+import moment from 'moment';
+import { ElMessage } from 'element-plus';
+
 export default {
   props: {
+    // 鏃ユ湡鍊�
     modelValue: {
       type: Array
     },
+    // 鎺т欢绫诲瀷
     type: {
       type: String,
       default: 'datetimerange'
-    }
+    },
+    // 鍏佽寮�濮嬫椂闂�
+    startDate: Date,
+    // 鍏佽缁撴潫鏃堕棿
+    endDate: Date
   },
   emits: ['update:modelValue'],
   data() {
@@ -28,7 +38,40 @@
   },
   methods: {
     handleChange(value) {
-      this.$emit('update:modelValue', value);
+      // 鏃堕棿涓嶈兘瓒呰繃璁惧畾鐨勫紑濮嬬粨鏉熸椂闂�
+      let outRange = false;
+      if (this.startDate) {
+        outRange =
+          outRange ||
+          moment(value[0]).isBefore(this.startDate) ||
+          moment(value[1]).isBefore(this.startDate);
+      }
+      if (this.endDate) {
+        outRange =
+          outRange ||
+          moment(value[0]).isAfter(this.endDate) ||
+          moment(value[1]).isAfter(this.endDate);
+      }
+      if (outRange) {
+        ElMessage({
+          message: '鎵�閫夋椂闂翠笉鑳借秴杩囪蛋鑸换鍔℃椂闂磋寖鍥�',
+          type: 'warning'
+        });
+      } else {
+        this.$emit('update:modelValue', value);
+      }
+    },
+    diableData(date) {
+      const time = moment(date);
+      let result1 = false;
+      let result2 = false;
+      if (this.startDate) {
+        result1 = time.isBefore(this.startDate);
+      }
+      if (this.endDate) {
+        result2 = time.isAfter(this.endDate);
+      }
+      return result1 || result2;
     }
   },
   mounted() {
diff --git a/src/components/search/OptionType copy.vue b/src/components/search/OptionType copy.vue
new file mode 100644
index 0000000..b6e4817
--- /dev/null
+++ b/src/components/search/OptionType copy.vue
@@ -0,0 +1,54 @@
+<template>
+  <el-form-item label="绫诲瀷">
+    <el-select
+      :model-value="modelValue"
+      @update:model-value="handleChange"
+      placeholder="绫诲瀷"
+      size="small"
+      class="w-80"
+    >
+      <el-option
+        v-for="(s, i) in typeList"
+        :key="i"
+        :label="s.label"
+        :value="s.value"
+      />
+    </el-select>
+  </el-form-item>
+</template>
+
+<script>
+export default {
+  props: {
+    modelValue: String
+  },
+  emits: ['update:modelValue'],
+  data() {
+    return {
+      typeList: [
+        {
+          label: '杞﹁浇',
+          value: '0a'
+        },
+        {
+          label: '鏃犱汉鏈�',
+          value: '0b'
+        },
+        {
+          label: '鏃犱汉鑸�',
+          value: '0c'
+        }
+      ]
+    };
+  },
+  methods: {
+    handleChange(value) {
+      // todo 鏍规嵁璁惧绫诲瀷鍒囨崲鍦板浘杞藉叿鐨勫浘鏍囥��
+      this.$emit('update:modelValue', value);
+    }
+  },
+  mounted() {
+    this.handleChange(this.typeList[0].value);
+  }
+};
+</script>
diff --git a/src/components/search/OptionType.vue b/src/components/search/OptionType.vue
index b6e4817..644898d 100644
--- a/src/components/search/OptionType.vue
+++ b/src/components/search/OptionType.vue
@@ -1,5 +1,5 @@
 <template>
-  <el-form-item label="绫诲瀷">
+  <el-form-item v-show="isShow" label="绫诲瀷">
     <el-select
       :model-value="modelValue"
       @update:model-value="handleChange"
@@ -18,6 +18,7 @@
 </template>
 
 <script>
+import { typeList } from '@/constant/device-type';
 export default {
   props: {
     modelValue: String
@@ -25,20 +26,8 @@
   emits: ['update:modelValue'],
   data() {
     return {
-      typeList: [
-        {
-          label: '杞﹁浇',
-          value: '0a'
-        },
-        {
-          label: '鏃犱汉鏈�',
-          value: '0b'
-        },
-        {
-          label: '鏃犱汉鑸�',
-          value: '0c'
-        }
-      ]
+      typeList: typeList(),
+      isShow: import.meta.env.VITE_DATA_MODE != 'jingan'
     };
   },
   methods: {
diff --git a/src/components/search/SearchBar.vue b/src/components/search/SearchBar.vue
index 4534886..a7de11b 100644
--- a/src/components/search/SearchBar.vue
+++ b/src/components/search/SearchBar.vue
@@ -8,7 +8,11 @@
           :type="formSearch.type"
           v-model="formSearch.deviceCode"
         ></OptionDevice>
-        <OptionTime v-model="formSearch.timeArray"></OptionTime>
+        <OptionTime
+          v-model="formSearch.timeArray"
+          :start-date="dateRange[0]"
+          :end-date="dateRange[1]"
+        ></OptionTime>
         <el-button
           :loading="loading"
           type="primary"
@@ -31,12 +35,14 @@
   },
   data() {
     return {
-      mission: {},
+      mission: undefined,
       formSearch: {
         type: '',
         deviceCode: '',
         timeArray: []
-      }
+      },
+      // 鍙�夋棩鏈熻寖鍥达紝鏍规嵁璧拌埅浠诲姟鍐冲畾
+      dateRange: []
     };
   },
   emits: ['search'],
@@ -52,8 +58,16 @@
           new Date(nV.startTime),
           new Date(nV.endTime)
         ];
+        this.dateRange = [new Date(nV.startTime), new Date(nV.endTime)];
         this.formSearch.type = nV.deviceType;
         this.formSearch.deviceCode = nV.deviceCode;
+
+        // 浠h〃棣栨杩涘叆鐣岄潰锛屾鏃惰嚜鍔ㄦ墽琛岄涓换鍔$殑鏁版嵁鏌ヨ鎿嶄綔
+        if (oV == undefined) {
+          setTimeout(() => {
+            this.handleClick();
+          }, 500);
+        }
       }
     }
   },
@@ -64,7 +78,7 @@
   }
 };
 </script>
-<style lang="scss">
+<style scoped lang="scss">
 .map-date-selector {
   display: inline-block;
   position: relative;
@@ -78,4 +92,9 @@
 
 .p-events-auto {
 }
+
+.el-form-item {
+  margin-bottom: 0px;
+  margin-right: 8px !important;
+}
 </style>
diff --git a/src/composables/fetchData.js b/src/composables/fetchData.js
index c1b4937..350e92e 100644
--- a/src/composables/fetchData.js
+++ b/src/composables/fetchData.js
@@ -37,6 +37,7 @@
         }
 
         loadStatus.value = 0;
+        return pageInfo;
       })
       .catch(() => {
         loadStatus.value = 3;
diff --git a/src/constant/checkbox-options.js b/src/constant/checkbox-options.js
index 6f1178d..f9cc44d 100644
--- a/src/constant/checkbox-options.js
+++ b/src/constant/checkbox-options.js
@@ -1,186 +1,50 @@
 import { TYPE0, TYPE1, TYPE2, TYPE4 } from '@/constant/device-type';
+import {
+  option1,
+  option2,
+  option3,
+  option4
+} from '@/constant/checkbox-options/options';
+import { option1 as option1Jingan } from '@/constant/checkbox-options/options-jingan';
 
 // 鐩戞祴鍥犲瓙鍗曢�夋閫夐」
 function checkboxOptions(deviceType) {
-  switch (deviceType) {
-    case TYPE0:
-      return option1;
-    case TYPE1:
-      return option3;
-    case TYPE2:
-      return option2;
-    case TYPE4:
-      return option4;
-    default:
-      return option1;
+  if (import.meta.env.VITE_DATA_MODE == 'jingan') {
+    switch (deviceType) {
+      case TYPE0:
+        return option1Jingan;
+      default:
+        return option1Jingan;
+    }
+  } else {
+    switch (deviceType) {
+      case TYPE0:
+        return option1;
+      case TYPE1:
+        return option3;
+      case TYPE2:
+        return option2;
+      case TYPE4:
+        return option4;
+      default:
+        return option1;
+    }
   }
 }
 
-const option1 = [
-  {
-    label: 'NO2',
-    name: 'NO2',
-    value: '1'
-  },
-  {
-    label: 'CO',
-    name: 'CO',
-    value: '2'
-  },
-  {
-    label: 'H2S',
-    name: 'H2S',
-    value: '3'
-  },
-  {
-    label: 'SO2',
-    name: 'SO2',
-    value: '4'
-  },
-  {
-    label: 'O3',
-    name: 'O3',
-    value: '5'
-  },
-  {
-    label: 'PM2.5',
-    name: 'PM25',
-    value: '6'
-  },
-  {
-    label: 'PM10',
-    name: 'PM10',
-    value: '7'
-  },
-  {
-    label: 'TVOC',
-    name: 'VOC',
-    value: '10'
-  },
-
-  // {
-  //     label: "NOI",
-  //     name: "NOI",
-  //     value: "11"
-  // },
-  {
-    label: '杞﹂��',
-    name: 'VELOCITY',
-    value: '14'
-  },
-  {
-    label: '椋庨��',
-    name: 'WIND_SPEED',
-    value: '16'
-  },
-  {
-    label: '椋庡悜',
-    name: 'WIND_DIRECTION',
-    value: '17'
-  },
-  {
-    label: '楂樺害',
-    name: 'HEIGHT',
-    value: '18'
+/**
+ * 榛樿閫夐」
+ * @param {*} deviceType 璁惧绫诲瀷
+ * @param {*} count 榛樿閫変腑涓暟
+ * @returns
+ */
+function defaultFactorTypes(deviceType, count = 3) {
+  const list = checkboxOptions(deviceType);
+  if (list.length > count) {
+    return list.slice(0, count).map((v) => v.value);
+  } else {
+    return list.map((v) => v.value);
   }
-];
+}
 
-const option2 = [
-  {
-    label: '娓╁害',
-    name: 'TMP',
-    value: '1'
-  },
-  {
-    label: '鐢靛鐜�',
-    name: 'spC',
-    value: '2'
-  },
-  {
-    label: '娴婂害',
-    name: 'tur',
-    value: '3'
-  },
-  {
-    label: '婧惰В姘�',
-    name: 'DO',
-    value: '4'
-  },
-  {
-    label: 'PH',
-    name: 'PH',
-    value: '5'
-  }
-];
-
-const option3 = [
-  {
-    label: 'NO2',
-    name: 'NO2',
-    value: '1'
-  },
-  {
-    label: 'CO',
-    name: 'CO',
-    value: '2'
-  },
-  {
-    label: 'H2S',
-    name: 'H2S',
-    value: '3'
-  },
-  {
-    label: 'SO2',
-    name: 'SO2',
-    value: '4'
-  },
-  {
-    label: 'O3',
-    name: 'O3',
-    value: '5'
-  },
-  {
-    label: 'PM2.5',
-    name: 'PM25',
-    value: '6'
-  },
-  {
-    label: 'PM10',
-    name: 'PM10',
-    value: '7'
-  },
-  {
-    label: 'TVOC',
-    name: 'VOC',
-    value: '10'
-  },
-  {
-    label: '椋庨��',
-    name: 'WIND_SPEED',
-    value: '16'
-  },
-  {
-    label: '椋庡悜',
-    name: 'WIND_DIRECTION',
-    value: '17'
-  }
-];
-
-const option4 = [
-  {
-    label: 'A鐩哥數娴�',
-    name: 'EA',
-    value: '1'
-  },
-  {
-    label: 'B鐩哥數娴�',
-    name: 'EB',
-    value: '2'
-  },
-  {
-    label: 'C鐩哥數娴�',
-    name: 'EC',
-    value: '3'
-  }
-];
-export { checkboxOptions };
+export { checkboxOptions, defaultFactorTypes };
diff --git a/src/constant/checkbox-options/options-jingan.js b/src/constant/checkbox-options/options-jingan.js
new file mode 100644
index 0000000..7d23581
--- /dev/null
+++ b/src/constant/checkbox-options/options-jingan.js
@@ -0,0 +1,51 @@
+/**
+ * 涓婃捣甯傞潤瀹夊尯涓撴湁绯荤粺鍥捐〃鏄剧ず鍥犲瓙鍒囨崲閫夐」
+ */
+
+export const option1 = [
+  {
+    label: 'NO',
+    name: 'NO',
+    value: '19'
+  },
+  {
+    label: 'NO2',
+    name: 'NO2',
+    value: '1'
+  },
+  {
+    label: 'CO',
+    name: 'CO',
+    value: '2'
+  },
+  {
+    label: 'PM2.5',
+    name: 'PM25',
+    value: '6'
+  },
+  {
+    label: 'PM10',
+    name: 'PM10',
+    value: '7'
+  },
+  {
+    label: '娓╁害',
+    name: 'TEMPERATURE',
+    value: '8'
+  },
+  {
+    label: '杞﹂��',
+    name: 'VELOCITY',
+    value: '14'
+  },
+  {
+    label: '椋庨��',
+    name: 'WIND_SPEED',
+    value: '16'
+  }
+  // {
+  //   label: '椋庡悜',
+  //   name: 'WIND_DIRECTION',
+  //   value: '17'
+  // }
+];
diff --git a/src/constant/checkbox-options/options.js b/src/constant/checkbox-options/options.js
new file mode 100644
index 0000000..3f6b106
--- /dev/null
+++ b/src/constant/checkbox-options/options.js
@@ -0,0 +1,173 @@
+/**
+ * 鍘熷绯荤粺鍥捐〃鏄剧ず鍥犲瓙鍒囨崲閫夐」
+ */
+
+const option1 = [
+  {
+    label: 'NO2',
+    name: 'NO2',
+    value: '1'
+  },
+  {
+    label: 'CO',
+    name: 'CO',
+    value: '2'
+  },
+  {
+    label: 'H2S',
+    name: 'H2S',
+    value: '3'
+  },
+  {
+    label: 'SO2',
+    name: 'SO2',
+    value: '4'
+  },
+  {
+    label: 'O3',
+    name: 'O3',
+    value: '5'
+  },
+  {
+    label: 'PM2.5',
+    name: 'PM25',
+    value: '6'
+  },
+  {
+    label: 'PM10',
+    name: 'PM10',
+    value: '7'
+  },
+  {
+    label: 'TVOC',
+    name: 'VOC',
+    value: '10'
+  },
+
+  // {
+  //     label: "NOI",
+  //     name: "NOI",
+  //     value: "11"
+  // },
+  {
+    label: '杞﹂��',
+    name: 'VELOCITY',
+    value: '14'
+  },
+  {
+    label: '椋庨��',
+    name: 'WIND_SPEED',
+    value: '16'
+  },
+  // {
+  //   label: '椋庡悜',
+  //   name: 'WIND_DIRECTION',
+  //   value: '17'
+  // },
+  {
+    label: '楂樺害',
+    name: 'HEIGHT',
+    value: '18'
+  }
+];
+
+const option2 = [
+  {
+    label: '娓╁害',
+    name: 'TMP',
+    value: '1'
+  },
+  {
+    label: '鐢靛鐜�',
+    name: 'spC',
+    value: '2'
+  },
+  {
+    label: '娴婂害',
+    name: 'tur',
+    value: '3'
+  },
+  {
+    label: '婧惰В姘�',
+    name: 'DO',
+    value: '4'
+  },
+  {
+    label: 'PH',
+    name: 'PH',
+    value: '5'
+  }
+];
+
+const option3 = [
+  {
+    label: 'NO2',
+    name: 'NO2',
+    value: '1'
+  },
+  {
+    label: 'CO',
+    name: 'CO',
+    value: '2'
+  },
+  {
+    label: 'H2S',
+    name: 'H2S',
+    value: '3'
+  },
+  {
+    label: 'SO2',
+    name: 'SO2',
+    value: '4'
+  },
+  {
+    label: 'O3',
+    name: 'O3',
+    value: '5'
+  },
+  {
+    label: 'PM2.5',
+    name: 'PM25',
+    value: '6'
+  },
+  {
+    label: 'PM10',
+    name: 'PM10',
+    value: '7'
+  },
+  {
+    label: 'TVOC',
+    name: 'VOC',
+    value: '10'
+  },
+  {
+    label: '椋庨��',
+    name: 'WIND_SPEED',
+    value: '16'
+  }
+  // {
+  //   label: '椋庡悜',
+  //   name: 'WIND_DIRECTION',
+  //   value: '17'
+  // }
+];
+
+const option4 = [
+  {
+    label: 'A鐩哥數娴�',
+    name: 'EA',
+    value: '1'
+  },
+  {
+    label: 'B鐩哥數娴�',
+    name: 'EB',
+    value: '2'
+  },
+  {
+    label: 'C鐩哥數娴�',
+    name: 'EC',
+    value: '3'
+  }
+];
+
+export { option1, option2, option3, option4 };
diff --git a/src/constant/device-type.js b/src/constant/device-type.js
index 8d163f8..dde0588 100644
--- a/src/constant/device-type.js
+++ b/src/constant/device-type.js
@@ -9,4 +9,56 @@
 // 鐢ㄧ數閲�
 const TYPE4 = '31';
 
-export { TYPE0, TYPE1, TYPE2, TYPE3, TYPE4 };
+function typeList() {
+  if (import.meta.env.VITE_DATA_MODE == 'jingan') {
+    return [
+      {
+        label: '杞﹁浇',
+        value: '0a'
+      }
+    ];
+  } else {
+    return [
+      {
+        label: '杞﹁浇',
+        value: '0a'
+      },
+      {
+        label: '鏃犱汉鏈�',
+        value: '0b'
+      },
+      {
+        label: '鏃犱汉鑸�',
+        value: '0c'
+      }
+    ];
+  }
+}
+
+// fixeme 2024.8.19 鍚庣画璁惧缂栧彿搴旇浠庢湇鍔″櫒鍔ㄦ�佽幏鍙栵紝鍚屾椂鏈夎澶囧彿鐨勫湪绾跨紪杈戝姛鑳�
+function deviceList(type) {
+  if (import.meta.env.VITE_DATA_MODE == 'jingan') {
+    return [
+      {
+        label: '杞﹁浇璁惧1鍙�',
+        value: 'TX105'
+      }
+    ];
+  } else {
+    const t = type ? type : '0a';
+    const _typeList = typeList();
+    const typeStr = _typeList.find((v) => {
+      return v.value == t;
+    });
+    return [1, 2, 3].map((v) => {
+      const label = `${typeStr}璁惧${v}鍙穈;
+      const value = `${t}000000000${v}`;
+      return {
+        label: label,
+        value: value
+      };
+    });
+  }
+}
+
+export { TYPE0, TYPE1, TYPE2, TYPE3, TYPE4, typeList, deviceList };
diff --git a/src/constant/factor-name.js b/src/constant/factor-name.js
index 360e5f0..5857ead 100644
--- a/src/constant/factor-name.js
+++ b/src/constant/factor-name.js
@@ -2,6 +2,7 @@
  * 鐩戞祴鍥犲瓙鍚嶇О
  */
 export const factorName = {
+  NO: 'NO',
   NO2: 'NO2', //2
   CO: 'CO', //4
   H2S: 'H2S', //6
diff --git a/src/constant/factor-unit.js b/src/constant/factor-unit.js
index 878baf0..ec21d10 100644
--- a/src/constant/factor-unit.js
+++ b/src/constant/factor-unit.js
@@ -2,6 +2,10 @@
  * 鐩戞祴鍥犲瓙鍗曚綅
  */
 export const factorUnit = {
+  NO: {
+    scale: 1,
+    unit: '渭g/m鲁'
+  },
   NO2: {
     scale: 1,
     unit: '渭g/m鲁'
diff --git a/src/constant/radio-options.js b/src/constant/radio-options.js
index 9cf3509..c56bd55 100644
--- a/src/constant/radio-options.js
+++ b/src/constant/radio-options.js
@@ -1,84 +1,94 @@
 import { TYPE0, TYPE1, TYPE2 } from '@/constant/device-type';
+import { option1, option2 } from '@/constant/radio-options/options';
+import { option1 as option1Jingan } from '@/constant/radio-options/options-jingan';
 
 // 鐩戞祴鍥犲瓙鍗曢�夋閫夐」
 function radioOptions(deviceType) {
-  if ([TYPE0, TYPE1].includes(deviceType)) {
-    return option1;
-  } else if (deviceType == TYPE2) {
-    return option2;
+  if (import.meta.env.VITE_DATA_MODE == 'jingan') {
+    if (TYPE0 == deviceType) {
+      return option1Jingan;
+    } else {
+      return [];
+    }
   } else {
-    return [];
+    if ([TYPE0, TYPE1].includes(deviceType)) {
+      return option1;
+    } else if (deviceType == TYPE2) {
+      return option2;
+    } else {
+      return [];
+    }
   }
 }
 
-const option1 = [
-  {
-    label: 'NO2',
-    name: 'NO2',
-    value: '1'
-  },
-  {
-    label: 'CO',
-    name: 'CO',
-    value: '2'
-  },
-  {
-    label: 'H2S',
-    name: 'H2S',
-    value: '3'
-  },
-  {
-    label: 'SO2',
-    name: 'SO2',
-    value: '4'
-  },
-  {
-    label: 'O3',
-    name: 'O3',
-    value: '5'
-  },
-  {
-    label: 'PM2.5',
-    name: 'PM25',
-    value: '6'
-  },
-  {
-    label: 'PM10',
-    name: 'PM10',
-    value: '7'
-  },
-  {
-    label: 'TVOC',
-    name: 'VOC',
-    value: '10'
-  }
-];
+// const option1 = [
+//   {
+//     label: 'NO2',
+//     name: 'NO2',
+//     value: '1'
+//   },
+//   {
+//     label: 'CO',
+//     name: 'CO',
+//     value: '2'
+//   },
+//   {
+//     label: 'H2S',
+//     name: 'H2S',
+//     value: '3'
+//   },
+//   {
+//     label: 'SO2',
+//     name: 'SO2',
+//     value: '4'
+//   },
+//   {
+//     label: 'O3',
+//     name: 'O3',
+//     value: '5'
+//   },
+//   {
+//     label: 'PM2.5',
+//     name: 'PM25',
+//     value: '6'
+//   },
+//   {
+//     label: 'PM10',
+//     name: 'PM10',
+//     value: '7'
+//   },
+//   {
+//     label: 'TVOC',
+//     name: 'VOC',
+//     value: '10'
+//   }
+// ];
 
-const option2 = [
-  {
-    label: '娓╁害',
-    name: 'TMP',
-    value: '1'
-  },
-  {
-    label: '鐢靛鐜�',
-    name: 'spC',
-    value: '2'
-  },
-  {
-    label: '娴婂害',
-    name: 'tur',
-    value: '3'
-  },
-  {
-    label: '婧惰В姘�',
-    name: 'DO',
-    value: '4'
-  },
-  {
-    label: 'PH',
-    name: 'PH',
-    value: '5'
-  }
-];
+// const option2 = [
+//   {
+//     label: '娓╁害',
+//     name: 'TMP',
+//     value: '1'
+//   },
+//   {
+//     label: '鐢靛鐜�',
+//     name: 'spC',
+//     value: '2'
+//   },
+//   {
+//     label: '娴婂害',
+//     name: 'tur',
+//     value: '3'
+//   },
+//   {
+//     label: '婧惰В姘�',
+//     name: 'DO',
+//     value: '4'
+//   },
+//   {
+//     label: 'PH',
+//     name: 'PH',
+//     value: '5'
+//   }
+// ];
 export { radioOptions };
diff --git a/src/constant/radio-options/options-jingan.js b/src/constant/radio-options/options-jingan.js
new file mode 100644
index 0000000..d82ee85
--- /dev/null
+++ b/src/constant/radio-options/options-jingan.js
@@ -0,0 +1,31 @@
+/**
+ * 涓婃捣甯傞潤瀹夊尯涓撴湁绯荤粺鍦板浘鏄剧ず鍥犲瓙鍒囨崲閫夐」
+ */
+
+export const option1 = [
+  {
+    label: 'NO',
+    name: 'NO',
+    value: '19'
+  },
+  {
+    label: 'NO2',
+    name: 'NO2',
+    value: '1'
+  },
+  {
+    label: 'CO',
+    name: 'CO',
+    value: '2'
+  },
+  {
+    label: 'PM2.5',
+    name: 'PM25',
+    value: '6'
+  },
+  {
+    label: 'PM10',
+    name: 'PM10',
+    value: '7'
+  }
+];
diff --git a/src/constant/radio-options/options.js b/src/constant/radio-options/options.js
new file mode 100644
index 0000000..12cb189
--- /dev/null
+++ b/src/constant/radio-options/options.js
@@ -0,0 +1,74 @@
+/**
+ * 鍘熷绯荤粺鍦板浘鏄剧ず鍥犲瓙鍒囨崲閫夐」
+ */
+
+export const option1 = [
+  {
+    label: 'NO2',
+    name: 'NO2',
+    value: '1'
+  },
+  {
+    label: 'CO',
+    name: 'CO',
+    value: '2'
+  },
+  {
+    label: 'H2S',
+    name: 'H2S',
+    value: '3'
+  },
+  {
+    label: 'SO2',
+    name: 'SO2',
+    value: '4'
+  },
+  {
+    label: 'O3',
+    name: 'O3',
+    value: '5'
+  },
+  {
+    label: 'PM2.5',
+    name: 'PM25',
+    value: '6'
+  },
+  {
+    label: 'PM10',
+    name: 'PM10',
+    value: '7'
+  },
+  {
+    label: 'TVOC',
+    name: 'VOC',
+    value: '10'
+  }
+];
+
+export const option2 = [
+  {
+    label: '娓╁害',
+    name: 'TMP',
+    value: '1'
+  },
+  {
+    label: '鐢靛鐜�',
+    name: 'spC',
+    value: '2'
+  },
+  {
+    label: '娴婂害',
+    name: 'tur',
+    value: '3'
+  },
+  {
+    label: '婧惰В姘�',
+    name: 'DO',
+    value: '4'
+  },
+  {
+    label: 'PH',
+    name: 'PH',
+    value: '5'
+  }
+];
diff --git a/src/constant/scene-types.js b/src/constant/scene-types.js
index c0d9043..30c5590 100644
--- a/src/constant/scene-types.js
+++ b/src/constant/scene-types.js
@@ -8,90 +8,15 @@
 import scene_18 from '@/assets/mipmap/scene_18.png';
 import scene_19 from '@/assets/mipmap/scene_19.png';
 import scene_20 from '@/assets/mipmap/scene_20.png';
+import { option } from '@/constant/scene-types/options';
+import { option as optionJingan } from '@/constant/scene-types/options-jingan';
 
 function sceneTypes() {
-  return [
-    {
-      label: '宸ュ湴',
-      value: '1'
-    },
-    // {
-    //   label: '鐮佸ご',
-    //   value: '2',
-    // },
-    // {
-    //   label: '鎼呮媽绔�',
-    //   value: '3',
-    // },
-    {
-      label: '宸ヤ笟浼佷笟',
-      value: '4'
-    },
-    {
-      label: '椁愰ギ',
-      value: '5'
-    },
-    {
-      label: '姹戒慨',
-      value: '6'
-    },
-    // {
-    //   label: '闄嶅皹鐐�',
-    //   value: '7',
-    // },
-    // {
-    //   label: '绌烘皵璐ㄩ噺鐩戞祴鐐�',
-    //   value: '8',
-    // },
-    // {
-    //   label: '閬撹矾鎵皹鐩戞祴鐐�',
-    //   value: '9',
-    // },
-    // {
-    //   label: '閬撹矾',
-    //   value: '10',
-    // },
-    // {
-    //   label: '娌虫祦鏂潰',
-    //   value: '11',
-    // },
-    // {
-    //   label: '宸ヤ笟鍥尯',
-    //   value: '12',
-    // },
-    // {
-    //   label: '鏃犲浐瀹氬満鏅�',
-    //   value: '13',
-    // },
-    // {
-    //   label: '鍫嗗満',
-    //   value: '14',
-    // },
-    {
-      label: '瀹為獙瀹�',
-      value: '15'
-    },
-    {
-      label: '绮惧搧灏忓尯',
-      value: '16'
-    },
-    {
-      label: '鍔犳补绔�',
-      value: '17'
-    },
-    {
-      label: '鍟嗕笟浣�',
-      value: '18'
-    },
-    {
-      label: '鍥芥帶鐐�',
-      value: '19'
-    },
-    {
-      label: '甯傛帶鐐�',
-      value: '20'
-    }
-  ];
+  if (import.meta.env.VITE_DATA_MODE == 'jingan') {
+    return optionJingan;
+  } else {
+    return option;
+  }
 }
 
 function sceneIcon(type) {
diff --git a/src/constant/scene-types/options-jingan.js b/src/constant/scene-types/options-jingan.js
new file mode 100644
index 0000000..f8cc40f
--- /dev/null
+++ b/src/constant/scene-types/options-jingan.js
@@ -0,0 +1,93 @@
+/**
+ * 涓婃捣甯傞潤瀹夊尯涓撴湁绯荤粺鍦板浘鏄剧ず鍦烘櫙绫诲瀷鍒囨崲閫夐」
+ */
+
+export const option = [
+  {
+    label: '宸ュ湴',
+    value: '1'
+  },
+  // {
+  //   label: '鐮佸ご',
+  //   value: '2',
+  // },
+  // {
+  //   label: '鎼呮媽绔�',
+  //   value: '3',
+  // },
+  {
+    label: '宸ヤ笟浼佷笟',
+    value: '4',
+    disabled: true
+  },
+  {
+    label: '椁愰ギ',
+    value: '5',
+    disabled: true
+  },
+  {
+    label: '姹戒慨',
+    value: '6',
+    disabled: true
+  },
+  // {
+  //   label: '闄嶅皹鐐�',
+  //   value: '7',
+  // },
+  // {
+  //   label: '绌烘皵璐ㄩ噺鐩戞祴鐐�',
+  //   value: '8',
+  // },
+  // {
+  //   label: '閬撹矾鎵皹鐩戞祴鐐�',
+  //   value: '9',
+  // },
+  // {
+  //   label: '閬撹矾',
+  //   value: '10',
+  // },
+  // {
+  //   label: '娌虫祦鏂潰',
+  //   value: '11',
+  // },
+  // {
+  //   label: '宸ヤ笟鍥尯',
+  //   value: '12',
+  // },
+  // {
+  //   label: '鏃犲浐瀹氬満鏅�',
+  //   value: '13',
+  // },
+  // {
+  //   label: '鍫嗗満',
+  //   value: '14',
+  // },
+  {
+    label: '瀹為獙瀹�',
+    value: '15',
+    disabled: true
+  },
+  {
+    label: '绮惧搧灏忓尯',
+    value: '16',
+    disabled: true
+  },
+  {
+    label: '鍔犳补绔�',
+    value: '17',
+    disabled: true
+  },
+  {
+    label: '鍟嗕笟浣�',
+    value: '18',
+    disabled: true
+  },
+  {
+    label: '鍥芥帶鐐�',
+    value: '19'
+  },
+  {
+    label: '甯傛帶鐐�',
+    value: '20'
+  }
+];
diff --git a/src/constant/scene-types/options.js b/src/constant/scene-types/options.js
new file mode 100644
index 0000000..1bba61d
--- /dev/null
+++ b/src/constant/scene-types/options.js
@@ -0,0 +1,86 @@
+/**
+ * 鍘熷绯荤粺鍦板浘鏄剧ず鍦烘櫙绫诲瀷鍒囨崲閫夐」
+ */
+
+export const option = [
+  {
+    label: '宸ュ湴',
+    value: '1'
+  },
+  // {
+  //   label: '鐮佸ご',
+  //   value: '2',
+  // },
+  // {
+  //   label: '鎼呮媽绔�',
+  //   value: '3',
+  // },
+  {
+    label: '宸ヤ笟浼佷笟',
+    value: '4'
+  },
+  {
+    label: '椁愰ギ',
+    value: '5'
+  },
+  {
+    label: '姹戒慨',
+    value: '6'
+  },
+  // {
+  //   label: '闄嶅皹鐐�',
+  //   value: '7',
+  // },
+  // {
+  //   label: '绌烘皵璐ㄩ噺鐩戞祴鐐�',
+  //   value: '8',
+  // },
+  // {
+  //   label: '閬撹矾鎵皹鐩戞祴鐐�',
+  //   value: '9',
+  // },
+  // {
+  //   label: '閬撹矾',
+  //   value: '10',
+  // },
+  // {
+  //   label: '娌虫祦鏂潰',
+  //   value: '11',
+  // },
+  // {
+  //   label: '宸ヤ笟鍥尯',
+  //   value: '12',
+  // },
+  // {
+  //   label: '鏃犲浐瀹氬満鏅�',
+  //   value: '13',
+  // },
+  // {
+  //   label: '鍫嗗満',
+  //   value: '14',
+  // },
+  {
+    label: '瀹為獙瀹�',
+    value: '15'
+  },
+  {
+    label: '绮惧搧灏忓尯',
+    value: '16'
+  },
+  {
+    label: '鍔犳补绔�',
+    value: '17'
+  },
+  {
+    label: '鍟嗕笟浣�',
+    value: '18'
+  },
+  {
+    label: '鍥芥帶鐐�',
+    value: '19'
+  },
+  {
+    label: '甯傛帶鐐�',
+    value: '20'
+  }
+];
diff --git a/src/lib/jquery.soap.js b/src/lib/jquery.soap.js
new file mode 100644
index 0000000..afc3fdd
--- /dev/null
+++ b/src/lib/jquery.soap.js
@@ -0,0 +1,792 @@
+import $ from 'jquery';
+
+var enableLogging;
+var globalConfig = {
+  // this setup once, defaults go here
+  appendMethodToURL: true,
+  async: true,
+  enableLogging: false,
+  noPrefix: false,
+  soap12: false,
+  withCredentials: false,
+  timeout: 5000
+};
+function soap(options) {
+  var config = {};
+  // a configuration call will not have 'data' specified ('params' is used for backwards compatibility)
+  if (options && !options.params && !options.data) {
+    $.extend(globalConfig, options); // update global config
+    enableLogging = options.enableLogging;
+    log('jQuery.soap - globalConfig updated:', globalConfig);
+    return globalConfig;
+  }
+  $.extend(config, globalConfig, options);
+  // function log will only work below this line!
+  enableLogging = config.enableLogging;
+
+  log('jquery.soap - config:', config);
+
+  // fallbacks for changed properties
+  SOAPTool.fallbackDeprecated(config);
+
+  var soapObject = SOAPTool.processData({
+    data: config.data,
+    name: config.elementName ? config.elementName : config.method,
+    context: config.context,
+    prefix:
+      !!config.namespaceQualifier && !config.noPrefix
+        ? config.namespaceQualifier + ':'
+        : ''
+  });
+
+  if (!!config.namespaceQualifier && !!config.namespaceURL) {
+    soapObject.addNamespace(config.namespaceQualifier, config.namespaceURL);
+  } else if (config.namespaceURL) {
+    soapObject.attr('xmlns', config.namespaceURL);
+  }
+
+  if (!!soapObject && !!config.url) {
+    // we have a request and somewhere to send it
+    // Create a SOAPEnvelope with the soapObject
+    var soapEnvelope = new SOAPEnvelope(soapObject);
+    // Additional attributes and namespaces for the Envelope
+    if (config.envAttributes) {
+      for (var i in config.envAttributes) {
+        soapEnvelope.addAttribute(i, config.envAttributes[i]);
+      }
+    }
+    // SOAPHeader
+    if (config.SOAPHeader) {
+      var soapHeader = SOAPTool.processData({
+        data: config.SOAPHeader,
+        name: 'temp',
+        prefix: ''
+      });
+      if (soapHeader) {
+        if (soapHeader.hasChildren()) {
+          for (var j in soapHeader.children) {
+            soapEnvelope.addHeader(soapHeader.children[j]);
+          }
+        } else {
+          soapEnvelope.addHeader(soapHeader);
+        }
+      }
+    }
+    // WSS
+    if (config.wss) {
+      var wssObj = SOAPTool.createWSS(config.wss);
+      // add to WSS Security header to soapEnvelope
+      if (wssObj) {
+        soapEnvelope.addHeader(wssObj);
+      }
+    }
+    // append Method?
+    if (!!config.appendMethodToURL && !!config.method) {
+      // fixme 2024.8.15 淇敼姝ゅ閫昏緫锛寀rl涓嶅啀鑷姩娣诲姞method浣滀负璺緞
+      // config.url += config.method;
+    }
+    return soapEnvelope
+      .send({
+        url: config.url,
+        context: config.context,
+        timeout: config.timeout,
+        async: config.async,
+        headers: config.HTTPHeaders ? config.HTTPHeaders : {},
+        action: config.SOAPAction ? config.SOAPAction : config.method,
+        soap12: config.soap12,
+        beforeSend: config.beforeSend,
+        statusCode: config.statusCode
+      })
+      .done(function (data, textStatus, jqXHR) {
+        var response = new SOAPResponse(textStatus, jqXHR);
+        log('jquery.soap - receive:', response.toString());
+        if ($.isFunction(config.success)) {
+          config.success.call(this, response);
+        }
+      })
+      .fail(function (jqXHR, textStatus, errorThrown) {
+        log('jquery.soap - error:', errorThrown);
+        if ($.isFunction(config.error)) {
+          config.error.call(this, new SOAPResponse(textStatus, jqXHR));
+        }
+      });
+  } else {
+    var errDeferred = new $.Deferred(),
+      errmsg;
+
+    if (!soapObject) {
+      errmsg = 'jquery.soap - no soapObject';
+    }
+    if (!config.url) {
+      errmsg = 'jquery.soap - no url';
+    }
+    if (errmsg) {
+      warn(errmsg);
+      errDeferred.reject(errmsg);
+    }
+    return errDeferred.promise();
+  }
+}
+
+//Soap request - this is what being sent
+function SOAPEnvelope(soapObject) {
+  this.typeOf = 'SOAPEnvelope';
+  this.prefix = 'soap';
+  this.soapConfig = null;
+  this.attributes = {};
+  this.headers = [];
+  this.bodies = [];
+
+  // let's get the soap namespace prefix
+  var parts = soapObject.name.split(':'),
+    len;
+  if (parts[1] === 'Envelope' || parts[1] === 'Body') {
+    this.prefix = parts[0];
+    if (
+      soapObject.attr('xmlns:' + this.prefix) === SOAPTool.SOAP11.namespaceURL
+    ) {
+      this.soapConfig = this.SOAP11;
+    }
+    if (
+      soapObject.attr('xmlns:' + this.prefix) === SOAPTool.SOAP12.namespaceURL
+    ) {
+      this.soapConfig = this.SOAP12;
+    }
+    // Envelope
+    var env = soapObject.find(this.prefix + ':Envelope');
+    if (env && env.attributes) {
+      for (var i in env.attributes) {
+        this.addAttribute(i, env.attributes[i]);
+      }
+    }
+    // headers
+    var header = soapObject.find(this.prefix + ':Header');
+    if (header && header.children) {
+      len = header.children.length;
+      for (var j = 0; j < len; j++) {
+        this.addHeader(header.children[j]);
+      }
+    }
+    // body
+    var body = soapObject.find(this.prefix + ':Body');
+    if (body && body.children) {
+      len = body.children.length;
+      for (var k = 0; k < len; k++) {
+        this.addBody(body.children[k]);
+      }
+    } else {
+      len = soapObject.children.length;
+      for (var l = 0; l < len; l++) {
+        this.addBody(soapObject.children[l]);
+      }
+    }
+  } else {
+    // a soapObject with nothing, mere data
+    this.addBody(soapObject);
+  }
+}
+
+SOAPEnvelope.prototype = {
+  addAttribute: function (name, value) {
+    this.attributes[name] = value;
+  },
+  addNamespace: function (name, uri) {
+    this.addAttribute('xmlns:' + name, uri);
+  },
+  addHeader: function (soapObject) {
+    this.headers.push(soapObject);
+  },
+  addBody: function (soapObject) {
+    this.bodies.push(soapObject);
+  },
+  toString: function () {
+    var soapEnv = new SOAPObject(this.prefix + ':Envelope'),
+      len;
+    //Add attributes
+    for (var name in this.attributes) {
+      soapEnv.attr(name, this.attributes[name]);
+    }
+    //Add Headers
+    len = this.headers.length;
+    if (len > 0) {
+      var soapHeader = soapEnv.newChild(this.prefix + ':Header');
+      for (var i = 0; i < len; i++) {
+        soapHeader.appendChild(this.headers[i]);
+      }
+    }
+    //Add Bodies
+    len = this.bodies.length;
+    if (len > 0) {
+      var soapBody = soapEnv.newChild(this.prefix + ':Body');
+      for (var j = 0; j < len; j++) {
+        soapBody.appendChild(this.bodies[j]);
+      }
+    }
+    // Check for main NS over here...
+    if (!soapEnv.attr('xmlns:' + this.prefix)) {
+      soapEnv.addNamespace(this.prefix, this.soapConfig.namespaceURL);
+    }
+    if (!soapEnv.attr('xmlns:xsi')) {
+      soapEnv.addNamespace('xsi', 'http://www.w3.org/2001/XMLSchema-instance');
+    }
+    if (!soapEnv.attr('xmlns:xsd')) {
+      soapEnv.addNamespace('xsd', 'http://www.w3.org/2001/XMLSchema');
+    }
+    return '<?xml version="1.0" encoding="UTF-8"?>' + soapEnv.toString();
+  },
+  send: function (options) {
+    var self = this;
+    if (!this.soapConfig) {
+      this.soapConfig = options.soap12 ? SOAPTool.SOAP12 : SOAPTool.SOAP11;
+    }
+    var contentType = this.soapConfig.type;
+    if (contentType === SOAPTool.SOAP11.type && !!options.action) {
+      options.headers.SOAPAction = options.action;
+    }
+    log('jquery.soap - beforeSend:', this.toString());
+    return $.ajax({
+      type: 'POST',
+      context: options.context,
+      statusCode: options.statusCode,
+      url: options.url,
+      async: options.async,
+      headers: options.headers,
+      timeout: options.timeout,
+      //	crossDomain: true,
+      dataType: 'xml',
+      processData: false,
+      data: this.toString(),
+      contentType:
+        contentType +
+        '; charset=UTF-8' +
+        (options.soap12 ? '; action=' + options.action : ''),
+      xhrFields: {
+        // Add xhrFields, and set xhrFields.withCredentials = true by default, otherwise,
+        // it can't send a cross-domain request successfully in Chrome without this settings.
+        // You can use it to set withCredentials to true for cross-domain requests if needed.
+        // More about it is in jQuery official website. (http://api.jquery.com/jquery.ajax/).
+        // I hope it's useful and tested in Chrome & IE 11+ & IE Edge, Thanks.
+        withCredentials: options.withCredentials
+      },
+      // second attempt to get some progres info (but still a no go)
+      // I still keep this in tho, we might see it working one day when browsers mature...
+      /*
+				//WRT issue #80 (https://github.com/doedje/jquery.soap/issues/80) commenting out the xhr function below for IE8 and IE9 compatability. Issue exists when used alongside any script that modifies the XMLHttpRequest object like, for example, the xdomain or xhook libraries. This could be explicitly enabled by users on a per-case basis if it is mentioned somewhere in the readme.md file.
+				xhr: function() {
+					var xhr = new window.XMLHttpRequest();
+					xhr.upload.addEventListener("progress", function(evt) {
+						if (evt.lengthComputable) {
+							var progress = evt.loaded / evt.total;
+							log("jquery.soap - progress up: ", (progress * 100) + '% total: ' + evt.total);
+						}
+					}, false);
+					xhr.addEventListener("progress", function(evt) {
+						if (evt.lengthComputable) {
+							var progress = evt.loaded / evt.total;
+							log("jquery.soap - progress down: ", (progress * 100) + '% total: ' + evt.total);
+						}
+					}, false);
+
+					return xhr;
+				},
+				*/
+      beforeSend: function () {
+        if ($.isFunction(options.beforeSend)) {
+          return options.beforeSend.call(options.context, self);
+        }
+      }
+    });
+  }
+};
+
+// SOAPObject - an abstraction layer to build SOAP Objects.
+var SOAPObject = function (name) {
+  this.typeOf = 'SOAPObject';
+  this.name = name;
+  this.ns = {};
+  this.attributes = {};
+  this._parent = null;
+  this.children = [];
+  this.value = undefined;
+};
+
+SOAPObject.prototype = {
+  attr: function (name, value) {
+    if ((!!name && !!value) || (!!name && value === '')) {
+      this.attributes[name] = value;
+      return this;
+    } else if (name) {
+      return this.attributes[name];
+    } else {
+      return this.attributes;
+    }
+  },
+  val: function (value) {
+    if (value === undefined) {
+      if (this.attr('xsi:nil') === 'true') {
+        return null;
+      } else {
+        return this.value;
+      }
+    } else if (value === null) {
+      this.attr('xsi:nil', 'true');
+      return this;
+    } else {
+      this.value = value;
+      return this;
+    }
+  },
+  addNamespace: function (name, url) {
+    this.ns[name] = url;
+    return this;
+  },
+  appendChild: function (obj) {
+    obj._parent = this;
+    this.children.push(obj);
+    return obj;
+  },
+  newChild: function (name) {
+    var obj = new SOAPObject(name);
+    this.appendChild(obj);
+    return obj;
+  },
+  addParameter: function (name, value) {
+    var obj = new SOAPObject(name);
+    obj.val(value);
+    this.appendChild(obj);
+    return this;
+  },
+  hasChildren: function () {
+    return this.children.length > 0 ? true : false;
+  },
+  find: function (name) {
+    if (this.name === name) {
+      return this;
+    } else {
+      for (var i = 0, len = this.children.length; i < len; i++) {
+        var result = this.children[i].find(name);
+        if (result) {
+          return result;
+        }
+      }
+    }
+  },
+  end: function () {
+    return this.parent();
+  },
+  parent: function () {
+    return this._parent;
+  },
+  toString: function () {
+    var out = [],
+      encodedValue;
+    out.push('<' + this.name);
+    //Namespaces
+    for (var name in this.ns) {
+      out.push(' xmlns:' + name + '="' + this.ns[name] + '"');
+    }
+    //Node Attributes
+    for (var attr in this.attributes) {
+      if (typeof this.attributes[attr] === 'string') {
+        out.push(
+          ' ' +
+            attr +
+            '="' +
+            SOAPTool.encodeXmlValue(this.attributes[attr]) +
+            '"'
+        );
+      }
+    }
+    out.push('>');
+    //Node children
+    if (this.hasChildren()) {
+      for (var cPos in this.children) {
+        var cObj = this.children[cPos];
+        if (typeof cObj === 'object' && cObj.typeOf === 'SOAPObject') {
+          out.push(cObj.toString());
+        }
+      }
+    }
+    //Node Value
+    if (this.value !== undefined) {
+      if (typeof this.value === 'string') {
+        switch (this.value.indexOf('<![CDATA[')) {
+          case -1:
+            // no CDATA blocks => encode everything
+            encodedValue = SOAPTool.encodeXmlValue(this.value);
+            break;
+          case 0:
+            if (this.value.indexOf(']]>') === this.value.length - 3) {
+              // entire value wrapped in one single CDATA block => no encoding required
+              encodedValue = this.value;
+              break;
+            }
+          default:
+            // encode with more advanced CDATA check
+            encodedValue = SOAPTool.encodeXmlValueWithCDataCheck(this.value);
+        }
+      } else if (typeof this.value === 'number') {
+        encodedValue = this.value.toString();
+      }
+      out.push(encodedValue);
+    }
+    //Close Tag
+    out.push('</' + this.name + '>');
+    return out.join('');
+  }
+};
+
+//Soap response - this will be passed to the callback from SOAPEnvelope.send
+var SOAPResponse = function (status, xhr) {
+  this.typeOf = 'SOAPResponse';
+  this.status = status;
+  this.headers = xhr.getAllResponseHeaders().split('\n');
+  this.httpCode = xhr.status;
+  this.httpText = xhr.statusText;
+  this.content =
+    xhr.responseXML === undefined || xhr.responseXML === null
+      ? xhr.responseText
+      : xhr.responseXML;
+  this.toString = function () {
+    if (typeof this.content === 'string') {
+      return this.content;
+    }
+    if ($.isXMLDoc(this.content)) {
+      return SOAPTool.dom2string(this.content);
+    }
+    throw new Error('Unexpected Content: ' + $.type(this.content));
+  };
+  this.toXML = function () {
+    if ($.isXMLDoc(this.content)) {
+      return this.content;
+    }
+    return $.parseXML(this.content);
+  };
+  this.toJSON = function () {
+    if ($.xml2json) {
+      return $.xml2json(this.content);
+    }
+    warn(
+      "jQuery.soap - Missing JQuery Plugin 'xml2json', info at: https://github.com/doedje/jquery.soap#dependencies"
+    );
+  };
+};
+
+//Singleton SOAP Tool
+var SOAPTool = {
+  SOAP11: {
+    type: 'text/xml',
+    namespaceURL: 'http://schemas.xmlsoap.org/soap/envelope/'
+  },
+  SOAP12: {
+    type: 'application/soap+xml',
+    namespaceURL: 'http://www.w3.org/2003/05/soap-envelope'
+  },
+  processData: function (options) {
+    var soapObject;
+    if ($.type(options.data) === 'string') {
+      // if data is XML string, parse to XML DOM
+      // ensure that string is not empty and contains more than whitespace
+      if (/\S/.test(options.data)) {
+        if (options.data.indexOf('<') > -1) {
+          options.data = $.parseXML(options.data);
+        } else {
+          // this is for bare parameters #125
+          soapObject = SOAPTool.json2soap(
+            options.name,
+            options.data,
+            options.prefix
+          );
+        }
+      }
+    }
+    if ($.isXMLDoc(options.data)) {
+      // if data is XML DOM, parse to SOAPObject
+      soapObject = SOAPTool.dom2soap(options.data.firstChild);
+    } else if ($.isArray(options.data)) {
+      // if data is an Array, asume SOAP::Lite
+      soapObject = SOAPTool.array2soap(options);
+    } else if ($.isPlainObject(options.data)) {
+      // if data is JSON, parse to SOAPObject
+      soapObject = SOAPTool.json2soap(
+        options.name,
+        options.data,
+        options.prefix
+      );
+    } else if ($.isFunction(options.data)) {
+      // if data is function, the function should return a SOAPObject
+      soapObject = options.data.call(options.context, SOAPObject);
+    }
+    return soapObject;
+  },
+  encodeXmlValue: function (value) {
+    var encodedValue,
+      xmlCharMap = {
+        '<': '&lt;',
+        '>': '&gt;',
+        '&': '&amp;',
+        '"': '&quot;',
+        "'": '&apos;'
+      },
+      encodedValue;
+
+    encodedValue = value.replace(/[<>&"']/g, function (ch) {
+      return xmlCharMap[ch];
+    });
+    return encodedValue;
+  },
+  encodeXmlValueWithCDataCheck: function (value) {
+    // This function will only encode the parts within value that are not inside a CDATA section, allowing multiple usages of CDATA-blocks
+    //  ie. "encoding here <!CDATA[[ no encoding here ]]> encoding here <!CDATA[[ no encoding here ]]>"
+    var cdata = false,
+      valueArray = value.split(''),
+      encoded = [],
+      char;
+
+    for (var i = 0, j = valueArray.length; i < j; i++) {
+      switch (valueArray[i]) {
+        case '<':
+          if (cdata) {
+            encoded.push('<');
+          } else if (value.substr(i, 9) === '<![CDATA[') {
+            // if no CDATA section started, check if current char is part of CDATA start
+            encoded.push('<![CDATA[');
+            i += 8; // skip CDATA start chars
+            cdata = true;
+          } else {
+            encoded.push('&lt;');
+          }
+          break;
+
+        case ']':
+          if (cdata && value.substr(i, 3) === ']]>') {
+            // if CDATA section started, check if current char is part of CDATA end
+            encoded.push(']]>');
+            i += 2; // skip CDATA end chars
+            cdata = false;
+          } else {
+            encoded.push(']');
+          }
+          break;
+
+        case '>':
+          encoded.push(cdata ? '>' : '&gt;');
+          break;
+        case '&':
+          encoded.push(cdata ? '&' : '&amp;');
+          break;
+        case '"':
+          encoded.push(cdata ? '"' : '&quot;');
+          break;
+        case "'":
+          encoded.push(cdata ? "'" : '&apos;');
+          break;
+        default:
+          encoded.push(valueArray[i]);
+      }
+    }
+    return encoded.join('');
+  },
+  json2soap: function (name, params, prefix, parentNode) {
+    var soapObject;
+    var childObject;
+    if (params === null) {
+      soapObject = new SOAPObject(prefix + name);
+      soapObject.attr('xsi:nil', 'true');
+    } else if (typeof params == 'object') {
+      // added by DT - check if object is in fact an Array and treat accordingly
+      if (params.constructor.toString().indexOf('Array') > -1) {
+        // type is array
+        for (var i = 0, len = params.length; i < len; i++) {
+          childObject = this.json2soap(name, params[i], prefix, parentNode);
+          parentNode.appendChild(childObject);
+        }
+      } else if (params.constructor.toString().indexOf('String') > -1) {
+        // type is string
+        // handle String objects as string primitive value
+        soapObject = new SOAPObject(prefix + name);
+        soapObject.val(params);
+      } else if (params.constructor.toString().indexOf('Date') > -1) {
+        // type is Date
+        // handle Date objects as ISO8601 formated value
+        soapObject = new SOAPObject(prefix + name);
+        soapObject.val(params.toISOString());
+      } else {
+        soapObject = new SOAPObject(prefix + name);
+        for (var y in params) {
+          childObject = this.json2soap(y, params[y], prefix, soapObject);
+          if (childObject) {
+            soapObject.appendChild(childObject);
+          }
+        }
+      }
+    } else if (typeof params == 'boolean') {
+      soapObject = new SOAPObject(prefix + name);
+      soapObject.val(params ? 'true' : 'false');
+    } else {
+      soapObject = new SOAPObject(prefix + name);
+      soapObject.val(params);
+    }
+    return soapObject;
+  },
+  dom2soap: function (xmldom) {
+    var whitespace = /^\s+$/,
+      soapObject = new SOAPObject(xmldom.nodeName),
+      len;
+
+    len = xmldom.attributes.length;
+    for (var i = 0; i < len; i++) {
+      var attribute = xmldom.attributes[i];
+      soapObject.attr(attribute.name, attribute.value);
+    }
+    len = xmldom.childNodes.length;
+    for (var j = 0; j < len; j++) {
+      var child = xmldom.childNodes[j];
+      if (child.nodeType === 1) {
+        var childObject = SOAPTool.dom2soap(child);
+        soapObject.appendChild(childObject);
+      }
+      if (child.nodeType === 3 && !whitespace.test(child.nodeValue)) {
+        soapObject.val(child.nodeValue);
+      }
+      if (child.nodeType === 4) {
+        soapObject.val('<![CDATA[' + child.nodeValue + ']]>');
+      }
+    }
+    return soapObject;
+  },
+  array2soap: function (options) {
+    soapObject = new SOAPObject(options.name);
+    for (var index = 0, len = options.data.length; index < len; index++) {
+      if ($.isArray(options.data[index])) {
+        var new_item = soapObject.newChild('soapenc:Array');
+        new_item.attr(
+          'soapenc:arrayType',
+          'xsd:string[' + options.data[index].length + ']'
+        );
+        for (
+          var item = 0, len2 = options.data[index].length;
+          item < len2;
+          item++
+        ) {
+          new_item
+            .newChild('item')
+            .attr('type', 'xsd:string')
+            .val(options.data[index][item])
+            .end();
+        }
+      } else {
+        soapObject
+          .newChild('c-gensym' + index)
+          .attr('type', 'xsd:string')
+          .val(options.data[index])
+          .end();
+      }
+    }
+    return soapObject;
+  },
+  dom2string: function (dom) {
+    if (typeof XMLSerializer !== 'undefined') {
+      return new window.XMLSerializer().serializeToString(dom);
+    } else {
+      return dom.xml;
+    }
+  },
+  createWSS: function (wssValues) {
+    if (!!wssValues.username && !!wssValues.password) {
+      var wssConst = {
+        security: 'wsse:Security',
+        securityNS:
+          'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd',
+        usernameToken: 'wsse:UsernameToken',
+        usernameTokenNS:
+          'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd',
+        username: 'wsse:Username',
+        usernameType:
+          'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd',
+        password: 'wsse:Password',
+        passwordType:
+          'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText',
+        nonce: 'wsse:Nonce',
+        nonceType:
+          'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd',
+        wsuCreated: 'wsu:Created',
+        wsuCreatedType:
+          'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd'
+      };
+      var WSSObj = new SOAPObject(wssConst.security)
+        .addNamespace('wsse', wssConst.securityNS)
+        .addNamespace('wsu', wssConst.usernameTokenNS)
+        .newChild(wssConst.usernameToken)
+        .newChild(wssConst.username)
+        .attr('Type', wssConst.usernameType)
+        .val(wssValues.username)
+        .end()
+        .newChild(wssConst.password)
+        .attr('Type', wssConst.passwordType)
+        .val(wssValues.password)
+        .end()
+        .end();
+      var userTokenObj = WSSObj.find(wssConst.usernameToken);
+      if (wssValues.nonce) {
+        userTokenObj
+          .newChild(wssConst.nonce)
+          .attr('Type', wssConst.nonceType)
+          .val(wssValues.nonce);
+      }
+      if (wssValues.created) {
+        userTokenObj
+          .newChild(wssConst.wsuCreated)
+          .attr('Type', wssConst.wsuCreatedType)
+          .val(wssValues.created);
+      }
+      return WSSObj;
+    }
+  },
+  fallbackDeprecated: function (config) {
+    // fallbacks for changed properties: (the old names will deprecate at version 2.0.0!)
+    var deprecated = {
+      // usage -> oldParam: 'newParam'
+      namespaceUrl: 'namespaceURL',
+      request: 'beforeSend',
+      params: 'data'
+    };
+    for (var oldParam in deprecated) {
+      var newParam = deprecated[oldParam];
+      if (!config[newParam] && !!config[oldParam]) {
+        warn(
+          'jquery.soap: ' +
+            oldParam +
+            ' is deprecated, use ' +
+            newParam +
+            ' instead!'
+        );
+        config[newParam] = config[oldParam];
+        delete config[oldParam];
+      }
+    }
+  }
+};
+function log() {
+  if (enableLogging && typeof console === 'object') {
+    if ($.isFunction(console.log)) {
+      if (arguments.length == 1) {
+        console.log(arguments[0]);
+      } else {
+        console.log(arguments);
+      }
+    }
+  }
+}
+function warn() {
+  if (typeof console === 'object') {
+    if ($.isFunction(console.warn)) {
+      if (arguments.length == 1) {
+        console.warn(arguments[0]);
+      } else {
+        console.warn(arguments);
+      }
+    }
+  }
+}
+$.soap = soap;
diff --git a/src/lib/jquery.xml2json.js b/src/lib/jquery.xml2json.js
new file mode 100644
index 0000000..1f15cfb
--- /dev/null
+++ b/src/lib/jquery.xml2json.js
@@ -0,0 +1,200 @@
+/*
+ ### jQuery XML to JSON Plugin v1.3 - 2013-02-18 ###
+    * https://www.fyneworks.com/ - diego@fyneworks.com
+	* Licensed under http://en.wikipedia.org/wiki/MIT_License
+ ###
+ Website: http://www.fyneworks.com/jquery/xml-to-json/
+*/ /*
+ # INSPIRED BY: http://www.terracoder.com/
+           AND: http://www.thomasfrank.se/xml_to_json.html
+											AND: http://www.kawa.net/works/js/xml/objtree-e.html
+*/ /*
+ This simple script converts XML (document of code) into a JSON object. It is the combination of 2
+ 'xml to json' great parsers (see below) which allows for both 'simple' and 'extended' parsing modes.
+*/
+import $ from 'jquery';
+// Avoid collisions
+
+// Add function to jQuery namespace
+$.extend({
+  // converts xml documents and xml text to json object
+  xml2json: function (xml, extended) {
+    if (!xml) return {}; // quick fail
+
+    //### PARSER LIBRARY
+    // Core function
+    function parseXML(node, simple) {
+      if (!node) return null;
+      var txt = '',
+        obj = null,
+        att = null;
+      var nt = node.nodeType,
+        nn = jsVar(node.localName || node.nodeName);
+      var nv = node.text || node.nodeValue || '';
+      /*DBG*/ //if(window.console) console.log(['x2j',nn,nt,nv.length+' bytes']);
+      if (node.childNodes) {
+        if (node.childNodes.length > 0) {
+          /*DBG*/ //if(window.console) console.log(['x2j',nn,'CHILDREN',node.childNodes]);
+          $.each(node.childNodes, function (n, cn) {
+            var cnt = cn.nodeType,
+              cnn = jsVar(cn.localName || cn.nodeName);
+            var cnv = cn.text || cn.nodeValue || '';
+            /*DBG*/ //if(window.console) console.log(['x2j',nn,'node>a',cnn,cnt,cnv]);
+            if (cnt == 8) {
+              /*DBG*/ //if(window.console) console.log(['x2j',nn,'node>b',cnn,'COMMENT (ignore)']);
+              return; // ignore comment node
+            } else if (cnt == 3 || cnt == 4 || !cnn) {
+              // ignore white-space in between tags
+              if (cnv.match(/^\s+$/)) {
+                /*DBG*/ //if(window.console) console.log(['x2j',nn,'node>c',cnn,'WHITE-SPACE (ignore)']);
+                return;
+              }
+              /*DBG*/ //if(window.console) console.log(['x2j',nn,'node>d',cnn,'TEXT']);
+              txt += cnv.replace(/^\s+/, '').replace(/\s+$/, '');
+              // make sure we ditch trailing spaces from markup
+            } else {
+              /*DBG*/ //if(window.console) console.log(['x2j',nn,'node>e',cnn,'OBJECT']);
+              obj = obj || {};
+              if (obj[cnn]) {
+                /*DBG*/ //if(window.console) console.log(['x2j',nn,'node>f',cnn,'ARRAY']);
+
+                // http://forum.jquery.com/topic/jquery-jquery-xml2json-problems-when-siblings-of-the-same-tagname-only-have-a-textnode-as-a-child
+                if (!obj[cnn].length) obj[cnn] = myArr(obj[cnn]);
+                obj[cnn] = myArr(obj[cnn]);
+
+                obj[cnn][obj[cnn].length] = parseXML(cn, true /* simple */);
+                obj[cnn].length = obj[cnn].length;
+              } else {
+                /*DBG*/ //if(window.console) console.log(['x2j',nn,'node>g',cnn,'dig deeper...']);
+                obj[cnn] = parseXML(cn);
+              }
+            }
+          });
+        } //node.childNodes.length>0
+      } //node.childNodes
+      if (node.attributes) {
+        if (node.attributes.length > 0) {
+          /*DBG*/ //if(window.console) console.log(['x2j',nn,'ATTRIBUTES',node.attributes])
+          att = {};
+          obj = obj || {};
+          $.each(node.attributes, function (a, at) {
+            var atn = jsVar(at.name),
+              atv = at.value;
+            att[atn] = atv;
+            if (obj[atn]) {
+              /*DBG*/ //if(window.console) console.log(['x2j',nn,'attr>',atn,'ARRAY']);
+
+              // http://forum.jquery.com/topic/jquery-jquery-xml2json-problems-when-siblings-of-the-same-tagname-only-have-a-textnode-as-a-child
+              //if(!obj[atn].length) obj[atn] = myArr(obj[atn]);//[ obj[ atn ] ];
+              obj[cnn] = myArr(obj[cnn]);
+
+              obj[atn][obj[atn].length] = atv;
+              obj[atn].length = obj[atn].length;
+            } else {
+              /*DBG*/ //if(window.console) console.log(['x2j',nn,'attr>',atn,'TEXT']);
+              obj[atn] = atv;
+            }
+          });
+          //obj['attributes'] = att;
+        } //node.attributes.length>0
+      } //node.attributes
+      if (obj) {
+        obj = $.extend(
+          txt != '' ? new String(txt) : {},
+          /* {text:txt},*/ obj || {} /*, att || {}*/
+        );
+        //txt = (obj.text) ? (typeof(obj.text)=='object' ? obj.text : [obj.text || '']).concat([txt]) : txt;
+        txt = obj.text ? [obj.text || ''].concat([txt]) : txt;
+        if (txt) obj.text = txt;
+        txt = '';
+      }
+      var out = obj || txt;
+      //console.log([extended, simple, out]);
+      if (extended) {
+        if (txt) out = {}; //new String(out);
+        txt = out.text || txt || '';
+        if (txt) out.text = txt;
+        if (!simple) out = myArr(out);
+      }
+      return out;
+    } // parseXML
+    // Core Function End
+    // Utility functions
+    var jsVar = function (s) {
+      return String(s || '').replace(/-/g, '_');
+    };
+
+    // NEW isNum function: 01/09/2010
+    // Thanks to Emile Grau, GigaTecnologies S.L., www.gigatransfer.com, www.mygigamail.com
+    function isNum(s) {
+      // based on utility function isNum from xml2json plugin (http://www.fyneworks.com/ - diego@fyneworks.com)
+      // few bugs corrected from original function :
+      // - syntax error : regexp.test(string) instead of string.test(reg)
+      // - regexp modified to accept  comma as decimal mark (latin syntax : 25,24 )
+      // - regexp modified to reject if no number before decimal mark  : ".7" is not accepted
+      // - string is "trimmed", allowing to accept space at the beginning and end of string
+      var regexp = /^((-)?([0-9]+)(([\.\,]{0,1})([0-9]+))?$)/;
+      return (
+        typeof s == 'number' ||
+        regexp.test(String(s && typeof s == 'string' ? jQuery.trim(s) : ''))
+      );
+    }
+    // OLD isNum function: (for reference only)
+    //var isNum = function(s){ return (typeof s == "number") || String((s && typeof s == "string") ? s : '').test(/^((-)?([0-9]*)((\.{0,1})([0-9]+))?$)/); };
+
+    var myArr = function (o) {
+      // http://forum.jquery.com/topic/jquery-jquery-xml2json-problems-when-siblings-of-the-same-tagname-only-have-a-textnode-as-a-child
+      //if(!o.length) o = [ o ]; o.length=o.length;
+      if (!$.isArray(o)) o = [o];
+      o.length = o.length;
+
+      // here is where you can attach additional functionality, such as searching and sorting...
+      return o;
+    };
+    // Utility functions End
+    //### PARSER LIBRARY END
+
+    // Convert plain text to xml
+    if (typeof xml == 'string') xml = $.text2xml(xml);
+
+    // Quick fail if not xml (or if this is a node)
+    if (!xml.nodeType) return;
+    if (xml.nodeType == 3 || xml.nodeType == 4) return xml.nodeValue;
+
+    // Find xml root node
+    var root = xml.nodeType == 9 ? xml.documentElement : xml;
+
+    // Convert xml to json
+    var out = parseXML(root, true /* simple */);
+
+    // Clean-up memory
+    xml = null;
+    root = null;
+
+    // Send output
+    return out;
+  },
+
+  // Convert text to XML DOM
+  text2xml: function (str) {
+    // NOTE: I'd like to use jQuery for this, but jQuery makes all tags uppercase
+    //return $(xml)[0];
+
+    /* prior to jquery 1.9 */
+    /*
+    var out;
+    try{
+     var xml = ((!$.support.opacity && !$.support.style))?new ActiveXObject("Microsoft.XMLDOM"):new DOMParser();
+     xml.async = false;
+    }catch(e){ throw new Error("XML Parser could not be instantiated") };
+    try{
+     if((!$.support.opacity && !$.support.style)) out = (xml.loadXML(str))?xml:false;
+     else out = xml.parseFromString(str, "text/xml");
+    }catch(e){ throw new Error("Error parsing XML string") };
+    return out;
+    */
+
+    /* jquery 1.9+ */
+    return $.parseXML(str);
+  }
+}); // extend $
diff --git a/src/model/Factor.js b/src/model/Factor.js
index f142012..354a585 100644
--- a/src/model/Factor.js
+++ b/src/model/Factor.js
@@ -1,6 +1,7 @@
 import { Legend } from './Legend';
 
 const _hMap = {
+  19: [0, 1000], //NO
   1: [0, 1000], //NO2
   2: [0, 2000], //CO
   3: [0, 1000], //H2S
diff --git a/src/model/FactorDatas.js b/src/model/FactorDatas.js
index 58bc5a8..d3c2c1a 100644
--- a/src/model/FactorDatas.js
+++ b/src/model/FactorDatas.js
@@ -47,6 +47,9 @@
         }]
         */
   setData: function (dataList, drawMode, callback) {
+    if (dataList.length == 0) {
+      return;
+    }
     this.clearData();
 
     dataList.forEach((d) => {
@@ -67,6 +70,10 @@
 
   // 鏂板涓�涓柊鏁版嵁
   addData: function (dataList, drawMode, callback) {
+    if (dataList.length == 0) {
+      return;
+    }
+
     var newGps = [];
     dataList.forEach((data) => {
       this.times.push(data.time);
diff --git a/src/model/FrameAnimation.js b/src/model/FrameAnimation.js
index 4ef624d..211fa0f 100644
--- a/src/model/FrameAnimation.js
+++ b/src/model/FrameAnimation.js
@@ -17,7 +17,7 @@
 
   this.isPause = false;
   this.isRunning = false;
-  this.isStop = false;
+  this.isStop = true;
   // 鏄惁寮�鍚姩鎬佺粯鍒堕�熷害
   this.dynamicSpeed = false;
   // 姣忎釜浠诲姟鑰楁椂锛堢锛�
@@ -28,13 +28,13 @@
 
 FrameAnimation.prototype = {
   start: function () {
-    if (this.intervalFlag != undefined) {
-      this.isPause = false;
-      this.isStop = false;
-    } else {
-      this.isRunning = true;
+    // 涓嶅瓨鍦ㄥ姩鐢讳换鍔℃椂閲嶆柊寮�濮嬶紝鍚﹀垯缁х画
+    if (this.intervalFlag == undefined) {
       this._doTask();
     }
+    this.isPause = false;
+    this.isStop = false;
+    this.isRunning = true;
   },
   /**
    * 鍔ㄦ�佸姩鐢婚�熷害
@@ -67,8 +67,11 @@
   },
   pause: function () {
     this.isPause = true;
+    this.isRunning = false;
   },
   stop: function () {
+    if (this.isStop) return;
+
     if (this.intervalFlag != undefined) {
       clearInterval(this.intervalFlag);
       this.intervalFlag = undefined;
diff --git a/src/model/Legend.js b/src/model/Legend.js
index 304934e..dffc4e0 100644
--- a/src/model/Legend.js
+++ b/src/model/Legend.js
@@ -8,6 +8,7 @@
 
   //鍚勭洃娴嬪洜瀛愭暟鎹垎绾э紙鏍囧噯锛�
   _legend_r: {
+    NO: [0, 100, 200, 700, 1200, 2340],
     NO2: [0, 100, 200, 700, 1200, 2340],
     CO: [0, 5, 10, 35, 60, 90],
     H2S: [0, 150, 500, 650, 800, 1600],
@@ -25,6 +26,14 @@
 
   //鍚勭洃娴嬪洜瀛愭暟鎹垎绾э紙鏍囧噯锛夊搴旈鑹�
   _legend_c: {
+    NO: [
+      [0, 0.89, 0, 0.75],
+      [1, 1, 0, 0.75],
+      [1, 0.49, 0, 0.75],
+      [1, 0, 0, 0.75],
+      [0.6, 0, 0.3, 0.75],
+      [0.49, 0, 0.14, 0.75]
+    ],
     NO2: [
       [0, 0.89, 0, 0.75],
       [1, 1, 0, 0.75],
diff --git a/src/router/index.js b/src/router/index.js
index 3587b77..1c06db5 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -6,7 +6,7 @@
   routes: [
     {
       path: '/',
-      redirect: '/index/hmode'
+      redirect: '/login'
     },
     // 鐧婚檰椤甸潰
     {
diff --git a/src/styles/elementUI.scss b/src/styles/elementUI.scss
index b3203b6..30ea08a 100644
--- a/src/styles/elementUI.scss
+++ b/src/styles/elementUI.scss
@@ -2,13 +2,8 @@
   // --el-text-color-regular: #ffffff;
 }
 
-.el-form-item {
-  margin-bottom: 0px;
-  margin-right: 8px !important;
-}
-
 .el-form-item__label {
-  color: white !important;
+  color: rgba(255, 255, 255, 0.849) !important;
 }
 
 // .el-radio {
diff --git a/src/test.xml b/src/test.xml
new file mode 100644
index 0000000..201fdee
--- /dev/null
+++ b/src/test.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <soap:Body>
+    <GetData>
+      <compUser>user1</compUser>
+      <compPassword>User1@jingan</compPassword>
+      <mn>TX105</mn>
+      <dtFrom>2024-08-07 10:00:00</dtFrom>
+      <dtTo>2024-08-07 10:00:59</dtTo>
+    </GetData>
+  </soap:Body>
+</soap:Envelope>
\ No newline at end of file
diff --git a/src/utils/chart/chart-option.js b/src/utils/chart/chart-option.js
index 06357e1..5ce5a26 100644
--- a/src/utils/chart/chart-option.js
+++ b/src/utils/chart/chart-option.js
@@ -48,6 +48,8 @@
     },
     xAxis: {
       name: '鏃堕棿',
+      nameLocation: 'middle',
+      nameGap: 30,
       data: _xAxis,
       axisLabel: {
         textStyle: {
@@ -74,7 +76,16 @@
       }
     },
     yAxis: {
-      name: '娴撳害(渭g/m鲁)',
+      name: '娴撳害(渭g/m鲁)/娓╁害(鈩�)/閫熷害(m/s)',
+      nameLocation: 'middle',
+      nameGap: 30,
+      // nameTruncate: {
+      //   maxWidth: 100,
+      //   ellipsis: '...'
+      // },
+      // nameTextStyle: {
+      //   color: 'red'
+      // },
       axisLabel: {
         textStyle: {
           fontSize: fontSize
diff --git a/src/utils/factor/data.js b/src/utils/factor/data.js
new file mode 100644
index 0000000..472ccbc
--- /dev/null
+++ b/src/utils/factor/data.js
@@ -0,0 +1,246 @@
+/**
+ * 鏁版嵁鑾峰彇绠$悊
+ */
+import '@/lib/jquery.xml2json';
+import 'jquery.soap';
+// import '@/lib/jquery.soap';
+import $ from 'jquery';
+import moment from 'moment';
+import monitorDataApi from '@/api/monitorDataApi';
+import { ElMessage } from 'element-plus';
+import { parseFloatNAN } from '@/utils/number';
+
+/**************************--鏈郴缁熷師濮嬭蛋鑸暟鎹幏鍙�--*********************************/
+/**
+ * 鑾峰彇鍘嗗彶鏁版嵁
+ * @param {Object} params
+ * @returns
+ */
+function fetchOriginHistoryData(params) {
+  return monitorDataApi.fetchHistroyData(params);
+}
+
+/**
+ * 鑾峰彇瀹炴椂鏈�鏂版暟鎹�
+ * @param {Object} params
+ * @returns
+ */
+function fetchOriginRealTimeData(params) {
+  return monitorDataApi.fetchNextData(params);
+}
+
+/**************************--绗笁鏂圭敵娆g幆淇濊蛋鑸暟鎹幏鍙�--*********************************/
+
+/**
+ * 鑾峰彇鐢虫鐜繚璧拌埅鏁版嵁
+ * @date 2024.8.16
+ * @param {Object} params
+ * @returns
+ */
+function fetchThirdPartyData(params) {
+  return new Promise((resolve, reject) => {
+    $.soap({
+      // url: 'http://180.169.129.106:9001/WebService.asmx',
+      url: 'http://114.215.109.124:8082/jingan/WebService.asmx',
+      method: 'GetData',
+      appendMethodToURL: false,
+      namespaceURL: 'http://tempuri.org/',
+      SOAPAction: 'http://tempuri.org/GetData',
+      data: params,
+      success: function (soapResponse) {
+        const json = $.xml2json(soapResponse.toString());
+        // console.log(json);
+        // todo 2024.8.16 鏁版嵁鏍煎紡杞崲
+        const res = json.Body.GetDataResponse.GetDataResult;
+        if (res.ReturnCode != '0') {
+          reject(soapResponse);
+          ElMessage({
+            message: res.ReturnMessage,
+            type: 'error'
+          });
+        } else if (typeof res.ListInfo != 'object') {
+          resolve({
+            success: true,
+            message: '璇锋眰鎴愬姛',
+            data: []
+          });
+          // reject(soapResponse);
+          ElMessage({
+            message: '鏆傛棤鏂扮洃娴嬫暟鎹�',
+            type: 'warning'
+          });
+        } else {
+          // 姝ゅ鏈変竴涓� $.xml2json 鏂规硶鐨勪竴涓壒鎬э紝褰撳瓧娈礑ataInfo涓彧鏈変竴涓�兼椂锛屾鏃禗ataInfo涓哄璞$被鍨嬶紝鑰岄潪鏁扮粍
+          if (res.ListInfo.DataInfo.length == undefined) {
+            res.ListInfo.DataInfo = [res.ListInfo.DataInfo];
+          }
+          const _res = res.ListInfo.DataInfo.map((value) => {
+            const _time = moment(value.PostTime).format('YYYY-MM-DD HH:mm:ss');
+            return {
+              deviceCode: params.mn,
+              lat: parseFloat(value.Lat),
+              lng: parseFloat(value.Lon),
+              time: _time,
+              values: [
+                {
+                  factorId: '19',
+                  factorName: 'NO',
+                  factorData: parseFloatNAN(value.NO)
+                },
+                {
+                  factorId: '1',
+                  factorName: 'NO2',
+                  factorData: parseFloatNAN(value.NO2)
+                },
+                {
+                  factorId: '2',
+                  factorName: 'CO',
+                  factorData: parseFloatNAN(value.CO) * 1000
+                },
+                {
+                  factorId: '6',
+                  factorName: 'PM25',
+                  factorData: parseFloatNAN(value.PM25)
+                },
+                {
+                  factorId: '7',
+                  factorName: 'PM10',
+                  factorData: parseFloatNAN(value.PM10)
+                },
+                {
+                  factorId: '8',
+                  factorName: 'TEMPERATURE',
+                  factorData: parseFloatNAN(value.Temperature)
+                },
+                {
+                  factorId: '14',
+                  factorName: 'VELOCITY',
+                  factorData: parseFloatNAN(value.Speed)
+                },
+                {
+                  factorId: '15',
+                  factorName: 'TIME',
+                  factorData: moment(_time).valueOf(),
+                  statusList: [_time]
+                },
+                {
+                  factorId: '16',
+                  factorName: 'WIND_SPEED',
+                  factorData: parseFloatNAN(value.WindSpeed)
+                },
+                {
+                  factorId: '17',
+                  factorName: 'WIND_DIRECTION',
+                  factorData: parseFloatNAN(value.WindDirection)
+                }
+              ]
+            };
+          });
+          resolve({
+            success: true,
+            message: '璇锋眰鎴愬姛',
+            data: _res
+          });
+        }
+      },
+      error: function (SOAPResponse) {
+        // show error
+        reject(SOAPResponse);
+        ElMessage({
+          message: '鏁版嵁鑾峰彇澶辫触',
+          type: 'error'
+        });
+      }
+    });
+  });
+}
+
+/**************************--瀵瑰鏆撮湶缁熶竴鎺ュ彛--*********************************/
+/**
+ * 鑾峰彇鍘嗗彶鏁版嵁
+ */
+function fetchHistoryData(params) {
+  if (import.meta.env.VITE_DATA_MODE == 'jingan') {
+    const _params = {
+      compUser: 'user1',
+      compPassword: 'User1@jingan',
+      mn: params.deviceCode,
+      dtFrom: params.startTime
+        ? params.startTime
+        : moment().subtract(6, 'm').format('YYYY-MM-DD HH:mm:ss'),
+      dtTo: params.endTime
+        ? params.endTime
+        : moment().format('YYYY-MM-DD HH:mm:ss')
+    };
+    return fetchThirdPartyData(_params);
+  } else {
+    return fetchOriginHistoryData(params);
+  }
+}
+
+var fetchingTask;
+var isFetching;
+/**
+ * 寮�鍚疄鏃舵暟鎹惊鐜幏鍙�
+ * @param {Object} params
+ */
+function startLoopFetchRealTimeData(onParam, callback) {
+  // 鏃堕棿闂撮殧
+  let interval;
+  // 鏁版嵁鑾峰彇鏂规硶
+  let fetchFun;
+  if (import.meta.env.VITE_DATA_MODE == 'jingan') {
+    //  璇ユ暟鎹紶杈撴渶浣庨棿闅斾负1鍒嗛挓锛屾瘡娆¤幏鍙栫粨鏉熸椂闂磋嚜鍔ㄨ皟鏁翠负寮�濮嬫椂闂寸殑1鍒嗛挓鍚�
+    fetchFun = fetchThirdPartyData;
+    interval = 60 * 1000;
+  } else {
+    fetchFun = fetchOriginRealTimeData;
+    interval = 10 * 1000;
+  }
+  // 寮�濮嬪惊鐜换鍔�
+  clearFetchingTask();
+  fetchingTask = setInterval(() => {
+    if (isFetching) {
+      return;
+    }
+    isFetching = true;
+    // 鍙傛暟
+    let _params;
+    if (typeof onParam === 'function') {
+      const params = onParam();
+      if (import.meta.env.VITE_DATA_MODE == 'jingan') {
+        _params = {
+          compUser: 'user1',
+          compPassword: 'User1@jingan',
+          mn: params.deviceCode,
+          dtFrom: params.updateTime,
+          dtTo: moment().format('YYYY-MM-DD HH:mm:ss')
+        };
+      } else {
+        _params = params;
+      }
+    }
+    fetchFun(_params)
+      .then((res) => {
+        if (typeof callback === 'function') {
+          callback(res);
+        }
+      })
+      .finally(() => {
+        isFetching = false;
+      });
+  }, interval);
+}
+
+/**
+ * 娓呯悊鍘嗗彶瀹炴椂鏁版嵁鑾峰彇浠诲姟
+ */
+function clearFetchingTask() {
+  if (fetchingTask) {
+    clearInterval(fetchingTask);
+    fetchingTask = undefined;
+    isFetching = false;
+  }
+}
+
+export { fetchHistoryData, startLoopFetchRealTimeData, clearFetchingTask };
diff --git a/src/utils/map/dialog.js b/src/utils/map/dialog.js
index 900ac0c..713af62 100644
--- a/src/utils/map/dialog.js
+++ b/src/utils/map/dialog.js
@@ -21,8 +21,9 @@
    * @param {*} onClose 鍏抽棴寮瑰嚭妗嗗洖璋�
    * @returns
    */
-  createInfoWindow(factorDatas, i, onClose) {
+  createInfoWindow(deviceCode, factorDatas, i, onClose) {
     let m = {
+      deviceCode: deviceCode,
       data: factorDatas,
       index: i,
       window: '',
@@ -76,9 +77,9 @@
     const time = marker.time;
     const factorList = marker.factorList;
     //瀹炰緥鍖栦俊鎭獥浣�
-    // var title = '<div>' + site.name + '</div>' + '<div class="sub-title">缂栧彿:' + site.code + '</div>',
-    var title = '',
-      content = '',
+    // var title = '<div class="time">缂栧彿:' + marker.deviceCode + '</div>';
+    var title = '缂栧彿:' + marker.deviceCode;
+    var content = '',
       tag = '';
 
     tag += "<div class='time'>" + '鏃堕棿: ' + time;
@@ -127,6 +128,7 @@
     var orderList = [
       'VOC',
       'H2S',
+      'NO',
       'NO2',
       'CO',
       'SO2',
@@ -139,7 +141,10 @@
       'WIND_DIRECTION'
     ];
     orderList.forEach((e) => {
-      content += _contents.get(e);
+      const c = _contents.get(e);
+      if (c != undefined) {
+        content += c;
+      }
     });
 
     // content +=
@@ -162,11 +167,12 @@
     var top_t = document.createElement('div');
     top_t.className = 'ff-border-top';
     var top_c = document.createElement('div');
-    top_c.className = 'ff-border-content flexbox flex-space-between';
+    top_c.className = 'text-clz ff-border-content flexbox flex-space-between';
 
     var titleD = document.createElement('div');
-    var closeX = document.createElement('i');
-    titleD.innerHTML = title;
+    var closeX = document.createElement('div');
+    $(titleD).text(title);
+    // titleD.className = 'time';
     closeX.className = 'text-close';
     $(closeX).attr('aria-hidden', 'true');
     $(closeX).text('X');
@@ -247,9 +253,9 @@
     return info;
   },
 
-  openNewWindow(factorDatas, i, onClose) {
+  openNewWindow(deviceCode, factorDatas, i, onClose) {
     if (!this.show) return;
-    const window = this.createInfoWindow(factorDatas, i, onClose);
+    const window = this.createInfoWindow(deviceCode, factorDatas, i, onClose);
     window.open(map, factorDatas.lnglats_GD[i]);
   },
 
diff --git a/src/utils/map/sector.js b/src/utils/map/sector.js
index de4a8b5..32a88e6 100644
--- a/src/utils/map/sector.js
+++ b/src/utils/map/sector.js
@@ -109,7 +109,7 @@
 
 function drawSectorMesh(sDeg, eDeg, lnglat, distance, distance2) {
   if (distance == 0 || distance2 == 0) {
-    return;
+    return false;
   }
   // eslint-disable-next-line no-undef
   var sector = new AMap.Object3D.Mesh();
@@ -167,6 +167,7 @@
   }
   object3Dlayer.add(sector);
   _sector = sector;
+  return true;
 }
 
 function drawTextMaker(list, list2, distance, distance2) {
@@ -247,13 +248,14 @@
    * @returns 鏁版嵁鍧愭爣鐐瑰拰鎵囧舰鏈�澶у崐寰�
    */
   drawSector(fDatas, i) {
-    if (_sector != undefined) {
-      this.clearSector();
-    }
+    this.clearSector();
     const { sDeg, eDeg, lnglat, distance, distance2, list, list2 } =
       sectorParams(fDatas, i);
-    drawSectorMesh(sDeg, eDeg, lnglat, distance, distance2);
-    drawElasticMarker(list, list2, distance, distance2);
+    if (drawSectorMesh(sDeg, eDeg, lnglat, distance, distance2)) {
+      // 褰撻閫熷ぇ浜�0缁樺埗浜嗘墖褰㈡椂锛屾墠缁樺埗瀵瑰簲鐨勮窛绂荤瓑鏂囨湰鏍囪
+      // drawElasticMarker(list, list2, distance, distance2);
+      drawTextMaker(list, list2, distance, distance2);
+    }
     return { p: lnglat, r: distance };
   },
 
@@ -266,7 +268,8 @@
     this.clearSectorMesh();
     const { sDeg, eDeg, lnglat, distance, distance2, list, list2 } =
       sectorParams(fDatas, i);
-    drawSectorMesh(sDeg, eDeg, lnglat, distance, distance2);
-    drawTextMaker(list, list2, distance, distance2);
+    if (drawSectorMesh(sDeg, eDeg, lnglat, distance, distance2)) {
+      drawTextMaker(list, list2, distance, distance2);
+    }
   }
 };
diff --git a/src/utils/number.js b/src/utils/number.js
new file mode 100644
index 0000000..4792e4c
--- /dev/null
+++ b/src/utils/number.js
@@ -0,0 +1,4 @@
+export function parseFloatNAN(t) {
+  const res = parseFloat(t);
+  return isNaN(res) ? 0 : res;
+}
diff --git a/src/views/LoginPage.vue b/src/views/LoginPage.vue
index ae1bd3e..e02c33d 100644
--- a/src/views/LoginPage.vue
+++ b/src/views/LoginPage.vue
@@ -1,9 +1,190 @@
 <template>
-  <div>LoginPage</div>
+  <div class="background">
+    <div class="title-content">椋炵窘澶ф皵鐜鏅鸿兘璧拌埅鐩戞祴绯荤粺</div>
+
+    <div class="flexbox flex-space-around">
+      <img :src="underwayPng" alt="璧拌埅鐩戞祴" class="img-1" />
+
+      <div class="input-box flexbox">
+        <div class="flexbox-col align-items" style="margin: auto">
+          <div class="flexbox-col input-content flex-space-between">
+            <el-form
+              :model="formObj"
+              ref="formRef"
+              :rules="rules"
+              label-position="top"
+            >
+              <el-form-item label="鐢ㄦ埛鍚�" prop="userName">
+                <el-input
+                  size="default"
+                  v-model="formObj.userName"
+                  placeholder="鐢ㄦ埛鍚�"
+                  style="width: 200px"
+                />
+              </el-form-item>
+              <el-form-item label="瀵嗙爜" prop="password">
+                <el-input
+                  size="default"
+                  type="password"
+                  show-password
+                  v-model="formObj.password"
+                  placeholder="瀵嗙爜"
+                  style="width: 200px"
+                />
+              </el-form-item>
+            </el-form>
+          </div>
+          <div class="btn-login" @click="login">鐧诲綍</div>
+        </div>
+      </div>
+    </div>
+  </div>
 </template>
 
 <script>
+import underwayPng from '@/assets/mipmap/underway-2.png';
+import { ElMessage } from 'element-plus';
+
 export default {
-  name: 'LoginPage'
+  data() {
+    return {
+      underwayPng: underwayPng,
+      formObj: {},
+      rules: {
+        userName: [
+          {
+            required: true,
+            message: '璇疯緭鍏ョ敤鎴峰悕',
+            trigger: 'blur'
+          }
+        ],
+        password: [
+          {
+            required: true,
+            message: '璇疯緭鍏ュ瘑鐮�',
+            trigger: 'blur'
+          }
+        ]
+      }
+    };
+  },
+  methods: {
+    login() {
+      this.$refs.formRef.validate((valid) => {
+        if (valid) {
+          if (
+            this.formObj.userName == 'jingan' &&
+            this.formObj.password == 'jingan123'
+          ) {
+            this.$router.replace('/index/hmode');
+          } else {
+            ElMessage({
+              message: '鐢ㄦ埛鍚嶆垨瀵嗙爜閿欒',
+              type: 'error'
+            });
+          }
+        }
+      });
+    }
+  }
 };
 </script>
+<style scoped>
+.background {
+  background-color: #002378;
+  position: absolute;
+  left: 0;
+  top: 0;
+  bottom: 0;
+  width: 100%;
+  height: 100%;
+  min-height: 768px;
+  min-width: 1366px;
+}
+
+.title-content {
+  /* position: absolute; */
+  width: 100%;
+  height: 200px;
+  padding: 3vh 0 0 0;
+  /* top: 80px;
+    left: 0;
+    right: 0; */
+  color: white;
+  font-size: 1.4rem;
+  display: flex;
+  justify-content: center;
+  background-image: url('@/assets/mipmap/title_bg.png');
+  background-size: contain;
+  background-repeat: no-repeat;
+}
+
+.img-1 {
+  min-height: 500px;
+  height: 60vh;
+  /* margin-left: 6vw; */
+}
+
+.input-box {
+  width: 400px;
+  height: 420px;
+  /* background-color: aquamarine; */
+  background-image: url('@/assets/mipmap/border.png');
+  background-size: 100% 100%;
+  color: white;
+}
+
+.input-content {
+}
+
+.input-content .text-box {
+  width: 220px;
+  height: 28px;
+  font-size: 12px;
+  border-radius: 6px;
+}
+
+.btn-login {
+  margin-top: 20px;
+  border-radius: 6px;
+  padding: 8px 60px;
+  box-shadow: 10px 10px 10px rgba(39, 39, 39, 0.473);
+  background: -moz-linear-gradient(
+    left,
+    rgb(109, 213, 231),
+    rgb(80, 166, 202),
+    rgb(65, 141, 186),
+    rgb(33, 90, 154),
+    rgb(13, 56, 133),
+    rgb(11, 53, 131)
+  );
+  background: -ms-linear-gradient(
+    left,
+    rgb(109, 213, 231),
+    rgb(80, 166, 202),
+    rgb(65, 141, 186),
+    rgb(33, 90, 154),
+    rgb(13, 56, 133),
+    rgb(11, 53, 131)
+  );
+  background: -o-linear-gradient(
+    left,
+    rgb(109, 213, 231),
+    rgb(80, 166, 202),
+    rgb(65, 141, 186),
+    rgb(33, 90, 154),
+    rgb(13, 56, 133),
+    rgb(11, 53, 131)
+  );
+  background: -webkit-linear-gradient(
+    left,
+    rgb(109, 213, 231),
+    rgb(80, 166, 202),
+    rgb(65, 141, 186),
+    rgb(33, 90, 154),
+    rgb(13, 56, 133),
+    rgb(11, 53, 131)
+  );
+  cursor: pointer;
+}
+</style>
diff --git a/src/views/historymode/HistoryMode copy.vue b/src/views/historymode/HistoryMode copy.vue
new file mode 100644
index 0000000..9421a94
--- /dev/null
+++ b/src/views/historymode/HistoryMode copy.vue
@@ -0,0 +1,237 @@
+<template>
+  <div class="p-events-none m-t-2">
+    <el-row justify="center" align="middle" class="top-wrap">
+      <SearchBar
+        v-show="status == 0"
+        :search-time="searchTime"
+        :loading="loading"
+        @search="fetchHistroyData"
+      ></SearchBar>
+      <TrajectoryState v-show="status != 0" :status="status"></TrajectoryState>
+    </el-row>
+    <el-row class="m-t-2">
+      <FactorRadio
+        :device-type="deviceType"
+        @change="(e) => (factorType = e)"
+      ></FactorRadio>
+    </el-row>
+    <el-row class="m-t-2">
+      <FactorLegend
+        class="m-t-2"
+        :factor="factorDatas.factor[factorType]"
+      ></FactorLegend>
+    </el-row>
+    <el-row class="historical" justify="center">
+      <HistoricalTrajectory
+        :factor-datas="factorDatas"
+        :factor-type="factorType"
+        @change="(e) => (status = e)"
+        @stop="draw"
+      ></HistoricalTrajectory>
+    </el-row>
+    <TrendAnalysis
+      class="trend-analysis"
+      :locate-index="locateIndex"
+      @chart-click="handelIndexChange"
+      :factor-datas="factorDatas"
+      :device-type="deviceType"
+    ></TrendAnalysis>
+    <DataSheet
+      class="data-sheet"
+      :locate-index="locateIndex"
+      @table-click="handelIndexChange"
+      :factor-datas="factorDatas"
+      :device-type="deviceType"
+    ></DataSheet>
+  </div>
+</template>
+
+<script>
+import Layer from '@/utils/map/3dLayer';
+import marks from '@/utils/map/marks';
+import sector from '@/utils/map/sector';
+import mapUtil from '@/utils/map/util';
+import { DialogUtil } from '@/utils/map/dialog';
+import monitorDataApi from '@/api/monitorDataApi';
+import { useFetchData } from '@/composables/fetchData';
+import moment from 'moment';
+import { TYPE0 } from '@/constant/device-type';
+import { FactorDatas } from '@/model/FactorDatas';
+import TrendAnalysis from './component/TrendAnalysis.vue';
+import DataSheet from './component/DataSheet.vue';
+import { ElMessageBox, ElNotification, ElMessage } from 'element-plus';
+
+export default {
+  components: { TrendAnalysis, DataSheet },
+  setup() {
+    const { loading, fetchData } = useFetchData(10000);
+    return { loading, fetchData };
+  },
+  data() {
+    return {
+      // 鐩戞祴璁惧绫诲瀷
+      deviceType: TYPE0,
+      // 鐩戞祴鍥犲瓙鐨勭被鍨嬬紪鍙�
+      factorType: '1',
+      // 鐩戞祴鏁版嵁
+      factorDatas: new FactorDatas(),
+      // 鍐冲畾缁樺埗3D鍥惧舰鏃舵槸鍚︿笌鍘熷浘鍍忓悎骞�
+      merge: false,
+      // 鍐冲畾缁樺埗瀹�3D鍥惧舰鍚庡湴鍥捐瑙掓槸鍚﹁嚜鍔ㄥ洖涓�
+      setCenter: true,
+      // 缁樺埗妯″紡锛�0锛氳嚜鍔ㄦā寮忥紝鑷姩璁$畻褰撳墠鏁版嵁鐨勮寖鍥达紝缁樺埗鍚堥�傜殑姣斾緥锛�1锛氭墜鍔ㄦā寮忥紝鏍规嵁椤甸潰璁剧疆鐨勭粯鍥捐寖鍥磋繘琛岀粯鍒�
+      drawMode: 0,
+      searchTime: [],
+      // 褰撳墠閫変腑楂樹寒鐨勬暟鎹偣绱㈠紩
+      locateIndex: undefined,
+      // 杞ㄨ抗鍔ㄧ敾鐘舵��
+      status: 0
+    };
+  },
+  watch: {
+    factorType(nValue, oValue) {
+      if (nValue != oValue && this.status == 0) {
+        this.draw();
+      }
+    }
+  },
+  methods: {
+    // 妫�鏌ユ暟鎹粡绾害鏄惁鍚堟硶
+    checkDataIsValid(index) {
+      const lnglats_GD = this.factorDatas.lnglats_GD[index];
+      const time = this.factorDatas.times[index];
+      if (lnglats_GD[0] == 0 && lnglats_GD[1] == 0) {
+        ElMessage({
+          message: `${time}鐨勬暟鎹粡绾害鏃犳晥`,
+          type: 'warning'
+        });
+        return false;
+      } else {
+        this.locateIndex = index;
+        return true;
+      }
+    },
+    // 鐩戝惉鎶樼嚎鍥惧拰琛ㄦ牸鐨勭偣鍑讳簨浠�
+    handelIndexChange(index) {
+      if (this.checkDataIsValid(index)) {
+        this.drawSector(index);
+      }
+    },
+    draw() {
+      // 鍒锋柊鍥句緥
+      const factor = this.factorDatas.factor[this.factorType];
+      sector.clearSector();
+      this.drawRoadMap(factor);
+      this.drawMassMarks(factor);
+    },
+    // 缁樺埗3D璧拌璺嚎鍥�
+    drawRoadMap(e) {
+      this.factorDatas.refreshHeight(this.factorType);
+
+      Layer.drawRoadMap(this.factorDatas, e, this.merge, this.setCenter);
+      // }
+    },
+    drawMassMarks(e) {
+      marks.drawMassMarks(this.factorDatas, e, (index) => {
+        // 鏌ヨ鑼冨洿鍐呯殑鐩戞祴绔欑偣
+        // SceneUtil.searchByCoordinate(lnglat[0], lnglat[1], distance);
+        if (this.checkDataIsValid(index)) {
+          this.drawSector(index);
+        }
+      });
+      // 璋冩暣鍦板浘瑙嗚
+      mapUtil.setBound(this.factorDatas.lnglats_GD);
+    },
+    drawSector(index) {
+      // 1. 缁樺埗鏂版墖褰㈠尯鍩�
+      const pr = sector.drawSector(this.factorDatas, index);
+      // 璋冩暣瑙嗚灞呬腑鏄剧ず
+      mapUtil.setFitSector(pr);
+      // 2. 缁樺埗瀵硅瘽妗�
+      DialogUtil.openNewWindow(this.factorDatas, index, () => {
+        // 绉婚櫎鎵囧舰鍖哄煙
+        sector.clearSector();
+      });
+    },
+    onFetchData(type, data) {
+      // todo 鏍规嵁璁惧绫诲瀷鍒囨崲鍦板浘鐩戞祴鍥犲瓙灞曠ず鍗曢�夋銆佹姌绾垮浘澶嶉�夋銆佹暟鎹〃鏍煎閫夋鐨勫洜瀛愮被鍨�
+      this.deviceType = type;
+      this.factorDatas.setData(data, this.drawMode, () => {
+        this.factorDatas.refreshHeight(this.factorType);
+        this.draw();
+      });
+    },
+    fetchHistroyData(option) {
+      const { deviceCode, type, timeArray } = option;
+      let startTime, endTime;
+      if (timeArray && timeArray.length == 2) {
+        startTime = moment(timeArray[0]).format('YYYY-MM-DD HH:mm:ss');
+        endTime = moment(timeArray[1]).format('YYYY-MM-DD HH:mm:ss');
+      }
+      this.fetchData((page, pageSize) => {
+        return monitorDataApi
+          .fetchHistroyData({
+            deviceCode,
+            startTime,
+            endTime,
+            page,
+            perPage: pageSize
+          })
+          .then((res) => this.onFetchData(type, res.data));
+      });
+    },
+    fetchRealTimeData() {
+      // fixme 2024.5.3 姝ゅ鍒濆鑾峰彇鐨勬暟鎹紝鍙傛暟搴旇鐢眘earchbar鍐冲畾锛屽悗缁慨鏀�
+      this.fetchData((page) => {
+        return monitorDataApi
+          .fetchHistroyData({
+            deviceCode: '0a0000000001',
+            // type: TYPE0,
+            page,
+            perPage: 100
+          })
+          .then((res) => {
+            if (res.data.length > 0) {
+              const s = new Date(res.data[0].time.replace(' ', 'T'));
+              const e = new Date(
+                res.data[res.data.length - 1].time.replace(' ', 'T')
+              );
+              this.searchTime = [s, e];
+            }
+            this.onFetchData(TYPE0, res.data);
+          });
+      });
+    }
+  },
+  mounted() {
+    this.fetchRealTimeData();
+  },
+  unmounted() {
+    mapUtil.clearMap();
+  }
+};
+</script>
+<style scoped>
+.top-wrap {
+  height: 40px;
+}
+
+.trend-analysis {
+  position: absolute;
+  left: 0;
+  bottom: 2px;
+}
+
+.data-sheet {
+  position: absolute;
+  right: 0;
+  top: 0;
+}
+
+.historical {
+  position: absolute;
+  bottom: 10px;
+  left: 0;
+  right: 0;
+}
+</style>
diff --git a/src/views/historymode/HistoryMode.vue b/src/views/historymode/HistoryMode.vue
index 9421a94..9df700d 100644
--- a/src/views/historymode/HistoryMode.vue
+++ b/src/views/historymode/HistoryMode.vue
@@ -52,14 +52,15 @@
 import sector from '@/utils/map/sector';
 import mapUtil from '@/utils/map/util';
 import { DialogUtil } from '@/utils/map/dialog';
-import monitorDataApi from '@/api/monitorDataApi';
 import { useFetchData } from '@/composables/fetchData';
 import moment from 'moment';
 import { TYPE0 } from '@/constant/device-type';
+import { radioOptions } from '@/constant/radio-options';
 import { FactorDatas } from '@/model/FactorDatas';
 import TrendAnalysis from './component/TrendAnalysis.vue';
 import DataSheet from './component/DataSheet.vue';
-import { ElMessageBox, ElNotification, ElMessage } from 'element-plus';
+import { ElMessage } from 'element-plus';
+import { fetchHistoryData } from '@/utils/factor/data';
 
 export default {
   components: { TrendAnalysis, DataSheet },
@@ -71,8 +72,10 @@
     return {
       // 鐩戞祴璁惧绫诲瀷
       deviceType: TYPE0,
+      // 鐩戞祴璁惧缂栧彿
+      deviceCode: '',
       // 鐩戞祴鍥犲瓙鐨勭被鍨嬬紪鍙�
-      factorType: '1',
+      factorType: radioOptions(TYPE0)[0].value,
       // 鐩戞祴鏁版嵁
       factorDatas: new FactorDatas(),
       // 鍐冲畾缁樺埗3D鍥惧舰鏃舵槸鍚︿笌鍘熷浘鍍忓悎骞�
@@ -146,9 +149,10 @@
       // 1. 缁樺埗鏂版墖褰㈠尯鍩�
       const pr = sector.drawSector(this.factorDatas, index);
       // 璋冩暣瑙嗚灞呬腑鏄剧ず
-      mapUtil.setFitSector(pr);
+      mapUtil.setCenter(pr.p);
+      // mapUtil.setFitSector(pr);
       // 2. 缁樺埗瀵硅瘽妗�
-      DialogUtil.openNewWindow(this.factorDatas, index, () => {
+      DialogUtil.openNewWindow(this.deviceCode, this.factorDatas, index, () => {
         // 绉婚櫎鎵囧舰鍖哄煙
         sector.clearSector();
       });
@@ -163,48 +167,45 @@
     },
     fetchHistroyData(option) {
       const { deviceCode, type, timeArray } = option;
+      this.deviceCode = deviceCode;
       let startTime, endTime;
       if (timeArray && timeArray.length == 2) {
         startTime = moment(timeArray[0]).format('YYYY-MM-DD HH:mm:ss');
         endTime = moment(timeArray[1]).format('YYYY-MM-DD HH:mm:ss');
       }
       this.fetchData((page, pageSize) => {
-        return monitorDataApi
-          .fetchHistroyData({
-            deviceCode,
-            startTime,
-            endTime,
-            page,
-            perPage: pageSize
-          })
-          .then((res) => this.onFetchData(type, res.data));
-      });
-    },
-    fetchRealTimeData() {
-      // fixme 2024.5.3 姝ゅ鍒濆鑾峰彇鐨勬暟鎹紝鍙傛暟搴旇鐢眘earchbar鍐冲畾锛屽悗缁慨鏀�
-      this.fetchData((page) => {
-        return monitorDataApi
-          .fetchHistroyData({
-            deviceCode: '0a0000000001',
-            // type: TYPE0,
-            page,
-            perPage: 100
-          })
-          .then((res) => {
-            if (res.data.length > 0) {
-              const s = new Date(res.data[0].time.replace(' ', 'T'));
-              const e = new Date(
-                res.data[res.data.length - 1].time.replace(' ', 'T')
-              );
-              this.searchTime = [s, e];
-            }
-            this.onFetchData(TYPE0, res.data);
-          });
+        return fetchHistoryData({
+          deviceCode,
+          startTime,
+          endTime,
+          page,
+          perPage: pageSize
+        }).then((res) => this.onFetchData(type, res.data));
       });
     }
+    // fetchRealTimeData() {
+    //   // fixme 2024.5.3 姝ゅ鍒濆鑾峰彇鐨勬暟鎹紝鍙傛暟搴旇鐢眘earchbar鍐冲畾锛屽悗缁慨鏀�
+    //   this.fetchData((page) => {
+    //     return fetchHistoryData({
+    //       deviceCode: '0a0000000001',
+    //       // type: TYPE0,
+    //       page,
+    //       perPage: 100
+    //     }).then((res) => {
+    //       if (res.data.length > 0) {
+    //         const s = new Date(res.data[0].time.replace(' ', 'T'));
+    //         const e = new Date(
+    //           res.data[res.data.length - 1].time.replace(' ', 'T')
+    //         );
+    //         this.searchTime = [s, e];
+    //       }
+    //       this.onFetchData(TYPE0, res.data);
+    //     });
+    //   });
+    // }
   },
   mounted() {
-    this.fetchRealTimeData();
+    // this.fetchRealTimeData();
   },
   unmounted() {
     mapUtil.clearMap();
diff --git a/src/views/historymode/component/DataSheet.vue b/src/views/historymode/component/DataSheet.vue
index 526c7cc..778d322 100644
--- a/src/views/historymode/component/DataSheet.vue
+++ b/src/views/historymode/component/DataSheet.vue
@@ -41,7 +41,7 @@
 <script>
 // import { toRefs } from 'vue';
 import { TYPE0 } from '@/constant/device-type';
-import { checkboxOptions } from '@/constant/checkbox-options';
+import { defaultFactorTypes } from '@/constant/checkbox-options';
 import { FactorDatas } from '@/model/FactorDatas';
 // import { useDefaultFactorType } from "../../../composables/defaultFactorType";
 
@@ -63,7 +63,7 @@
   },
   data() {
     return {
-      selectFactorType: this.defaultFactorTypes(),
+      selectFactorType: defaultFactorTypes(this.deviceType),
       show: false
     };
   },
@@ -71,21 +71,13 @@
   watch: {
     deviceType(nV, oV) {
       if (nV != oV) {
-        this.selectFactorType = this.defaultFactorTypes();
+        this.selectFactorType = defaultFactorTypes(nV);
       }
     }
   },
   methods: {
     handleTableClick(index) {
       this.$emit('tableClick', index);
-    },
-    defaultFactorTypes() {
-      const list = checkboxOptions(this.deviceType);
-      if (list.length > 3) {
-        return list.slice(0, 3).map((v) => v.value);
-      } else {
-        return list.map((v) => v.value);
-      }
     }
   }
 };
diff --git a/src/views/historymode/component/TrendAnalysis.vue b/src/views/historymode/component/TrendAnalysis.vue
index cc5205b..665305f 100644
--- a/src/views/historymode/component/TrendAnalysis.vue
+++ b/src/views/historymode/component/TrendAnalysis.vue
@@ -1,7 +1,7 @@
 <template>
   <el-row class="wrap">
     <Transition name="">
-      <el-col v-show="show" span="10">
+      <el-col v-show="show" span="10" class="wrap-left">
         <FactorCheckbox
           v-model="selectFactorType"
           :device-type="deviceType"
@@ -28,11 +28,14 @@
  * 鐩戞祴瑕佺礌瓒嬪娍鍒嗘瀽
  */
 import { FactorDatas } from '@/model/FactorDatas';
+import { defaultFactorTypes } from '@/constant/checkbox-options';
+import { TYPE0 } from '@/constant/device-type';
 
 export default {
   props: {
     deviceType: {
-      type: String
+      type: String,
+      default: TYPE0
     },
     factorDatas: FactorDatas,
     // 褰撳墠閫変腑楂樹寒鐨勬暟鎹偣绱㈠紩
@@ -40,11 +43,18 @@
   },
   data() {
     return {
-      selectFactorType: ['1'],
+      selectFactorType: defaultFactorTypes(this.deviceType, 1),
       show: true
     };
   },
   emits: ['chartClick'],
+  watch: {
+    deviceType(nV, oV) {
+      if (nV != oV) {
+        this.selectFactorType = defaultFactorTypes(nV, 1);
+      }
+    }
+  },
   methods: {
     handleChartClick(index) {
       this.$emit('chartClick', index);
@@ -59,6 +69,11 @@
   /* background-color: aliceblue; */
 }
 
+.wrap-left {
+  /* background-color: aliceblue; */
+  min-width: 600px;
+}
+
 .slide-fade-enter-active {
   transition: all 0.3s ease-out;
 }
diff --git a/src/views/realtimemode/RealtimeMode copy.vue b/src/views/realtimemode/RealtimeMode copy.vue
new file mode 100644
index 0000000..9c352f2
--- /dev/null
+++ b/src/views/realtimemode/RealtimeMode copy.vue
@@ -0,0 +1,186 @@
+<template>
+  <div class="p-events-none m-t-2">
+    <el-row justify="center" align="middle" class="top-wrap">
+      <DeviceChange @change="onDeviceChange"></DeviceChange>
+    </el-row>
+    <el-row class="m-t-2">
+      <FactorRadio
+        :device-type="deviceType"
+        @change="(e) => (factorType = e)"
+      ></FactorRadio>
+    </el-row>
+    <el-row class="m-t-2">
+      <FactorLegend
+        class="m-t-2"
+        :factor="factorDatas.factor[factorType]"
+      ></FactorLegend>
+    </el-row>
+    <DashBoard class="dash-board" :factor-datas="factorDatas"></DashBoard>
+    <RealTimeTrend
+      class="real-time-trend"
+      :factor-datas="factorDatas"
+      :device-type="deviceType"
+    ></RealTimeTrend>
+  </div>
+</template>
+
+<script>
+import { useFetchData } from '@/composables/fetchData';
+import { TYPE0 } from '@/constant/device-type';
+import { FactorDatas } from '@/model/FactorDatas';
+import monitorDataApi from '@/api/monitorDataApi';
+import DashBoard from './component/DashBoard.vue';
+import RealTimeTrend from './component/RealTimeTrend.vue';
+import DeviceChange from './component/DeviceChange.vue';
+import { realTimeMapAnimation } from '@/utils/map/animation';
+import { startLoopFetchRealTimeData } from '@/utils/factor/data';
+
+// const mapAnimation = new MapAnimation();
+
+export default {
+  components: { DashBoard, RealTimeTrend, DeviceChange },
+  setup() {
+    const { loading, fetchData } = useFetchData(10000);
+    return { loading, fetchData };
+  },
+  data() {
+    return {
+      // 鐩戞祴璁惧绫诲瀷
+      deviceType: TYPE0,
+      deviceCode: '0a0000000001',
+      // 鐩戞祴鍥犲瓙鐨勭被鍨嬬紪鍙�
+      factorType: '1',
+      // 鏂拌幏鍙栫殑鐩戞祴鏁版嵁
+      factorDatas: new FactorDatas(),
+      // 鍏ㄩ儴鐩戞祴鏁版嵁
+      allFactorDatas: new FactorDatas()
+    };
+  },
+  watch: {
+    factorType(nV, oV) {
+      if (nV != oV) {
+        realTimeMapAnimation.setFactorType(nV);
+      }
+    }
+  },
+  computed: {
+    latestTime() {
+      if (this.factorDatas.times.length == 0) {
+        return '';
+      } else {
+        return this.factorDatas.times[this.factorDatas.times.length - 1];
+      }
+    }
+  },
+  methods: {
+    onDeviceChange({ type, deviceCode }) {
+      this.deviceType = type;
+      this.deviceCode = deviceCode;
+      this.clearFetchingTask();
+      realTimeMapAnimation.stop();
+      this.allFactorDatas.clearData();
+      this.factorDatas.clearData();
+      this.notFirstFetch = false;
+      this.fetchRealTimeData();
+    },
+    onFetchData(data) {
+      // todo 鏍规嵁璁惧绫诲瀷鍒囨崲鍦板浘鐩戞祴鍥犲瓙灞曠ず鍗曢�夋銆佹姌绾垮浘澶嶉�夋銆佹暟鎹〃鏍煎閫夋鐨勫洜瀛愮被鍨�
+      // this.deviceType = type;
+      const fDatas = new FactorDatas();
+      fDatas.setData(data, this.drawMode, () => {
+        fDatas.refreshHeight(this.factorType);
+        // this.draw();
+        this.factorDatas = fDatas;
+      });
+    },
+    fetchRealTimeData() {
+      this.fetchData((page) => {
+        return monitorDataApi
+          .fetchHistroyData({
+            deviceCode: this.deviceCode,
+            // startTime: '2021-11-04 09:53:35',
+            page,
+            perPage: 100
+          })
+          .then((res) => {
+            this.onFetchData(res.data);
+            this.onMapData(res.data);
+            this.fetchNextData();
+          });
+      });
+    },
+    clearFetchingTask() {
+      if (this.fetchingTask) {
+        clearInterval(this.fetchingTask);
+        this.fetchingTask = undefined;
+      }
+    },
+    fetchNextData() {
+      this.clearFetchingTask();
+      this.fetchingTask = setInterval(() => {
+        if (this.isFetching) {
+          return;
+        }
+
+        this.isFetching = true;
+        this.fetchData(() => {
+          return monitorDataApi
+            .fetchNextData({
+              deviceCode: this.deviceCode,
+              updateTime: this.latestTime,
+              perPage: 10
+            })
+            .then((res) => {
+              this.onFetchData(res.data);
+              this.onMapData(res.data);
+            })
+            .finally(() => (this.isFetching = false));
+        });
+      }, 10000);
+    },
+    onMapData(dataList) {
+      let startIndex = this.allFactorDatas.length() - 1;
+      if (!this.notFirstFetch) {
+        startIndex = dataList.length - 2;
+        this.notFirstFetch = true;
+      }
+      startIndex = startIndex < 0 ? 0 : startIndex;
+      return new Promise((resolve, reject) => {
+        this.allFactorDatas.addData(dataList, this.drawMode, () => {
+          realTimeMapAnimation.moveAnimation(
+            this.allFactorDatas,
+            this.factorType,
+            startIndex
+          );
+        });
+      });
+    }
+  },
+  mounted() {
+    this.fetchRealTimeData();
+    // startLoopFetchRealTimeData({
+    //   compUser: 'user1',
+    //   compPassword: 'User1@jingan',
+    //   mn: 'TX105',
+    //   dtFrom: '2024-08-07 10:00:00',
+    //   dtTo: '2024-08-07 10:00:59'
+    // });
+  },
+  unmounted() {
+    this.clearFetchingTask();
+    realTimeMapAnimation.stop();
+  }
+};
+</script>
+<style scoped>
+.dash-board {
+  position: absolute;
+  left: 0;
+  bottom: 2px;
+}
+.real-time-trend {
+  position: absolute;
+  right: 0;
+  top: 0;
+}
+</style>
diff --git a/src/views/realtimemode/RealtimeMode.vue b/src/views/realtimemode/RealtimeMode.vue
index c4de517..f6ff253 100644
--- a/src/views/realtimemode/RealtimeMode.vue
+++ b/src/views/realtimemode/RealtimeMode.vue
@@ -25,14 +25,20 @@
 </template>
 
 <script>
+import moment from 'moment';
 import { useFetchData } from '@/composables/fetchData';
 import { TYPE0 } from '@/constant/device-type';
+import { radioOptions } from '@/constant/radio-options';
 import { FactorDatas } from '@/model/FactorDatas';
-import monitorDataApi from '@/api/monitorDataApi';
 import DashBoard from './component/DashBoard.vue';
 import RealTimeTrend from './component/RealTimeTrend.vue';
 import DeviceChange from './component/DeviceChange.vue';
 import { realTimeMapAnimation } from '@/utils/map/animation';
+import {
+  fetchHistoryData,
+  startLoopFetchRealTimeData,
+  clearFetchingTask
+} from '@/utils/factor/data';
 
 // const mapAnimation = new MapAnimation();
 
@@ -46,9 +52,9 @@
     return {
       // 鐩戞祴璁惧绫诲瀷
       deviceType: TYPE0,
-      deviceCode: '0a0000000001',
+      deviceCode: '',
       // 鐩戞祴鍥犲瓙鐨勭被鍨嬬紪鍙�
-      factorType: '1',
+      factorType: radioOptions(TYPE0)[0].value,
       // 鏂拌幏鍙栫殑鐩戞祴鏁版嵁
       factorDatas: new FactorDatas(),
       // 鍏ㄩ儴鐩戞祴鏁版嵁
@@ -63,11 +69,13 @@
     }
   },
   computed: {
+    // 鏁版嵁鏈�鏂版椂闂达紙鏈�鏂版暟鎹殑閲囨牱鏃堕棿鍔�1绉掞紱娌℃湁鏁版嵁鏃讹紝閲囩敤褰撳墠鏃堕棿鐨勫墠6鍒嗛挓锛�
     latestTime() {
       if (this.factorDatas.times.length == 0) {
-        return '';
+        return moment().subtract(6, 'm').format('YYYY-MM-DD HH:mm:ss');
       } else {
-        return this.factorDatas.times[this.factorDatas.times.length - 1];
+        const _time = this.factorDatas.times[this.factorDatas.times.length - 1];
+        return moment(_time).add(1, 's').format('YYYY-MM-DD HH:mm:ss');
       }
     }
   },
@@ -93,50 +101,40 @@
       });
     },
     fetchRealTimeData() {
-      // fixme 2024.5.3 姝ゅ鍒濆鑾峰彇鐨勬暟鎹紝鍙傛暟搴旇鐢眘earchbar鍐冲畾锛屽悗缁慨鏀�
       this.fetchData((page) => {
-        return monitorDataApi
-          .fetchHistroyData({
-            deviceCode: this.deviceCode,
-            // startTime: '2021-11-04 09:53:35',
-            page,
-            perPage: 100
-          })
-          .then((res) => {
-            this.onFetchData(res.data);
-            this.onMapData(res.data);
-            this.fetchNextData();
-          });
+        return fetchHistoryData({
+          deviceCode: this.deviceCode,
+          // startTime: '2024-08-20 06:00:00',
+          // endTime: '2024-08-20 06:02:00',
+          page,
+          perPage: 100
+        }).then((res) => {
+          this.onFetchData(res.data);
+          this.onMapData(res.data);
+          // if (res.data.length > 0) {
+          //   this.fetchNextData(res.data[res.data.length - 1].time);
+          // }
+          this.fetchNextData();
+        });
       });
     },
     clearFetchingTask() {
-      if (this.fetchingTask) {
-        clearInterval(this.fetchingTask);
-        this.fetchingTask = undefined;
-      }
+      clearFetchingTask();
     },
     fetchNextData() {
-      this.clearFetchingTask();
-      this.fetchingTask = setInterval(() => {
-        if (this.isFetching) {
-          return;
+      startLoopFetchRealTimeData(
+        () => {
+          return {
+            deviceCode: this.deviceCode,
+            updateTime: this.latestTime,
+            perPage: 10
+          };
+        },
+        (res) => {
+          this.onFetchData(res.data);
+          this.onMapData(res.data);
         }
-
-        this.isFetching = true;
-        this.fetchData(() => {
-          return monitorDataApi
-            .fetchNextData({
-              deviceCode: this.deviceCode,
-              updateTime: this.latestTime,
-              perPage: 10
-            })
-            .then((res) => {
-              this.onFetchData(res.data);
-              this.onMapData(res.data);
-            })
-            .finally(() => (this.isFetching = false));
-        });
-      }, 10000);
+      );
     },
     onMapData(dataList) {
       let startIndex = this.allFactorDatas.length() - 1;
@@ -157,12 +155,18 @@
     }
   },
   mounted() {
-    this.fetchRealTimeData();
+    // this.fetchRealTimeData();
+    // startLoopFetchRealTimeData({
+    //   compUser: 'user1',
+    //   compPassword: 'User1@jingan',
+    //   mn: 'TX105',
+    //   dtFrom: '2024-08-07 10:00:00',
+    //   dtTo: '2024-08-07 10:00:59'
+    // });
   },
   unmounted() {
     this.clearFetchingTask();
     realTimeMapAnimation.stop();
-    console.log('clear');
   }
 };
 </script>
diff --git a/src/views/realtimemode/component/DashBoard.vue b/src/views/realtimemode/component/DashBoard.vue
index 36078e4..30c87e6 100644
--- a/src/views/realtimemode/component/DashBoard.vue
+++ b/src/views/realtimemode/component/DashBoard.vue
@@ -46,8 +46,13 @@
   },
   methods: {
     getFactorData(factorDatas, index, key, scale = 10) {
-      let d = factorDatas.factor[key].datas[index].factorData;
-      return Math.round(d * scale) / scale;
+      const _factor = factorDatas.factor[key];
+      if (_factor != undefined) {
+        let d = _factor.datas[index].factorData;
+        return Math.round(d * scale) / scale;
+      } else {
+        return '--';
+      }
     },
     refresh(factorDatas, index) {
       this.temprature = this.getFactorData(factorDatas, index, '8') + '';
diff --git a/src/views/realtimemode/component/DeviceChange.vue b/src/views/realtimemode/component/DeviceChange.vue
index 3772b7d..4b78b7e 100644
--- a/src/views/realtimemode/component/DeviceChange.vue
+++ b/src/views/realtimemode/component/DeviceChange.vue
@@ -31,18 +31,22 @@
     handleClick() {
       this.$emit('change', this.formSearch);
     }
+  },
+  watch: {
+    // formSearch(nV, oV) {
+    //   if (nV != oV) {
+    //     this.handleChange(nV[0].value);
+    //   }
+    // }
+  },
+  mounted() {
+    this.$emit('change', this.formSearch);
   }
 };
 </script>
-<style lang="scss">
-.map-date-selector {
-  display: inline-block;
-  position: relative;
-  /* left: 0;
-      right: 0;
-      top: 0px; */
-  /* padding: 0 4px; */
-  /* color: ffffffbd; */
-  /* background-color: antiquewhite; */
+<style scoped lang="scss">
+.el-form-item {
+  margin-bottom: 0px;
+  margin-right: 8px !important;
 }
 </style>
diff --git a/src/views/realtimemode/component/RealTimeTrend.vue b/src/views/realtimemode/component/RealTimeTrend.vue
index f22411e..ecda9af 100644
--- a/src/views/realtimemode/component/RealTimeTrend.vue
+++ b/src/views/realtimemode/component/RealTimeTrend.vue
@@ -30,6 +30,7 @@
 </template>
 <script>
 import { TYPE0 } from '@/constant/device-type';
+import { defaultFactorTypes } from '@/constant/checkbox-options';
 import { FactorDatas } from '@/model/FactorDatas';
 
 export default {
@@ -44,7 +45,7 @@
   },
   data() {
     return {
-      selectFactorType: ['1', '2', '3'],
+      selectFactorType: defaultFactorTypes(this.deviceType),
       show: true
     };
   }

--
Gitblit v1.9.3